Calcule a pontuação de uma partida de boliche.
Boliche é um jogo em que os jogadores lançam uma bola pesada para derrubar pinos dispostos em um triângulo. Escreva um código que acompanhe a pontuação de uma partida de boliche.
A partida consiste em 10 frames. Um frame é composto por um ou dois lançamentos de bola, com 10 pinos em pé no início do frame. Há três casos na tabulação de um frame.
Um frame aberto é aquele em que se registra uma pontuação menor que 10 para o frame. Nesse caso, a pontuação do frame é o número de pinos derrubados.
Um spare é quando os dez pinos são derrubados no segundo lançamento. O valor total de um spare é 10 mais o número de pinos derrubados no lançamento seguinte.
Um strike é quando os dez pinos são derrubados no primeiro lançamento. O valor total de um strike é 10 mais o número de pinos derrubados nos dois lançamentos seguintes. Se um strike for seguido imediatamente por um segundo strike, o valor do primeiro strike não pode ser determinado até que a bola seja lançada mais uma vez.
Veja um exemplo com três frames:
| Frame 1 | Frame 2 | Frame 3 |
|---|---|---|
| X (strike) | 5/ (spare) | 9 0 (frame aberto) |
O frame 1 é (10 + 5 + 5) = 20
O frame 2 é (5 + 5 + 9) = 19
O frame 3 é (9 + 0) = 9
Isso significa que o total acumulado até aqui é 48.
O décimo frame da partida é um caso especial. Se alguém fizer um spare ou um strike, recebe uma ou duas bolas de preenchimento, respectivamente. As bolas de preenchimento existem para calcular o total do 10º frame. Fazer um strike ou um spare na bola de preenchimento não dá ao jogador mais bolas de preenchimento. O valor total do 10º frame é o número total de pinos derrubados.
Para um décimo frame de X1/ (um strike e um spare), o valor total é 20.
Para um décimo frame de XXX (três strikes), o valor total é 30.
Escreva um código que acompanhe a pontuação de uma partida de boliche. Ele deve dar suporte a duas operações:
roll(pins : int) é chamado sempre que o jogador lança uma bola.
O argumento é o número de pinos derrubados.score() : int é chamado apenas no final da partida.
Ele retorna a pontuação total daquela partida.Defina uma tupla game e um construtor <game> ( -- game ) que retorna um novo jogo sem arremessos.
Forneça estas palavras que operam sobre um jogo:
roll ( pins game -- ): registra que pins pinos foram derrubados. Lance um erro quando o arremesso for inválido:
"Negative roll is invalid" para um número negativo de pinos."Cannot roll after game is over" depois que todos os dez frames (e quaisquer bolas de preenchimento) tiverem sido arremessados."Pin count exceeds pins on the lane" quando mais pinos forem derrubados do que estão de pé.score ( game -- n ): a pontuação total do jogo. Lance "Score cannot be taken until the end of the game" quando o jogo ainda não estiver completo.Repare que roll sombreia a palavra roll de embaralhamento do vocabulário kernel.
A suíte de testes desfaz a ambiguidade com FROM: bowling => roll ;.
Crie sua conta no Exercism para aprender e dominar Factor com 47 conceitos163 exercícios e mentoria humana de verdade, tudo de graça.