Điểm một trò chơi Bowling


25

Nhiệm vụ của bạn là tổng hợp và xuất điểm của một người chơi trong trò chơi bowling 10 chân sau tối đa 21 cuộn .

Các cuộn được biểu diễn dưới dạng một chuỗi các số nguyên trong phương thức nhập ưa thích của bạn . Mỗi số nguyên tương ứng với số lượng chân được hạ xuống trong cuộn đó.

Chấm điểm

Sau mỗi vòng , số lượng chân bị loại trong vòng đó được tính vào số điểm cuối cùng. Nếu một người chơi hạ gục tất cả mười chân trong vòng đầu tiên của vòng đấu, thì đây là một cuộc đình công và vòng đấu kết thúc. Nếu không, vòng kéo dài thêm một cuộn. Nếu cuộn thứ hai của một vòng làm đổ tất cả các chân còn lại, thì đây là phụ tùng .

Đối với mỗi lần tấn công, có một phần thưởng bằng tổng số chân được hạ xuống trong hai lần lăn tiếp theo. Đối với mỗi phụ tùng, có một phần thưởng bằng với số chân được hạ xuống trong cuộn tiếp theo.

Vòng thứ 10 và vòng chung kết, người chơi có thể được cấp thêm cuộn: Trong trường hợp bị tấn công, người chơi được thêm hai cuộn nữa để bù vào phần thưởng tấn công của mình. Trong trường hợp rảnh rỗi, người chơi được thêm một cuộn.

Ví dụ

Input: 4 3 8 2 7 1 10 7 3 0 10 2 2 10 10 5 4
Output: 131

Input: 10 10 9 1 7 3 2 7 10 1 9 10 7 1 10 10 10
Output: 183

Quy tắc

  • Bạn có thể cho rằng đầu vào là hợp lệ.
  • Theo nhận xét của Mego, tôi đã nới lỏng các yêu cầu cho các phương thức nhập / xuất để đáp ứng tiêu chuẩn hiện tại của chúng tôi .
  • Câu trả lời trong các ngôn ngữ mới hơn thử thách được cho phép
  • Mã ngắn nhất sẽ thắng!

Tôi có nhớ chính xác rằng tiền thưởng không được xếp chồng lên nhau không?
Tít

@Titus Tôi không chắc chính xác ý bạn là gì, nhưng không, phần thưởng không "xếp chồng", tức là, đối với một cuộc đình công, bạn thêm số lượng chân bị hạ gục trong hai lần lăn tiếp theo , bất kể chúng có bị đình công hay không hay không. Vì vậy, điểm tối đa cho một lần tấn công là 30 điểm và tối đa cho toàn bộ trò chơi là 300.
daniero

Do các đối số dòng lệnh riêng biệt đủ điều kiện là space separated integers?
Tít

1
@Titus chắc chắn. Đây là một bài viết cũ - Sự đồng thuận ngày nay về các phương thức nhập liệu được chấp nhận đã không được thiết lập tại thời điểm này. Trên thực tế, bây giờ tôi không thấy lý do tại sao tiêu chuẩn ngày nay không nên áp dụng cho điều này (bao gồm cả các tham số chức năng, v.v.), mặc dù tôi không phải là người thích thay đổi các quy tắc của thử thách một cách hồi tố.
daniero

1
@daniero Lời khuyên thông thường là việc chấp nhận nới lỏng các quy tắc để phù hợp với các tiêu chuẩn hiện đại, miễn là nó không thay đổi mạnh mẽ thách thức.
Mego

Câu trả lời:


6

GolfScript, 50 41 ký tự

~0]-1%~0{\.9>{+1$3$}{@+.9>3$*}if++}10*p];

Một nỗ lực khác trong GolfScript ( chạy trực tuyến ).

Một lời giải thích của mã sau đây. Giải pháp sử dụng tính chất ngăn xếp của vấn đề (tiêu thụ từng cuộn một) nhưng do đó, đầu vào phải được đảo ngược.

~0          # Take the input and evaluate to single numbers on the stack. Add zero.
]-1%~       # Reverse the stack (make array, reverse array, dump array)

0           # Start with a sum of zero
{           # Perform this block 10 times (once for each round)
  \         #   Take the next roll
  .9>{      #   If it is a strike
    +       #     Add the value of the roll to the sum
    1$3$    #     and duplicate top two members of the stack (i.e. next two rolls).
  }{        #   ... else ...
    @+      #     Take the next roll and add with first roll in round.
    .9>     #     Does this sum show a spare?
    3$*     #     Get next roll (potential bonus) and multiply with yes/no.
            #     Since we pushed an additional 0 in the beginning 
            #     there is a spare roll even for the last round.
  }if       #   endif
  ++        #   Add top three stack entries together
            #   (i.e. sum+2 bonus rolls for strike, sum+rolls+bonus else)
}10*        # Loop ten times

p];         # Sum is top of stack. Print sum and discard any leftover rolls.

Phiên bản trước:

