Eu acho que todo mundo está familiarizado com dardos, algumas pessoas não entendem a pontuação, portanto, para essas pessoas aqui, há um link útil sobre isso.
O quadro
Um alvo de dardos pode ser comparado a um pedaço de torta em 20 pedaços. Cada peça é dividida em 4 seções.
- um pequeno anel externo chamado duplo (pontos x2)
- um grande anel chamado single (pontos x1)
- outro pequeno anel chamado triplo (pontos x3)
- outro grande anel chamado single (pontos x1)
No meio do tabuleiro existem mais 2 anéis, um verde e um vermelho (tabuleiro clássico)
- Anel vermelho, centro do tabuleiro chamado bullseye ou double bull e vale 50 pontos. Este conta como um dobro e por isso é permitido fazer checkout com ele.
- Anel verde, chamado touro, touro único ou simplesmente 25 e conta como um único.
Desafio
Encontre todas as possibilidades de pagamento com 3 dardos ou menos.
O usuário pode inserir um número inteiro e você terá que verificar se é possível obter a pontuação para 0 com 3 dardos (ou menos).
Exemplos
Exemplo 1:
Input: 170
Output: T20, T20, Bullseye
Exemplo 2:
Input: 6
Output: D3;
S3,S1,D1;
S2,D2;
S2,S2,D1;
D2,D1;
S4,D1;
D1,D1,D1;
S1,S1,D2;
T1,S1,D1;
Exemplo 3:
Input: 169
Output: No possible checkout!
Regras
- Regra básica de dardo, você deve terminar com um duplo (anel externo do tabuleiro ou alvo)
- Não há uso de recursos externos.
- É permitida a codificação rígida de possíveis check-out, mas lembre-se de que este é um codegolf; ele não abrevia seu código;)
- As células a serem atingidas serão exibidas no formato C + N, onde C = T para Triple, D para double e S para single.
- bullseye pode ser chamado bullseye ou DB, DBull ou algo semelhante.
Possíveis checkouts
Para começar, o checkout mais alto possível é 170.
169.168.166.165.163.162.159 não são possíveis em 3 dardos.
A compra mais baixa possível é 2.
além do que, além do mais
Isso não é um requisito, adicione a possibilidade de mostrar todos os check-outs possíveis para todas as pontuações. Basicamente, porque me pergunto quantas combinações são possíveis: P
O vencedor será aquele com o código mais curto.
Feliz codificação.
Respostas:
Caracteres C ++
248/228230/214Rev 0:
Rev 1. Salvei alguns caracteres declarando todas as variáveis de uma só vez e eliminando colchetes desnecessários. Acontece que em C ++ toda lógica e bit a bit e / ou têm precedência menor do que as comparações.
Eu fiz uma função em vez de programar, como outros fizeram. Retorna o número total de possibilidades encontradas. Pode ser reduzido de 230 para 214 caracteres, eliminando o recurso totalizador.
Resultado da amostra, pontuação 6:
Eu conto primeiro e segundo dardos diferentes como a mesma combinação, como o OP fez (exemplo:
T1 S1 D1 = S1 T1 D1) mesmo que isso custe 7 caracteres extras. Eu sempre listo a pontuação mais alta primeiro (ignorando dobrar e triplicar), pois acho que isso é mais relevante para o jogador (que pode mudar sua estratégia se errar com o primeiro dardo.) Pela mesma razão, listo os dardos em ordem, de acordo com o segundo dardo. Considero o terceiro dardo completamente diferente dos outros dois; portanto, considero D1 D2 e D2 D1 como casos diferentes, enquanto o OP os lista como iguais.
Com esse sistema de contagem, eu tenho 42336 possibilidades totais , o mesmo que mmumboss. Contando primeiro e segundo dardos diferentes como combinações diferentes, isso aumenta para 83349.
Eu não usei um loop for com conjuntos, como outros fizeram (sou bastante novo em C ++ e nem sei se é possível.) Em vez disso, abusei de uma condicional no incremento do loop para passar de 20 para 25 Eu uso a variável de um único loop para codificar todas as pontuações possíveis para um único dardo, assim: S1 D1 T1 S2 D2 T2 etc. com módulo e divisão para decodificar. Isso economiza a verbosidade de declarar mais para loops, embora torne as expressões mais complicadas.
O resultado disso é que um dardo não utilizado é mostrado como T0, mas acho claro o que se entende, especialmente porque (considerando diferentes primeiro e segundo dardos como a mesma combinação), pude agrupá-los no início da minha saída.
Versão não destruída aqui. Alguns outros recursos são o uso dos operadores & e && seletivamente com | de modo a dar a ordem de precedência que eu quero sem colchetes.
fonte
MATLAB (
299249241 caracteres)Este é o meu primeiro golfe sério. Minha primeira tentativa (136 caracteres) fornece o resultado correto, mas não com a formatação correta. Dá todas as possibilidades de olhar para o número de pontos para cada dardo. Isso significa que 20 simples e 10 duplos têm uma entrada separada, no entanto, ambos são exibidos como 20. É claro que o último dardo é sempre um dobro.
Na segunda tentativa, a formatação foi aprimorada, o que naturalmente aumentou o número de caracteres:
Aprimorado de 299 para 249 caracteres, ao mesmo tempo em que melhora a formatação da saída. Para esta versão aprimorada, a saída para os casos de exemplo é:
f (170):
f (6):
f (169):
Adicional:
De acordo com minhas habilidades de cálculo, há um total de 42336 possibilidades para terminar o jogo de dardos.
fonte
60 60 50
deve serT20 T20 Bullseye
. Vou deixar isso mais claro na pergunta. Muito bem, porém, quase lá :)Ruby (260 caracteres)
"O último deve ser duplo" foi a peça que faltava - não conseguia entender por que 168 não deveria ter resultados ...:
c. (170)
c. (6)
fonte
Python 2.7 (270 caracteres)
Não tenho certeza se o python permitirá um one-liner, mas ele está em três.
Ou mais de 278 caracteres com uma mensagem apropriada 'No Checkout' (por exemplo, 290 aqui):
Aqui vamos nós:
f (170)
f (6)
f (169)
Coisas com as quais não estou feliz:
Isso é superior a 10% do total. Existe uma maneira mais compacta sem ferramentas, etc?
Isso é usado para evitar duplicatas no caso de um acabamento com dois dardos (por exemplo, ['', 'S1', 'D1'] e ['S1', '', 'D1']). Considero que a ordem é importante (ei - o último dardo deve ser um duplo, portanto, claramente, a ordem é importante), mas o não lançamento é um caso especial.
fonte
05AB1E , 43 bytes
Muito lento. Saída como uma lista de listas ou uma lista vazia, se não for possível concluir. Meus touros são
S25
eD25
; se isso não for permitido, posso alterá-lo.Experimente online ou verifique alguns casos de teste de uma só vez .
Explicação:
Existem algumas etapas:
1) Crie uma lista de todos os dardos simples, duplos e triplos possíveis:
2) Obtenha todos os finalizadores possíveis (terminando com um duplo) de até 3 dardos:
3) Mantenha apenas aqueles para os quais a pontuação total é igual ao número inteiro de entrada:
4) Converta os dados na lista de resultados impressa (ou seja,
[[20,3],[5,1],[1,2]]
torna-se["T20","S5","D2"]
):fonte
Kotlin , 254 bytes
Nota: o algoritmo é baseado na resposta C ++ do Level River St.
Experimente online!
fonte