Muitas pessoas foram ao centro de boliche local para jogar alguns jogos de boliche e muitas continuam lutando para calcular suas pontuações. O World Bowling introduziu um sistema de pontuação simplificado para atrair mais pessoas para o esporte. Este sistema de pontuação é utilizado em jogos internacionais.
O sistema de pontuação funciona assim (da Wikipedia ):
O sistema de pontuação do World Bowling - descrito como "pontuação atual de quadros" [32] - possui pinos da seguinte maneira:
- strike: 30 (independentemente dos resultados dos testes seguintes)
- sobressalente: 10 mais pinfall no primeiro rolo do quadro atual
- aberto: pinfall total para o quadro atual
Se você não conhece o boliche, aqui está uma recapitulação.
Existem 10 pinos no final de uma pista de boliche, onde o objetivo é derrubar todos eles com uma bola de boliche. Você recebe 2 jogadas de bola para tentar derrubá-las todas, de preferência derrubando-as todas com a primeira jogada (conhecida como golpe ). Se você receber uma tacada, esse quadro estará completo e você não precisará rolar a bola uma segunda vez. Uma greve vale 30.
Se você não derrubar todos os dez, terá mais uma jogada. Se você derrubar todos os pinos restantes, isso é conhecido como sobressalente . A pontuação vale 10 pinos + o número de pinos derrubados no primeiro rolo. Por exemplo, se eu derrubasse 7 pinos, conseguiria derrubar os 3 restantes, que valeriam 17.
Se após a sua segunda jogada você não derrubar todas as dez, isso é conhecido como um quadro aberto . A pontuação vale o número total de pinos derrubados para esse quadro.
Existem 10 quadros em um jogo . Se você conhece a pontuação tradicional de boliche, não recebe um rolo extra no 10º quadro com a Pontuação Mundial de Boliche. Na pontuação tradicional de boliche, são necessários 12 acertos consecutivos para obter uma pontuação perfeita de 300, enquanto a pontuação no boliche mundial exige apenas 10 acertos consecutivos.
Desafio
Seu desafio é calcular a pontuação fornecida pelos valores de uma planilha de pontuação.
Em uma planilha de pontuação, uma falta é indicada por um traço ( - ), uma batida com um X e uma reposição com uma barra ( / ). Se estes não se aplicarem, a contagem de pinfall é simplesmente indicada com um número (1-9). Faltas e divisões também são registradas nas fichas, mas você não precisa se preocupar com isso.
Entrada
Você receberá uma sequência composta por pontuações para cada quadro e terá um total de dez quadros. Cada quadro terá até dois valores, ou apenas 1 valor, se houver uma ocorrência. Sua entrada pode ser um parâmetro de string para uma função, ler de um arquivo ou de STDIN.
Por exemplo, se eu derrubar 1 pino no meu primeiro rolo e depois derrubar 2, o quadro parecerá "12". Isso não significa 12 (doze), mas significa 1 e 2, para um total de 3.
Se eu perdesse todos os pinos com os dois rolos (bolas de sarjeta), ficaria assim "-" (pontuação 0).
Cada quadro será separado por um espaço.
Entrada de amostra
-- 9- -9 X -/ 8/ 71 15 44 X
Para detalhar esse exemplo,
- Quadro 1 (-) - ambos os rolos foram perdidos. marcou 0
- Quadro 2 (9-) - derrubou 9 no primeiro rolo e perdeu no segundo. Pontuação 9
- Quadro 3 (-9) - Perdeu tudo no primeiro, conseguiu 9 no segundo. Pontuação 9
- Quadro 4 (X) - Greve, derrubou todos os dez. Pontuação 30
- Quadro 5 (- /) - Spare, perdeu tudo no primeiro, derrubou todos com o 2º rolo. Pontuação 10 + 0 = 10
- Quadro 6 (8 /) - Sobressalente, 8 pinos no primeiro rolo, derrubou os outros 2 com o 2º rolo. Pontuação 10 + 8 = 18
- Estrutura 7 (71) - estrutura aberta, 7 pinos no primeiro rolo, 1 pino no segundo rolo. Pontuação 7 + 1 = 8
- Os quadros 8,9,10 seguem os mesmos exemplos acima.
Saída
A saída será simplesmente um valor que possui a soma das pontuações de todos os 10 quadros. Usando a entrada de amostra, a saída será 128. Sua saída pode ser uma sequência ou um tipo numérico. Pode ser um valor de retorno da função ou gravado em STDOUT.
Regras
- Suponha que a entrada sempre seja válida. Por exemplo, um quadro inválido seria "/ 8", "XX", "123", "0" etc.
- Você não precisa se preocupar com divisões ou faltas.
- Seu código pode ser um programa completo ou uma função que recebe uma string e retorna a pontuação.
- Seu código não deve gerar nenhuma exceção.
- Isso é código de golfe, a resposta com o menor número de bytes ganha.
- Os idiomas que usam inclusões ou importações devem incluir as instruções de importação como parte de seu código e contar para a contagem de bytes.
Casos de teste
"-- 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
Respostas:
05AB1E ,
1211 bytesCódigo
Experimente online!
Explicação
fonte
JavaScript, 43 bytes
Mostrar snippet de código
Como funciona
Convertemos cada caractere ao seu ponto:
Em seguida, some todos os pontos.
Converter
O operador OR bit a bit
|
converte seu operando em Int32 antes de operar. Ao converter para Int32, o valor primeiro converte para o formato Número (número flutuante de 64 bits), depois faz o tronco para Int32 (ou convertido para 0 se inválido).ToInt32({'/':10,X:30}[c])
pode ser lido como:ToInt32(undefined)
->ToInt32(NaN)
-> 0;ToInt32(c)
poderia ser:Number(c)
é 0, o resultado é 0;Number(c)
isNaN
, result é 0;Soma
[c,...s] = s
deixec = s[0]
, es = s.slice(1)
;fonte
Stax , 13 bytes
Execute e depure
Descompactado, não destruído, e comentou que é assim.
Execute este
fonte
Python 2 , 55 bytes
Experimente online!
Baseado na abordagem do índice de string de muitas soluções.
fonte
Java 8,
645946 bytes-5 bytes graças a @Neil .
-13 bytes graças a @ OlivierGrégoire .
Explicação:
Experimente online.
fonte
("123456789//"+1e6+1e6+"X")
parece economizar 5 bytes.F #,
106103 bytesExperimente online!
Eu acho que esse quebra-cabeça (sem o golfe) seria uma ótima pergunta para um guia de "Programação funcional para iniciantes". E eu deveria saber!
-3 de Kevin Cruijssen, por descobrir que o espaço em branco entre 'e "então" pode ser excluído. Obrigado!
A solução Stax da recursiva de usar índices de string é muito, muito boa. Se você o portar para F #, poderá obtê-lo por 77 bytes :
Experimente isso online!
fonte
'
por -3 bytes.Gelatina , 17 bytes
Um link monádico que aceita uma lista de caracteres e retorna um número inteiro
Experimente online!
Quão?
Também aos 17 anos:
Tente isso
fonte
Perl 6 , 30 bytes
Experimente online!
fonte
Retina , 17 bytes
Experimente online!
Não estou muito atualizado sobre as alterações mais recentes da Retina. Vou olhar mais neles quando tiver uma chance e ver se há novos truques para jogar isso. O código transforma todas as ocorrências em três sobressalentes, todas em dez pontos e, em seguida, todos os pontos no número correspondente de sublinhados. Em seguida, conta o número de sublinhados.
fonte
Perl 5
-pF
,3027 bytes-3 bytes graças ao Xcali
Experimente online!
fonte
/X/
vez dey/X//
e mais um usando emm%/%
vez dey%/%%
: Experimente online!y///
quando as fiz fora de um circuito. Graças05AB1E , 14 bytes
Experimente online!
Explicação
fonte
J , 33 bytes
Experimente online!
Explicação:
]
a entrada('-123456789',20 1#'/X')
acrescenta 20/
e umX
à sequência-123456789
i.
localiza os índices da entrada na string acima31|
módulo 31 - para se livrar dos espaços - eles não são encontrados na string, entãoi.
retorna 31 para eles1#.
encontra a soma dos índicesfonte
Python 2 , 67 bytes
-3 bytes graças a @KevinCruijssen
Experimente online!
fonte
'-123456789'+'/'*20+'X':sum(p.index(i)
para'-123456789/'+'X'*20:sum(p.rfind(i)
Gelatina , 12 bytes
Experimente online!
Como funciona
fonte
Python 3.6 , 54 bytes
Experimente online!
fonte
Kotlin , 50 bytes
Experimente online!
Espero que não seja contra as regras responder à sua própria pergunta, mas eu queria participar da diversão.
Math.E
produz o valor2.718281828459045
. Estou usando-o para criar alguma string de preenchimento para empurrar X para a posição 30.indexOf
obtém a posição (com base em 0) do caractere na sequência "12345 ...". Se não for encontrado, ele retornará -1. Nós adicionamos 1 para fazer esses 0, e isso também torna a posição baseada em 0 no valor da string.fonte
PHP,
119109 bytes-10 bytes graças a @KevinCruijssen
Experimente online!
fonte
($b=='/'?10+(int)$a:((int)$a+(int)$b))
a(int)$a+($b=='/'?10:(int)$b)
para -10 bytes.Carvão , 23 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
fonte
Vermelho , 93 bytes
Experimente online!
fonte
C # (.NET Core) , 40 + 18 = 58 bytes
Experimente online!
fonte
C # (compilador interativo do Visual C #) , 53 bytes
Experimente online!
fonte
SNOBOL4 (CSNOBOL4) ,
169151147 bytesExperimente online!
fonte
Clojure , 70 bytes
Experimente online!
Ao
reduce
passar por uma String, cada caracter é realmente convertido em um caracter - quem teria pensado. Mas isso significa que tenho que escrever\space
e isso dói mais do que se pode imaginar. Além disso, ao criar um número real a partir de um caractere, a combinação debigint
estr
parece ser a única combinação utilizável.Bem, além de todas essas lutas: função anônima que retorna a pontuação como natural.
fonte
Ruby , 38 bytes
Experimente online!
fonte