Há várias perguntas sobre este jogo , até mesmo uma king-of-the-hill concurso aqui . Mas acho que todos esses desafios e concursos precisam de uma maneira de determinar automaticamente o vencedor de um jogo. Tão:
Desafio
Dadas duas entradas no intervalo que ["rock", "paper", "scissors", "lizard", "spock"]
representam as seleções para o jogador 1 e o jogador 2, determine o vencedor da partida.
Regras
[Winner] [action] [loser]
-----------------------------
scissors cut paper
paper covers rock
rock crushes lizard
lizard poisons spock
spock smashes scissors
scissors decapitates lizard
lizard eats paper
paper disproves spock
spock vaporizes rock
rock crushes scissors
Restrições
- A entrada será um par de strings no intervalo especificado (nenhuma outra string pode ser usada). Você pode usar matrizes de caracteres, se desejar, desde que representem qualquer um dos valores mencionados.
- Você pode optar por usar minúsculas, maiúsculas (
"ROCK"
) ou caixa de camelo ("Rock"
) para as seqüências de entrada, desde que a caixa escolhida seja a mesma para todas as entradas. - A saída será um trio de valores que determinam o vencedor, que pode ser o que você quiser, desde que as respostas sejam consistentes. Exemplo:
1
se a primeira entrada vencer,2
se a segunda entrada vencer,0
se houver um empate. Ou talvezA
se a primeira entrada vencer,B
se a segunda entrada vencer,<empty string>
se houver um empate.
Objetivo
Este é o código-golfe , portanto, pode ganhar o programa / método / função / lambda mais curto para cada idioma!
Testes
[Input 1] [Input 2] [Output: 1/2/0]
-----------------------------------
rock paper 2
rock scissors 1
lizard spock 1
spock rock 1
spock paper 2
rock rock 0
cake
truque).Respostas:
Python 3 ,
685048 bytesEDIT: Graças a 3 truques de Neil e 2 do Sr. Xcoder
Cada string de entrada possui um quarto caractere distinto, então estou usando isso para distingui-los. Se você organizar os elementos no ciclo (tesoura, papel, pedra, lagarto, spock), cada elemento superará o elemento diretamente depois dele e o elemento 3 será apontado para a direita, ciclicamente. Então subtraímos as posições das entradas no ciclo. Se esse número é 0, é um empate. Se for 1 ou 3, é uma vitória para o primeiro jogador. Na minha solução original, a diferença de ciclo seria indexada na sequência "210100" para distinguir os resultados do jogo. De alguma forma, Neil descobriu que isso pode ser conseguido sem a indexação adicionando 7 e levando o módulo em 3. Editar: Originalmente, eu usei o segundo caractere para identificar a string, mas se você usar o quarto e inverter o ciclo, obterá bolo. E todos nós poderíamos usar mais bolo.
Experimente online!
Versão antiga:
Experimente online!
Versão original:
Experimente online!
fonte
.index
para.find
)p
,"chaoi"
sufixos)JavaScript (ES6), 56 bytes
Recebe entrada na sintaxe de currying
(a)(b)
. Retorna0
se A vencer,1
se B vencer oufalse
empatar.Demo
Mostrar snippet de código
Quão?
Definimos a função hash H () como:
Isto dá:
Dadas duas entradas a e b , consideramos as seguintes declarações:
De (1) e (2), deduzimos se o resultado de a> b deve ser invertido para obter o vencedor correto e armazenamos esse sinalizador no N-ésimo bit de uma máscara de pesquisa.
Daí os bits:
Lendo isso de baixo para cima e ignorando zeros à esquerda, isso fornece 1001100110 ou 614 em decimal.
fonte
05AB1E , 16 bytes
Experimente online! ou como um conjunto de testes
Explicação
Usa o muito agradável
cake
-trick do user507295fonte
Ruby , 36 bytes
Retorna
0
se o 1º jogador vencer,1
se o 2º jogador vencer e2
empatar.Com base na resposta do usuário507295, mas usa uma fórmula matemática para executar o hash.
a.sum
é a soma de todos os códigos ASCII da stringa
, mod1<<16
e deve ser uma soma de verificação rudimentar. O hash foi encontrado usando o seguinte código:Isso produziu dois valores
j
que deram um hash adequado para letras minúsculas, ou seja, 88 e 80, os quais deram a sequência descendente[3,2,1,0,4]
(ou[4,3,2,1,0]
se spock é alternado entre o início e o início).Como explicado em outras respostas, um hash que fornece uma diferença constante no módulo 5 para elementos consecutivos na sequência acima é necessário para fazer a
(h[a]-h[b])%5
fórmula funcionar. Cada elemento bate o elemento 1 ou 3 lugares à direita e perde ao elemento 2 ou 4 lugares à direita.Experimente online!
fonte
JavaScript (ES6),
63545349 bytesPorto do meu golfe para a resposta do @ WhatToDo. Nota: o trecho decodifica o resultado numérico em algo um pouco menos ilegível. Editar: salvou 1 byte graças a @Arnauld. Guardado 4 bytes graças a @ovs.
fonte
C, 53bytes
Tratei esse problema como uma máquina de estados, da qual existem 25 estados, conforme definido pelas duas, cinco entradas de estado.
Definindo os resultados dos estados dentro de uma matriz de bits. Examino os resultados usando marcadores exclusivos nas entradas.
Conforme observado em outras soluções, os caracteres 2, 3 e 4 são únicos entre as possíveis entradas. Concentrei o uso nos caracteres 2 e 3, que utilizo para selecionar o bit apropriado na minha matriz de respostas.
No caractere 2, os bits 1 a 4 identificam claramente a entrada. Ao mascarar esses bits e mudar apropriadamente [que é "* y & 47 >> 1"]], a entrada pode ser anotada como 0, 1, 4, 7 ou 8. Portanto, minha sequência de respostas possui 9 caracteres. (pedaços interessantes separados)
No caractere 3, os bits 0, 1 e 2 identificam claramente a entrada. Ao mascarar esses bits (não é necessário deslocamento) [esse é o "* x & 7"]], a entrada pode ser anotada como 0, 1, 2, 3 ou 7. (pedaços interessantes separados)
A sequência de respostas pode ser calculada simplesmente preenchendo os bits dos caracteres apropriados.
Então, defina bit em char onde Y vence
Então a lógica é simples: se o segundo caractere é o mesmo, então desenhe, caso contrário, obtenha o caractere ascii com base no segundo caractere de y e troque os bits pelo terceiro caractere de x e adicione um. Isso torna as respostas 0 para empate, 1 para x ganha e 2 para y ganha.
fonte
Clojure,
130118 bytes-12 bytes, livrando-me do meu uso estranho de
comp
.Eu pensei que estava sendo inteligente, mas isso acabou sendo ingênuo em comparação com outras respostas, e por muito mais tempo.
Pega as 2 primeiras letras de cada sequência de movimento, obtém os códigos de caracteres e os soma. Em seguida, subtrai as somas a obter
d
. Sed
for 0, é um empate (0), se estiver no conjunto de#{5 -16 12 -14 13 1 4 -18 2 11}
, p1 vence (1), caso contrário, p2 vence (2).Para obter os "números mágicos" que definem se P1 vence, corri
O que gera uma lista de
d
valores para cada cenário possível:Então eu comparei o gráfico de vitórias contra essa saída. Felizmente, não houve "colisões" além de 0.
fonte