볼링 게임의 점수를 계산해요.
볼링은 무거운 공을 굴려 삼각형으로 세워진 핀을 쓰러뜨리는 게임이에요. 볼링 게임의 점수를 기록하는 코드를 작성해요.
게임은 10개의 프레임으로 이루어져 있어요. 프레임은 처음에 핀 10개가 세워진 상태에서 한 번 또는 두 번 공을 던지는 것으로 이루어져 있어요. 프레임의 점수를 계산하는 데는 세 가지 경우가 있어요.
오픈 프레임은 해당 프레임에서 10점 미만의 점수가 기록되는 경우예요. 이때 프레임의 점수는 쓰러뜨린 핀의 개수예요.
스페어는 두 번째 투구로 핀 10개를 모두 쓰러뜨리는 경우예요. 스페어의 총점은 10에 다음 투구에서 쓰러뜨린 핀의 개수를 더한 값이에요.
스트라이크는 첫 번째 투구로 핀 10개를 모두 쓰러뜨리는 경우예요. 스트라이크의 총점은 10에 다음 두 번의 투구에서 쓰러뜨린 핀의 개수를 더한 값이에요. 스트라이크 바로 뒤에 두 번째 스트라이크가 나오면, 공을 한 번 더 던질 때까지 첫 번째 스트라이크의 점수를 정할 수 없어요.
다음은 세 프레임 예시예요.
| 프레임 1 | 프레임 2 | 프레임 3 |
|---|---|---|
| X (스트라이크) | 5/ (스페어) | 9 0 (오픈 프레임) |
프레임 1은 (10 + 5 + 5) = 20이에요.
프레임 2는 (5 + 5 + 9) = 19예요.
프레임 3은 (9 + 0) = 9예요.
따라서 현재 누적 총점은 48이에요.
게임의 10번째 프레임은 특별한 경우예요. 스페어나 스트라이크를 던지면 각각 한 번 또는 두 번의 추가 투구를 하게 돼요. 추가 투구는 10번째 프레임의 총점을 계산하기 위해 있어요. 추가 투구에서 스트라이크나 스페어를 기록해도 추가 투구를 더 받지는 않아요. 10번째 프레임의 총점은 쓰러뜨린 핀의 총개수예요.
10번째 프레임이 X1/(스트라이크와 스페어)라면 총점은 20이에요.
10번째 프레임이 XXX(세 번의 스트라이크)라면 총점은 30이에요.
볼링 게임의 점수를 기록하는 코드를 작성해요. 코드는 다음 두 가지 연산을 지원해야 해요.
roll(pins : int)는 플레이어가 공을 굴릴 때마다 호출돼요.
인자는 쓰러뜨린 핀의 개수예요.score() : int는 게임이 완전히 끝났을 때만 호출돼요.
해당 게임의 총점을 반환해요.game 튜플과, 롤이 하나도 없는 새 게임을 반환하는 생성자 <game> ( -- game )를 정의해요.
게임을 대상으로 동작하는 다음 워드들을 제공해요:
roll ( pins game -- ): pins개의 핀이 쓰러졌다는 것을 기록해요. 롤이 유효하지 않으면 오류를 던져요:
"Negative roll is invalid": 핀 수가 음수일 때예요."Cannot roll after game is over": 열 프레임(과 추가 투구)을 모두 마친 뒤예요."Pin count exceeds pins on the lane": 쓰러진 핀이 서 있는 핀보다 많을 때예요.score ( game -- n ): 게임의 총점을 반환해요. 게임이 아직 끝나지 않았으면 "Score cannot be taken until the end of the game" 오류를 던져요.roll은 kernel 어휘의 roll 셔플 워드를 가린다는 점에 유의해요. 테스트 스위트는 FROM: bowling => roll ;로 구분해요.
Exercism에 가입하고 Factor 트랙을 개념 47개연습 문제 163개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.