Craps é um jogo de dados bastante simples, geralmente jogado em cassinos. Mesmo se você não é um jogador (o que eu não sou), ainda é um jogo bastante interessante. Aqui estão as regras:
No início de um jogo de Craps, há o que é chamado de rodada final. O jogador joga dois d6s (dado de seis lados) e os dois dados do dado são adicionados. Se o resultado for 7 ou 11, a pessoa vence automaticamente (isso é conhecido como natural ). Se o resultado for 2, 3 ou 12, a pessoa perde automaticamente (isso é conhecido como porcaria ). Caso contrário, o resultado será definido como o ponto para a ronda de pontos.
Depois disso, a rodada de pontos começa. Durante a rodada de pontos, o jogador deve rolar continuamente 2 d6s até que a pessoa gere 7 ou seu ponto da rodada anterior. Se a pessoa obtiver 7, eles perderão. Se eles argumentarem, eles vencem.
Desafio
Implemente um programa simples que simule um jogo de craps. Se a pessoa fizer uma rolagem natural ou porcaria durante a rodada de saída, o programa deve exibir "Natural:" ou "Crapping out:", seguido pela rolagem e depois sair. Caso contrário, ele deve gerar "Ponto:" seguido pelo ponto. Então, durante a rodada de pontos, ele deve gerar todos os dados até que um 7 ou o ponto seja alcançado. Se a pessoa vencer, deve produzir "Pass"
; se eles perdem deve sair "Don't Pass"
.
Implementação de referência
Groovy, 277 bytes
def a={return Math.random()*6+1};int b=a()+a();(b<4||b==12)?{println"Crapping out: "+b}():{(b==7||b==11)?{println"Natural: "+b}():{println"Point: "+b;for(;;){int x=a()+a();println x;(x==7)?{println"Don't Pass";System.exit(0)}():{if(x==b){println"Pass";System.exit(0)}}()}}()}()
Saídas de amostra
Natural: 7
Crapping out: 3
Point: 9
4
8
11
9
Pass
e
Point: 5
3
7
Don't Pass
Isso é código-golfe , então o código mais curto vence.
(AVISO LEGAL: Este desafio não se destina a promover o jogo de forma alguma. Lembre-se de que a casa sempre vence.)
You can't make your program shorter by picking a random number between 1 and 12 for the die roll; it must be two numbers picked between 1 and 6.
- Que tal escolher um valor aleatório em [1, 12] de uma distribuição idêntica à adição de dois valores aleatórios uniformes em [1, 6]?Respostas:
Ruby 164
Bem direto. Recursos interessantes:
Os casos de descarte são resumidos como
r%12<4
e os demais casos naturais são resumidos comor%4==3
.A sequência inicial é armazenada
c
e outros rolos são obtidos apenas se for posterior em ordem alfabética à letra única?P
(o que ocorre apenas paraPoint
.)fonte
Python 3, 190 bytes
Isso é baseado na resposta de Celeo ; Substituí alguns condicionais longos por um número mágico que codifica uma LUT para cada número, reutilizei uma variável e fiz alguns outros golfe diversos. Ainda espaço para jogar golfe; provavelmente é possível ter menos de 170 anos.
Eu não tentei usar o Python 2, então não sei se seria mais curto.
fonte
C99,
366312293277 bytesEste é o meu primeiro post aqui, então acho que isso pode ser melhorado muito.
Versão expandida
Como você pode ver, há uma boa quantidade de redundância aqui que provavelmente pode ser eliminada.
Créditos ao @Mego por ajudar a torná-lo menor.
fonte
a
eb
e também usando o método de subtracção junto com ternários operadores.Python 2,
226224 bytesPrimeira passagem e há muito código lá:
Obrigado ao Mego por 2 bytes!
fonte
PHP
230228218199192188 bytes186 bytes sem o
<?
Primeira tentativa de código de golfe! Não tem certeza se o uso
</br>
seria permitido? Como isso não funcionaria em um console (como uma nova linha). Deixe-me saber se isso não é permitido e irá alterar meu código.EDIT (16-8-16): Depois de melhorar no codegolf, notei algumas melhorias possíveis. Isso ainda funciona usando a interface da linha de comandos. Substituído
</br>
por um disco rígido.fonte
Javascript 262
fonte
Perl 5 , 140 bytes
Experimente online!
fonte
PowerShell ,
181183179178167 167165 bytes-10 bytes graças ao mazzy
-2 bytes graças ao Xcali
Experimente online!
Versão desenrolada:
Existem alguns pontos menos difíceis agora que a lógica de construção da lista foi reconstruída em um switch. Eu acho que ainda é uma abordagem muito boa. +2 bytes corrigindo um erro.
fonte
-notin (7,$z)
não é relevante para a regraDuring the point round, the player must continuously roll ... the previous round
. Agora o loop termina quando$m
é igual a7
ou na primeira rodada.Come-out
rodada e esse é o seu número alvo para toda aPoint
rodada. Oprevious round
refere-se àCome-out
rodada1?
regex do seu craps.R, 197 bytes
Ungolfed
fonte
Pitão , 108 bytes
Experimente online!
Primeira passagem, provavelmente pode encontrar algumas economias.
fonte
Encantos Rúnicos , 151 bytes
Experimente online!
Depois de corrigir um erro referente a números aleatórios (era repetido sempre
'RA
repetida era chamado e a semente era hora do sistema, resultando em execuções massivas de valores repetidos), isso funciona corretamente.Explicação
A entrada está na segunda linha, como a primeira linha até
B͍
é uma função para rolar dois dados e somar.Fluxo do programa, com alguns redirecionamentos de quebra de borda e enrolados desenrolados para facilitar a leitura
Existem apenas 4 instruções NOP (
{:}≠...?\.6?
) que seriam muito difíceis de remover devido ao espaço necessário em outras linhas (ou seja, o comprimento da"Don't "
string).fonte