Hay varias preguntas con respecto a este juego , incluso un concurso de rey de la colina aquí . Pero creo que todos esos desafíos y concursos necesitan una forma de determinar automáticamente el ganador de un juego. Asi que:
Reto
Dadas dos entradas en el rango que ["rock", "paper", "scissors", "lizard", "spock"]
representan las selecciones para el jugador 1 y el jugador 2, determinar el ganador del partido.
Reglas
[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
Restricciones
- La entrada será un par de cadenas en el rango dado (no se pueden usar otras cadenas). Puede usar matrices de caracteres si lo desea, siempre que representen cualquiera de los valores mencionados.
- Puede elegir entre usar minúsculas, mayúsculas (
"ROCK"
) o camellas ("Rock"
) para las cadenas de entrada, siempre que el caso elegido sea el mismo para todas las entradas. - La salida será un trío de valores que determinarán el ganador, que puede ser cualquier cosa que desee siempre que las respuestas sean consistentes. Ejemplo:
1
si gana la primera entrada,2
si gana la segunda entrada,0
si hay un empate. O tal vezA
si gana la primera entrada,B
si gana la segunda entrada,<empty string>
si hay un empate.
Gol
Este es el código de golf , ¡así que puede ganar el programa / método / función / lambda más corto para cada idioma!
Pruebas
[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
truco).Respuestas:
Python 3 ,
685048 bytesEDITAR: Gracias a 3 trucos de Neil y 2 del Sr. Xcoder
Cada cadena de entrada tiene un cuarto carácter distinto, así que lo estoy usando para distinguirlos. Si organiza los elementos en el ciclo (tijeras, papel, piedra, lagarto, spock), cada elemento supera al elemento directamente después y el elemento 3 se coloca a la derecha, cíclicamente. Entonces restamos las posiciones de las entradas en el ciclo. Si ese número es 0, es un empate. Si es 1 o 3, es una victoria para el primer jugador. En mi solución original, la diferencia de ciclo se indexaría en la cadena "210100" para distinguir los resultados del juego. Neil de alguna manera descubrió que esto se puede lograr sin indexar agregando 7 y tomando el módulo por 3. Editar: Originalmente usé el segundo carácter para identificar la cadena, pero si usas el cuarto e inviertes el ciclo, obtienes pastel. Y todos podríamos usar más pastel.
Pruébalo en línea!
Versión antigua:
Pruébalo en línea!
Versión original:
Pruébalo en línea!
fuente
.index
a.find
)p
,"chaoi"
basta)JavaScript (ES6), 56 bytes
Toma entrada en la sintaxis de curry
(a)(b)
. Devuelve0
si A gana,1
si B gana ofalse
por un empate.Manifestación
Mostrar fragmento de código
¿Cómo?
Definimos la función hash H () como:
Esto da:
Dados dos entradas una y b , tenemos en cuenta las siguientes afirmaciones:
A partir de (1) y (2), deducimos si el resultado de a> b debe invertirse para obtener el ganador correcto y almacenamos este indicador en el N-ésimo bit de una máscara de bits de búsqueda.
De ahí los bits:
Leyendo esto de abajo hacia arriba e ignorando los ceros iniciales , esto da 1001100110 , o 614 en decimal.
fuente
05AB1E , 16 bytes
Pruébalo en línea! o como un conjunto de pruebas
Explicación
Utiliza el
cake
truco muy agradable del usuario 507295fuente
Ruby , 36 bytes
Devuelve
0
si el primer jugador gana,1
si el segundo jugador gana, y2
por un empate.Basado en la respuesta del usuario 507295, pero utiliza una fórmula matemática para realizar el hash.
a.sum
es la suma de todos los códigos ASCII de la cadenaa
, mod1<<16
y está pensada como una suma de control rudimentaria. El hash se encontró usando el siguiente código:Esto produjo dos valores
j
que dieron un hash adecuado para letras minúsculas, a saber, 88 y 80, los cuales dieron la secuencia descendente[3,2,1,0,4]
(o[4,3,2,1,0]
si el ciclo se inicia al principio).Como se explica en otras respuestas, se necesita un hash que proporcione una diferencia constante del módulo 5 para elementos consecutivos en la secuencia anterior para que la
(h[a]-h[b])%5
fórmula funcione. Cada elemento vence al elemento 1 o 3 lugares a la derecha y pierde al elemento 2 o 4 lugares a la derecha.Pruébalo en línea!
fuente
JavaScript (ES6),
63545349 bytesPuerto de mi golf a la respuesta de @ WhatToDo. Nota: el fragmento decodifica el resultado numérico en algo un poco menos ilegible. Editar: guardado 1 byte gracias a @Arnauld. Guardado 4 bytes gracias a @ovs.
fuente
C, 53bytes
He tratado este problema como una máquina de estados, de los cuales hay 25 estados definidos por las dos, cinco entradas de estado.
Al definir los resultados de los estados dentro de una matriz de bits. Miro los resultados utilizando marcadores únicos dentro de las entradas.
Como se señaló en otras soluciones, los caracteres 2, 3 y 4 son únicos entre las posibles entradas. He concentrado el uso en los caracteres 2 y 3 que uso para seleccionar el bit apropiado dentro de mi matriz de respuestas.
Dentro del Carácter 2, los bits 1 a 4 identifican claramente la entrada. Al enmascarar estos bits y desplazarlos adecuadamente [ese es el "* y & 47 >> 1"], la entrada puede observarse como 0, 1, 4, 7 u 8. Por lo tanto, mi cadena de respuesta tiene 9 caracteres. (partes interesantes separadas)
Dentro del carácter 3, los bits 0, 1 y 2 identifican claramente la entrada. Al enmascarar estos bits (no se requiere desplazamiento) [ese es el "* x & 7"], la entrada puede anotarse como 0, 1, 2, 3 o 7. (partes interesantes separadas)
La cadena de respuesta se puede calcular simplemente completando los bits para los caracteres apropiados.
Entonces, pon un bit en char donde Y gana
Entonces la lógica es simple: si el segundo carácter es el mismo, dibuje; de lo contrario, obtenga un carácter ascii basado en el segundo carácter de y, cambie los bits por el tercer carácter de x y agregue uno. Esto hace que las respuestas sean 0 para empatar, 1 para x ganar y 2 para y ganar.
fuente
Clojure,
130118 bytes-12 bytes al deshacerme de mi extraño uso de
comp
.Pensé que estaba siendo inteligente, pero esto terminó siendo ingenuo en comparación con otras respuestas, y mucho más.
Toma las primeras 2 letras de cada cadena de movimiento, obtiene los códigos de caracteres y los suma. Luego resta las sumas para obtener
d
. Sid
es 0, es un empate (0), si está en el conjunto de#{5 -16 12 -14 13 1 4 -18 2 11}
, p1 gana (1), de lo contrario, p2 gana (2).Para obtener los "números mágicos" que definen si P1 gana, corrí
Lo que genera una lista de
d
valores para cada escenario posible:Luego comparé el gráfico de victorias con este resultado. Afortunadamente, no hubo ninguna "colisión" que no sea 0.
fuente