10 핀 볼링 점수-월드 볼링 에디션


20

세계 볼링 득점

많은 사람들이 볼링 게임을하기 위해 지역 볼링 센터에 갔으며, 많은 사람들이 점수를 계산하기 위해 계속 노력하고 있습니다. 월드 볼링은 더 많은 사람들을 스포츠에 끌어 들이기 위해 간단한 점수 시스템을 도입했습니다. 이 스코어링 시스템은 국제 게임에서 활용됩니다.

스코어링 시스템은 다음과 같이 작동합니다 ( Wikipedia에서 ).

"현재 프레임 스코어링"[32]으로 설명되는 월드 볼링 스코어링 시스템은 다음과 같이 핀을 수여합니다.

  • 스트라이크 : 30 (롤 결과에 관계없이)
  • 스페어 : 현재 프레임의 첫 번째 롤에 10 플러스 핀폴
  • 열림 : 현재 프레임의 총 핀폴

10 핀 볼링에 익숙하지 않다면 여기에 요약되어 있습니다.

볼링 레인 끝에는 볼링 공으로 핀을 모두 쓰러 뜨리는 10 개의 핀이 있습니다. 당신은 볼 2 롤은 바람직하게는 그들에게 (A로 알려진 최초의 롤 모두 쓰러 뜨린 그들에게 모두 아래로 노크를 시도 얻을 파업을 ). 타격을 가하면 해당 프레임이 완성되고 공을 다시 굴릴 필요가 없습니다. 파업의 가치는 30입니다.

열 개를 모두 쓰러 뜨리지 않으면 한 번 더 굴립니다. 남은 핀을 모두 쓰러 뜨리면 여분이라고 합니다. 점수는 10 핀 + 첫 번째 롤에서 쓰러진 핀 수입니다. 예를 들어, 내가 7 핀을 쓰러 뜨렸다면 나머지 3 개를 쓰러 뜨렸다면 17의 가치가 있습니다.

두 번째 롤 후 10 개를 모두 쓰러 뜨리지 않으면 오픈 프레임이라고 합니다. 점수는 해당 프레임에서 녹아웃 된 총 핀 수에 해당합니다.

게임 에는 10 개의 프레임 이 있습니다 . 전통적인 볼링 득점에 익숙하다면 월드 볼링 득점으로 10 번째 프레임에 추가 롤을 얻지 못합니다. 전통적인 볼링 점수에서는 300 점을 달성하기 위해 12 번의 연속 타격이 필요한 반면 월드 볼링의 득점은 10 번의 연속적인 타격 만 필요합니다.

도전

당신의 도전은 점수 시트에서 주어진 값을 계산하는 것입니다.

점수 시트에, 미스가 대시로 표시됩니다 ( - )하는 파업X예비 슬래시 ( / ). 이러한 사항이 적용되지 않으면, 낙상 횟수는 단순히 숫자 (1-9)로 표시됩니다. 파울과 스플릿도 스코어 시트에 기록되지만 이에 대해 걱정할 필요는 없습니다.

입력

각 프레임에 대한 점수로 구성된 문자열이 제공되며 총 10 개의 프레임이 있습니다. 각 프레임은 최대 2 개의 값을 가지거나 스트라이크가있을 경우 1 개의 값을 갖습니다. 입력은 함수에 대한 문자열 매개 변수이거나 파일에서 읽거나 STDIN에서 읽을 수 있습니다.

예를 들어, 첫 번째 롤에서 1 핀을 내리고 2를 쓰러 뜨렸다면 프레임은 "12"처럼 보일 것입니다. 이것은 12 (12)를 의미하는 것이 아니라 1과 2를 의미하며 총 3입니다.

두 롤 (홈통 공)이있는 모든 핀을 놓치면이 "-"(점수 0)와 같습니다.

각 프레임은 공백으로 구분됩니다.

샘플 입력

-- 9- -9 X -/ 8/ 71 15 44 X

이 예제를 분석하려면

  • 프레임 1 (-)-두 롤 모두 누락되었습니다. 0 점
  • 프레임 2 (9-)-첫 번째 롤에서 9를 쓰러 뜨 렸고 두 번째 롤에서 놓쳤습니다. 9 점
  • 프레임 3 (-9)-처음에 모두 놓 쳤고 두 번째에 9를 얻었습니다. 9 점
  • 프레임 4 (X)-스트라이크, 10 개 모두 쓰러졌습니다. 30 점
  • 프레임 5 (-/)-스페어, 처음에는 모두 빠졌고 두 번째 롤로 모두 쓰러졌습니다. 점수 10 + 0 = 10
  • 프레임 6 (8 /)-예비, 첫 번째 롤에 8 개의 핀이 있고 두 번째 롤로 다른 2 개를 쓰러 뜨 렸습니다. 10 + 8 = 18 점
  • 프레임 7 (71)-열린 프레임, 첫 번째 롤의 7 핀, 두 번째 롤의 1 핀. 점수 7 + 1 = 8
  • 프레임 8,9,10은 위와 동일한 예를 따릅니다.

