태그 보관물: parsing

parsing

10 핀 볼링 점수-월드 볼링 에디션 프레임이 있습니다. 각

세계 볼링 득점

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

스코어링 시스템은 다음과 같이 작동합니다 ( 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



답변

05AB1E , 12 11 바이트

암호

S'/T:'X30:O

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

설명

S             # Split the string into a list of characters
 '/T:         # Replace '/' with 10
     'X30:    # Replace 'X' with 30
          O   # Sum up the array (ignoring non-number elements)


답변

자바 스크립트, 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는 거짓이며 비어 있지 않은 문자열 (공백 포함)은 진실입니다

답변

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)

이것을 실행


답변

파이썬 2 , 55 바이트

lambda l:sum(map(('123456789/'+'X'*20).rfind,l))+len(l)

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

많은 솔루션의 문자열 색인 방식을 기반으로합니다.


답변

자바 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


답변

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

온라인으로 해보십시오!


답변

젤리 , 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

시도 해봐