볼링 게임 점수


25

당신의 임무는 최대 21 후 10 핀 볼링 게임에서 한 선수의 점수를 합산하고 출력하는 것입니다 .

롤은 선호하는 입력 방법 에서 정수 시퀀스로 표시됩니다 . 각 정수는 해당 롤에서 녹아웃 된 핀 수에 해당합니다.

채점

라운드 후 해당 라운드 에서 녹아웃 된 핀의 수가 최종 점수에 포함됩니다. 만약 플레이어가 라운드의 첫 번째 롤에서 10 개의 핀을 모두 쓰러 뜨리면 이것은 파업 이고 라운드는 끝납니다. 그렇지 않으면 라운드는 한 롤 더 지속됩니다. 라운드의 두 번째 롤이 남은 핀을 모두 쓰러 뜨리면 이것은 여분 입니다.

각 타격마다 다음 두 롤에서 쓰러진 핀의 합과 같은 보너스 가 있습니다. 각 스페어마다 다음 롤에서 쓰러진 핀 수와 같은 보너스가 있습니다.

10 번째 및 마지막 라운드에서 플레이어에게는 추가 롤이 부여 될 수 있습니다. 스트라이크의 경우 플레이어는 2 개의 롤을 더 얻습니다. 스페어의 경우 플레이어는 한 번 더 롤을받습니다.

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

규칙

  • 입력이 유효하다고 가정 할 수 있습니다.
  • Mego의 의견에 따라 현재 표준 을 충족하기 위해 입력 / 출력 방법에 대한 요구 사항을 완화했습니다 .
  • 과제보다 새로운 언어로 된 답변 이 허용됩니다.
  • 최단 코드 승리!

보너스가 쌓이지 않는다는 것을 정확하게 기억합니까?
Titus

@Titus 정확히 무슨 뜻인지 잘 모르겠지만, 보너스는 "스택"되지 않습니다. 즉, 스트라이크의 경우 스트라이크 여부에 관계없이 다음 두 에서 쓰러지는 핀 수를 추가합니다. 또는 아닙니다. 따라서 한 번의 스트라이크의 최대 점수는 30 점이며 전체 게임의 최대 점수는 300입니다.
daniero

별개의 명령 줄 인수는 space separated integers?
Titus

1
@Titus입니다. 이것은 오래된 게시물입니다. 수용 가능한 입력 방법에 대한 오늘의 합의는이 시점에서 확립되지 않았습니다. 사실, 나는 오늘 규칙이 소급 적용 규칙을 변경하는 팬이 아니지만 오늘날 표준이 왜 이것에 적용되지 않아야하는지 (기능 매개 변수 등 포함) 알 수 없습니다.
daniero

1
@daniero 일반적인 조언은 도전을 크게 바꾸지 않는 한 현대 표준에 맞게 규칙을 완화하는 것이 허용된다는 것입니다.
Mego

답변:


6

GolfScript, 50 41 자

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

GolfScript의 또 다른 시도 ( 온라인으로 실행 ).

코드에 대한 설명은 다음과 같습니다. 이 솔루션은 문제의 스택 특성을 활용하지만 (롤을 차례로 소비) 입력을 반대로해야합니다.

~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.

이전 버전:

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

5

파이썬 116 개 110 105 103 100 99 문자

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)

입력시 30자를 소비하는 것은 성가신 일입니다. 제안을 환영합니다.

개선을위한 Howard에 감사드립니다.


당신은 대체 할 수 1+(z[i]!=10)와 함께 2-(z[i]>9)하나 개의 문자를 저장합니다.
Howard

@Howard : 훌륭한 제안. 나는 그것을 내 대답에 포함시켰다. 두 문자를 저장했습니다.
Steven Rumbalski

그리고 i완전히 제거하고 (0으로 설정) i+=...사용하는 대신에 2 개 더z=z[2-(z[0]>9)::];
Howard

@Howard : 다시 감사합니다. 세 문자를 저장했습니다.
Steven Rumbalski

I / O 표준은 현재는 일반적으로 매우 유연하다 z=input()미세 (효과적으로 목록의 스트링 표현 복용되어야 int들과 eval그것을 보내고). 그러나 전체 프로그램은 어딘가에 출력되어야합니다 (이것도 당시의 경우라고 생각합니다). 따라서 저는 이것이 78 바이트 프로그램
Jonathan Allan

4

R, 101 바이트

나는 왜이 도전이 충돌했는지 잘 모르겠지만, 나는 그것을 좋아하기 때문에 어쨌든 늦게 대답 할 것이다.

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)

온라인으로 사용해보십시오!

언 골프 드 :

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)
  }
}

재귀 기능. 취하고 x점수를 가지고 입력으로. s코어를 초기화하고 c던진 라운드의 양을 잊어 버립니다.

if 문은 10 라운드가 발생했는지 또는 x비어 있는지 확인합니다 . 이 경우 점수가 반환됩니다. 그렇지 않으면 함수는 다음과 같이 자신을 호출합니다.

x파업 여부를 확인 하여에서 던지기를 제거합니다 . 그렇다면 첫 번째 항목이 제거되고 그렇지 않으면 첫 번째 항목이 제거됩니다. (S=x[1]!=10)파업을 확인합니다. ( -) index를 제거합니다 0:S. 여기서 S스트라이크 인 경우 1이고 그렇지 않은 경우 0입니다. 그리고 우리는 하나를 추가합니다 : -(0:(x[1]!=10)+1). 단축 x통화를 다음 통화로 전달합니다 .

점수 x[1:2]는 정규 턴 x[1:3]인지, 파업인지 스페어인지를 확인하면 알 수 있습니다. 우리는 sum(x[1:2])10보다 크거나 같은지 확인합니다 . 파업이라면 분명히 그렇습니다. 여분이라면 이것이 잘 작동합니다. 따라서 이것이 참이면 x[3]합계에 더합니다. 그런 다음에 추가됩니다 s.


1

커피 스크립트 ( 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

편집 : Howard의 훌륭한 스택 기반 접근 방식을 수치스럽게 재 탄생하고 수치스럽게 다시 작성합니다. 나는 그것을 파괴하지 않고 배열의 마지막 요소에 액세스하기 위해 더 많은 것을 제거 할 수 있다고 확신합니다 ...


1

루비, 252 바이트

배열에 입력을 수락하면 모든 요소를 ​​먼저 추가 한 다음 여분 및 스트라이크 보너스를 검색합니다.

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 바이트

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

명령 행 인수에서 입력을받습니다. 온라인으로 실행 -nr하거나 테스트하십시오 .

고장

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

젤리 ,  36  35 바이트

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

정수 목록을 승인하고 정수를 리턴하는 모나드 링크.

온라인으로 사용해보십시오!

방법?

3 개의 보울의 겹치는 런의 점수를 마치 프레임의 시작 부분에서 시작된 것으로 -1보인 다음 선택적으로 스트라이크 식별자 ( )를 추가 하고이 결과 목록을 평평하게하고 스트라이크 식별자에서 분할 한 다음 두 번째 결과를 버립니다. 각 청크 (프레임의 시작으로 시작하지 않은 런의 점수를 제거함).

최종 프레임을 제공하기 위해 입력에 0이 먼저 추가되고 (3 번째 슬라이싱으로 두 번째 보울에서 프레임을 시작할 수 있도록) 결과 점수가 처음 10 개로 잘립니다 (지금을 제거하기 위해) 합산하기 전에 가능한 가짜 11 프레임).

+\µ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

펄, 140?

첫번째 시도:

#!/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

안타깝게도 실패한 경우가 있습니다. 나중에 와서 다시 할 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.