산출

출력은 단순히 10 개 프레임의 점수 합계를 갖는 값입니다. 샘플 입력을 사용하면 출력은 128이됩니다. 출력은 문자열 또는 숫자 유형일 수 있습니다. 함수 반환 값이거나 STDOUT에 기록 될 수 있습니다.

규칙

  • 입력이 항상 유효하다고 가정하십시오. 예를 들어, 유효하지 않은 프레임은 "/ 8", "XX", "123", "0"등입니다.
  • 분열이나 파울에 대해 걱정할 필요가 없습니다.
  • 코드는 전체 프로그램이거나 문자열을 받아 점수를 반환하는 함수일 수 있습니다.
  • 코드에서 예외를 발생시키지 않아야합니다.
  • 이것은 코드 골프이며, 가장 적은 수의 바이트로 승리합니다.
  • 포함 또는 가져 오기를 사용하는 언어는 코드의 일부로 import 문을 포함하고 바이트 수에 포함되어야합니다.

테스트 사례

"-- 9- -9 X -/ 8/ 71 15 44 X" -> 128
"-- -1 2- 12 22 5- 42 61 8- 72" -> 45
"X X X 1/ 2/ 3/ 4/ 5/ -- 9/" -> 174
"X X X X X X X X X X" -> 300
"-- -- -- -- -- -- -- -- -- --" -> 0

21
이것이 코드에 도전하는 것이 아니라는 것에 실망했습니다
Jo King

13
첫 번째 예는 점수는 13 점이지만 17 점이라고 생각합니다.
Jo.

@ 조. 잘 잡았습니다. 해당 오류를 해결하기 위해 질문을 업데이트했습니다.
Makotosan

@JoKing 저는 제목을 처음 보았을 때 10 개의 하위 도전으로 구성된 코드 볼링 도전이라고 생각했습니다.
Weijun Zhou

1
내가 본 최고의 문서화 및 서면 과제 중 하나입니다.
Joshua

답변:



7

자바 스크립트, 43 바이트

f=([c,...s])=>c?({'/':10,X:30}[c]|c)+f(s):0

작동 원리

각 문자를 해당 지점으로 변환합니다.

  • 30 포인트 가치의 'X'
  • 10 포인트 가치가있는 '/'
  • 1 ~ 9 포인트의 '1'.. '9'
  • 0 포인트의 다른 문자

그런 다음 모든 포인트를 합산하십시오.

변하게 하다

비트 OR 연산자 |는 연산하기 전에 피연산자를 Int32로 변환합니다. Int32로 변환 할 때 값은 먼저 숫자 (64 비트 부동 소수점) 형식으로 변환 한 다음 트렁크를 Int32로 변환하거나 유효하지 않은 경우 0으로 변환합니다.

  • ToInt32({'/':10,X:30}[c]) 다음과 같이 읽을 수 있습니다.
    • c == '/'인 경우 : 결과는 10입니다.
    • c == 'X'인 경우 : 결과는 30입니다.
    • 그렇지 않으면 : 결과는 ToInt32(undefined)-> ToInt32(NaN)-> 0입니다.
  • ToInt32(c) 될 수 있습니다 :
    • c == '1'... '9'인 경우 : 결과는 1 .. 9;
    • c == '': Number(c)가 0이면 결과는 0입니다.
    • 그렇지 않은 경우 : Number(c)is NaN, 결과는 0입니다.
  • 피연산자 중 하나가 0이므로 비트 단위 또는 여기는 "add"와 같습니다.

합집합

  • [c,...s] = slet c = s[0]s = s.slice(1);
    • s가 빈 문자열이면 c는 정의되지 않습니다 .
    • 그렇지 않으면, c는 s의 첫 글자입니다
  • undefined는 거짓이며 비어 있지 않은 문자열 (공백 포함)은 진실입니다

1
코드를 설명 할 수 있습니까? 정말 좋아 보인다
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz 방금 추가했습니다.
tsh

5

Stax , 13 바이트

─*âⁿ┴8òt↨HÉ÷8

실행 및 디버깅

포장을 풀고 포장을 풀고 주석 처리했습니다.

F               for each character in input, execute...
 9R$'/20*+'X+   build the string "123456789////////////////////X"
 I              get the index of the current character in string
 ^+             increment and add to running total
                (index is -1 when no match; space and dash are 0 score)