~].1>.1>]zip{((.10<{@(0=@+@1>1$9><}*@}10*;]{+}.@**

5

Python, 116 110 105 103 100 99 ký tự

z=map(int,raw_input().split())
s=0
exec('s+=sum(z[:2+(z[0]+z[1]>9)]);z=z[2-(z[0]>9):];'*10)

Chi 30 ký tự cho đầu vào là vô cùng hấp dẫn. Gợi ý chào mừng.

Rất cám ơn Howard đã cải thiện.


Bạn có thể thay thế 1+(z[i]!=10)bằng 2-(z[i]>9)để tiết kiệm một char.
Howard

@Howard: Gợi ý tuyệt vời. Tôi đã kết hợp nó vào câu trả lời của tôi. Nó đã cứu hai nhân vật.
Steven Rumbalski

Và hai lần nữa nếu bạn xóa ihoàn toàn (đặt thành 0) và thay vì i+=...sử dụngz=z[2-(z[0]>9)::];
Howard

@Howard: Cảm ơn một lần nữa. Lưu ba ký tự.
Steven Rumbalski

Các tiêu chuẩn cho I / O nói chung linh hoạt hơn bây giờ vì vậy z=input()sẽ ổn (thực hiện một cách hiệu quả chuỗi đại diện của một danh sách ints và evaling nó). Tuy nhiên, các chương trình đầy đủ sẽ xuất ra ở đâu đó (tôi nghĩ đó cũng là trường hợp trước đó). Vì vậy, tôi tin rằng điều này có thể được thay đổi thành chương trình 78 byte này
Jonathan Allan

4

R, 101 byte

Tôi không chắc tại sao thử thách này bị va chạm, nhưng tôi thích nó, vì vậy tôi sẽ trả lời muộn.

f=function(x,s=0,c=10)`if`(c&length(x),f(x[-(0:(x[1]!=10)+1)],sum(x[1:(2+(sum(x[1:2])>9))])+s,c-1),s)

Hãy thử trực tuyến!

Ung dung:

f <- function(throws, score = 0, count = 10){
  if(count != 0 & length(throws) != 0){
    IsStrike <- throws[1] == 10
    IsStrikeOrSpare <- sum(throws[1:2]) >= 10
    f(throws[-c(1, 2 * !IsStrike)],
      score + sum(throws[c(1:(2 + IsStrikeOrSpare))]),
      count - 1)
  } else {
    return(score)
  }
}

Hàm đệ quy. Lấy xlàm đầu vào, giữ điểm số. Khởi tạo các slõi và cđếm số lượng vòng ném.

Câu lệnh if kiểm tra nếu 10 vòng được ném, hoặc nếu xtrống. Nếu đó là trường hợp, điểm số được trả lại. Khác chức năng sẽ gọi chính nó như sau:

Nó loại bỏ các cú ném từ x, bằng cách kiểm tra xem đó có phải là một cú đánh hay không. Nếu vậy, mục đầu tiên được loại bỏ, khác hai mục đầu tiên. (S=x[1]!=10)kiểm tra các cuộc đình công. Chúng tôi xóa -chỉ mục ( ) 0:S, trong đó Slà 1 nếu đó là một cuộc đình công và 0 nếu không. Và sau đó chúng tôi thêm một : -(0:(x[1]!=10)+1). Chúng tôi vượt qua rút ngắn xđể cuộc gọi tiếp theo.

Đối với điểm số, điều này được tìm thấy bằng cách lấy x[1:2]nếu đó là một lượt thông thường, và x[1:3]nếu đó là một cuộc đình công hoặc phụ tùng. Chúng tôi kiểm tra nếu sum(x[1:2])lớn hơn hoặc bằng 10. Nếu đó là một cuộc đình công, rõ ràng đây là trường hợp. Nếu nó là một phụ tùng, thì điều này cũng hoạt động. Vì vậy, nếu đây là TRUE, chúng tôi thêm x[3]vào tổng. Điều này sau đó được thêm vào s.


1

CoffeeScript ( 234 215 170)

z=(a)->b=(Number i for i in a.split(' ').reverse());t=0;(r=b.pop();l=b.length;if(9<r)then(t+=r;t+=b[l-1]+b[l-2];)else(f=r+b.pop();t+=f;(t+=b[l-2])if 9<f))for i in[0..9];t

EDIT : Một bản viết lại khổng lồ, không biết xấu hổ đạo văn cách tiếp cận dựa trên ngăn xếp tuyệt vời của Howard. Tôi tự tin hơn có thể bị loại bỏ để truy cập vào phần tử cuối cùng của mảng mà không phá hủy nó ...


1

Ruby, 252 byte

Chấp nhận đầu vào vào một mảng thêm tất cả các yếu tố trước, sau đó tìm kiếm phần thưởng dự phòng và đình công

s,p,t,r=0,0,1,1
o=ARGV
o.each_with_index do |m,n|
y=m.to_i
s+=y
if r<10
p+=y
if p==10&&t==1
r,p=(r+1),0
s+=o[n+1].to_i+o[n+2].to_i
elsif p<10&&t==1
t=2
elsif p<10&&t==2
t,p,r=1,0,(r+1)
elsif p==10&&t==2
t,p,r=1,0,(r+1)
s+=o[n+1].to_i
end end end
puts s

1

PHP, 82 byte

for($a=$argv;$r++<10;$i+=$p<10)$s+=(9<$q=$a[++$i+1]+$p=$a[$i])*$a[$i+2]+$q;echo$s;

lấy đầu vào từ các đối số dòng lệnh; chạy với -nrhoặc kiểm tra nó trực tuyến .

phá vỡ

for($a=$argv;       # import arguments
    $r++<10;        # loop through rounds
    $i+=$p<10)          # 6. if no strike, increment throw count again
    $s+=(9<
        $q=$a[++$i+1]+  # 1. increment throw count  2. $q=second throw plus
        $p=$a[$i]       # 3. $p=first throw
        )*$a[$i+2]      # 4. if $q>9 (strike or spare), add third throw to sum
    +$q;                # 5. add first and second throw to sum
echo$s;             # print sum


1

Thạch ,  36  35 byte

+\µi©⁵+Ị$ḂḤị;®×Ị¤¡-
;0Ç3ƤFṣ-m€2Fḣ⁵S

Một liên kết đơn âm chấp nhận danh sách các số nguyên và trả về một số nguyên.

Hãy thử trực tuyến!

Làm sao?

Tính số điểm của mỗi lần chạy chồng chéo của ba bát như thể nó là một điểm bắt đầu ở đầu khung và thêm vào một số nhận dạng đình công ( -1), làm phẳng danh sách kết quả này, tách nó ra khỏi số nhận dạng đình công, sau đó loại bỏ mọi kết quả thứ hai từ từng đoạn (loại bỏ điểm số của những lần chạy không thực sự bắt đầu khi bắt đầu khung).

Để phục vụ cho khung cuối cùng, số 0 trước tiên được thêm vào đầu vào (để cho phép cắt 3 khôn ngoan cho phép khung bắt đầu trên bát áp chót) và điểm số kết quả được rút ngắn đến mười đầu tiên (để loại bỏ ngay bây giờ có thể không có khung thứ 11) trước khi tóm tắt chúng.

+\µi©⁵+Ị$ḂḤị;®×Ị¤¡- - Link 1, threeBowlEvaluate: list, bowlScores
                    -               e.g. [0,4,6]   [9,1,10]   [0,4,4]  [10,7,9]
 \                  - cumulative reduce with:
+                   -   addition         [0,4,10]  [9,10,20]  [0,4,8]  [10,17,26]
  µ                 - monadic chain separation, call that "left"
     ⁵              - literal ten        10        10         10       10
   i                - first index in left 3         2 (spare)  0        1 (strike)
    ©               - (copy to register for later reuse)
        $           - last two links as a monad (f(x)):
       Ị            -   abs(x) <= 1       0         0          1        1
      +             -   add x             3         2          1        2
         Ḃ          - modulo by 2         1         0          1        0
          Ḥ         - double              2         0          2        0
           ị        - index into left (both 1-indexed and modular)
                    -            ...      4        20          4       26
                  - - literal -1         -1        -1         -1       -1
                 ¡  - repeat:
            ;       - ...action: concatenate
                ¤   - ...number of times: nilad followed by link(s) as a nilad:
             ®      -   z from register   3         2          0        1
               Ị    -   abs(z) <= 1       0         0          1        1
              ×     -   multiply          0         0          0        1 (strike)
                    - ...yielding:        4         20         4        [26,-1]

;0Ç3ƤFṣ-m€2Fḣ⁵S - Main link: list bowlValues
                -                    e.g. [4,3,8,2,7,1,10,7,3,0,10,2,2,10,10,5,4]
 0              - literal zero            0
;               - concatenate             [4,3,8,2,7,1,10,7,3,0,10,2,2,10,10,5,4,0]
   3Ƥ           - for infixes of length 3:
  Ç             -   last link (1) as a monad
                -                         [7,11,17,9,8,11,[20,-1],10,3,12,[14,-1],4,12,[25,-1],[19,-1],9]
     F          - flatten                 [7,11,17,9,8,11,20,-1,10,3,12,14,-1,4,12,25,-1,19,-1,9]
       -        - literal -1              -1
      ṣ         - split at                [[7,11,17,9,8,11,20],[10,3,12,14],[4,12,25],[19],[9]]
          2     - literal two             2
        m€      - modulo slice for €ach   [[7,17,8,20],[10,12],[4,25],[19],[9]]
           F    - flatten                 [7,17,8,20,10,12,4,25,19,9]
             ⁵  - literal ten             10
            ḣ   - head to index           [7,17,8,20,10,12,4,25,19,9] (no effect this time)
              S - sum                     131

0

Perl, 140?

Nỗ lực đầu tiên:

#!/usr/bin/perl
# usage: ./bowling.pl [list of scores]

@A=@ARGV;{last if(9<$n++);$a=shift@A;$S+=$a;($S+=$A[0]+$A[1])&redo if($a==10);$b=shift@A;$S+=$b;($S+=$A[0])&redo if(10==$a+$b);redo}print$S

Đáng buồn thay, có một số trường hợp nó thất bại. Tôi sẽ đến và làm lại sau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.