이것을 실행



3

자바 8, 64 59 46 바이트

s->s.map(c->c<46?0:c<48?10:c>87?30:c-48).sum()

@Neil 덕분에 -5 바이트 . @ OlivierGrégoire
덕분에 -13 바이트 .

설명:

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

s->               // Method with an IntStream parameter and integer return-type
  s.map(c->       //  Loop over the characters
          c<46?   //   If the character is a space or '-':
           0      //    Count it as 0
          :c<48?  //   Else-if it's a '/':
           10     //    Count it as 10
          :c>87?  //   Else-if it's an 'X':
           30     //    Count it as 30
          :       //   Else (it's a digit):
           c-48   //    Count it as the value of the digit
       ).sum()    //   And sum everything

1
("123456789//"+1e6+1e6+"X")5 바이트를 절약하는 것 같습니다.
Neil

필러 문자열을 만드는 영리한 기술입니다.
Makotosan


3

F 번호, 106 103 바이트

let s c=Seq.sumBy(fun x->if x=' '||x='-'then 0 elif x='X'then 30 elif x='/'then 10 else int(string x))c

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

나는 골프가없는이 퍼즐이 "초보자를위한 기능적 프로그래밍"가이드에 큰 문제가 될 것이라고 생각한다. 그리고 알아야합니다!

-와 "then"사이의 공백을 삭제할 수 있다는 사실을 발견 한 Kevin Cruijssen의 -3 감사!

문자열 인덱스를 사용하는 재귀의 Stax 솔루션 은 매우 좋습니다. F #으로 포팅하면 77 바이트를 얻을 수 있습니다 .

let s c=Seq.sumBy(fun x->"123456789/???????????????????X".IndexOf(char x)+1)c

온라인으로 해보십시오!


1
F #을 잘 모르지만 '-3 바이트 후에 공백을 삭제할 수있는 것 같습니다 .
Kevin Cruijssen

나도 그래! 그러나 당신은 맞아요, 잘 발견되었습니다! 감사!
Ciaran_McCarthy

2
@Ciaran_McCarthy : 솔루션을 포함하고 싶다면 내 솔루션을 복사해도 괜찮습니다. 여기 사람들은 일반적으로 이런 종류의 것에 대해 꽤 개방적입니다. 공식적으로 경쟁이더라도 가장 작은 코드를 모두 찾으려는 공동 노력입니다.
재귀

1
재귀 감사합니다. 아주 좋은 솔루션이므로 다른 언어로 어떻게 보이는지 보는 것이 재미있어서 포함시켜 보겠습니다.
Ciaran_McCarthy

2

젤리 , 17 바이트

ḟ⁾ -“X0/⁵”yV€o30S

문자 목록을 허용하고 정수를 반환하는 모나드 링크

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

방법?

ḟ⁾ -“X0/⁵”yV€o30S - Link: list of characters
 ⁾ -              - literal list of characters [' ','-']
ḟ                 - filter discard
    “X0/⁵”        - literal list of characters ['X','0','/','⁵']
          y       - translate (change 'X's to '0's and '/'s to '⁵'s)
           V€     - evaluate €ach character as Jelly code (the '⁵'s become 10s)
             o30  - logical OR with 30 (change all instances of 0 to 30)
                S - sum

또한 17시 :

”/ẋ20ØD;;”XḊiЀ⁸S

시도 해봐



2

레티 나 , 17 바이트

X
///
/
55
\d
*
_

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

최신 Retina 변경 사항에 대해서는 최신 정보가 아닙니다. 나는 기회를 얻었을 때 이것들을 더 자세히 살펴보고 골프를 치는 새로운 트릭이 있는지 알아볼 것입니다. 이 코드는 모든 스트라이크를 3 개의 스페어로, 모든 스페어를 10 포인트로, 모든 포인트를 해당하는 밑줄 수로 바꿉니다. 그런 다음 밑줄 수를 계산합니다.



1

05AB1E , 14 바이트

þ`I…/aXS¢ƶT*`O

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

설명

þ`              # Push the digits of the input on the stack (removes everyting that isn't a digit)
  I…/aXS        # Push the input and the array "/","a","X" on the stack
        ¢       # Index of each element in the input ...
         ƶT*    # ... multiplied by its index (a could be anything that can't be found in the input), multiplied by 10.
            `O  # Sum the stack, implicit display

1

J , 33 바이트

1#.31|('-123456789',20 1#'/X')i.]

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

설명:

] 입력

('-123456789',20 1#'/X')문자열 에 20 /과 1 X을 추가 합니다-123456789

i. 위 문자열에서 입력 인덱스를 찾습니다.

31|모듈로 31-공백을 제거하기 위해-문자열에서 찾을 수 없으므로 i.31을 반환합니다.

1#. 지수의 합을 찾습니다


J와 Red는 완전히 다른 언어이므로 두 가지로 구분 된 답변을 게시하는 것이 좋습니다. 빨간색 답변 에서이 J 답변으로의 링크를 추가하여 J 답변의 포트임을 나타낼 수 있습니다.
Kevin Cruijssen

@Kevin Cruijssen-알겠습니다. 감사합니다. 그것들을 함께 게시하는 이유는 분명히 Red 솔루션이 경쟁적이지
Galen Ivanov


1

젤리 , 12 바이트

⁾/X,“½œ‘y|0S

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

작동 원리

⁾/X,“½œ‘y|0S  Main link. Argument: s (string)

⁾/X,“½œ‘      Literal; yield [['/', 'X'], [10, 30]].
        y     Transliterate; replace '/' with 10, 'X' with 30.
         |0   Bitwise OR with 0. Bitwise operators attempt to cast to int, mapping 
              '0', ..., '9' to 0, ..., 9. All other characters map to 0.
           S  Take the sum.


1

코 틀린 , 50 바이트

x->x.sumBy{"123456789/_${Math.E}_X".indexOf(it)+1}

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

바라건대 자신의 질문에 대답하는 규칙에 위배되지는 않지만 재미에 참여하고 싶었습니다.

Math.E값을 생성합니다 2.718281828459045. 필러 문자열을 만들어 X를 위치 30으로 푸시하는 데 사용하고 있습니다.

indexOf문자열 "12345 ..."에서 문자의 위치 (0부터 시작)를 가져옵니다. 찾지 못하면 -1을 반환합니다. 우리는 1을 더하여 이것을 0으로 만들고, 또한 0 기반 위치를 문자열의 값으로 만듭니다.


1

PHP, 119 바이트

@KevinCruijssen 덕분에 -10 바이트

<?foreach(explode(" ",$argv[1])as$f){[$a,$b]=str_split($f);$n+=$f==X?30:(int)$a+($b=='/'?10:(int)$b);}echo$n;

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


당신은 변경할 수 있습니다 ($b=='/'?10+(int)$a:((int)$a+(int)$b))(int)$a+($b=='/'?10:(int)$b)-10 바이트.
Kevin Cruijssen

@KevinCruijssen 감사합니다, 좋아 보인다! 다른 답변을 보면이 문제에 대해 잘못 / 먼 길을 가고있는 것처럼 보입니다. :)
조.

0

, 23 바이트

IΣEχΣES⎇№-/Xλ×χ⌕-//XλIλ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

  Eχ                    Map over 10 frames
      S                 Input the frame
     E                  Map over the characters
            λ           Current character
        №-/X            Search the literal string `-/X`
                    λ   Current character
               ⌕-//X    Find position in literal string `-//X`
             ×χ         Multiply by predefined variable 10
                      λ Current character
                     I  Cast to integer
       ⎇                Ternary
    Σ                   Sum for each frame
 Σ                      Sum over frames
I                       Cast to string for implicit print




0

SNOBOL4 (CSNOBOL4) , 169 (151) 147 바이트

	F =INPUT ' '
R	F '-' =0	:S(R)
T	F 'X' ='_'	:S(T)
S	F LEN(1) . X ARB . Y ' ' REM . F	:F(O)
	X '_' =30
	Y '/' =10
	S =S + X + Y	:(S)
O	OUTPUT =S
END

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

	F =INPUT ' '					;* read input and append a space
R	F '-' =0	:S(R)				;* replace - with 0
T	F 'X' ='_'	:S(T)				;* replace X with _
S	F LEN(1) . X ARB . Y ' ' REM . F	:F(O)	;* set first character to x, remainder up to ' ' to y, and remainder to F
	X '_' =20					;* replace _ in x with 20
	Y '/' =10					;* replace / in y with 10
	S =S + X + Y	:(S)				;* else X and Y are their values so we can sum them
O	OUTPUT =S					;* output the sum
END

0

클로저 , 70 바이트

#(reduce(fn[s i](+ s(case i\- 0\/ 10\X 30\space 0(bigint(str i)))))0%)

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

reduce문자열을 넘을 때 각 문자는 실제로 문자로 변환됩니다. 그러나 이것은 의미심장 한 글을 써야 \space합니다. 또한, 문자의 실제 수의 조합을 만들 때 bigintstr 유일한 조합 가능한 것으로 보인다.

음,이 모든 투쟁을 제외하고 : 점수를 자연스럽게 반환하는 익명 함수.


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