Dar un desafío con una referencia de Star Trek justo después del 4 de mayo puede estar mal visto, pero aquí va.
Usted, Luke, Anakin, Palpatine, Yoda y Han Solo están involucrados en un loco torneo de Rock, Paper, Scissor, Lizard, Spock.
El problema aquí es que solo puedes usar un orden fijo de movimientos. Si su orden es "R", entonces debe usar Rock, hasta que pierda o gane contra todos. Si su orden es RRV, entonces debe usar 2 rocas seguidas de un Spock y seguir repitiendo hasta que haya ganado o perdido.
¡Luke, Anakin, Palpatine, Yoda y Han Solo han enviado sus respectivos pedidos y tú, como experto hacker, tienes en tus manos cada uno de ellos!
Con este conocimiento, debe diseñar su pedido para el torneo. Dado que todos quieren ganar, desea crear un pedido para ganar el torneo al vencer a todos. Pero esto puede no ser posible en todas las circunstancias.
En caso de que haya un posible pedido ganador, imprímalo. Si no hay una forma posible de ganar, imprima -1 (o 0 o Falso o "imposible")
Entrada : una lista de 5 pedidos
Salida : un solo pedido o -1
Entrada de muestra 1
R
P
S
L
V
Salida de muestra 1
-1
Explicacion 1
No importa lo que juegues en tu primer movimiento, habrá al menos una persona que te gane, por lo tanto, no es posible que ganes.
Entrada de muestra 2
RPS
RPP
R
SRR
L
Salida de muestra 2
RPSP
Explicacion 2
Una vez que juegas Rock en tu primer movimiento, terminas venciendo a "L" y "SRR" y empatas contra el resto. Esto se debe a que Lizard y Scissors pierden ante Rock. Cuando juegues Paper a continuación, vencerás a "R" y empatarás contra los 2 restantes. Esto se debe a que Rock pierde contra Paper. Cuando juegues a Scissors a continuación, ganarás contra "RPP" cuando Scissor venza a Paper.
Finalmente, vencerás a "RPS" con tu Paper como Paper beats Rock.
Aquí hay una lista de anotaciones (puede usar 5 literales, pero especifique en su respuesta):
R : Rock
P : Paper
S : Scissor
L : Lizard
V : Spock
Aquí hay una lista de todos los resultados posibles:
winner('S', 'P') -> 'S'
winner('S', 'R') -> 'R'
winner('S', 'V') -> 'V'
winner('S', 'L') -> 'S'
winner('S', 'S') -> Tie
winner('P', 'R') -> 'P'
winner('P', 'V') -> 'P'
winner('P', 'L') -> 'L'
winner('P', 'S') -> 'S'
winner('P', 'P') -> Tie
winner('R', 'V') -> 'V'
winner('R', 'L') -> 'R'
winner('R', 'S') -> 'R'
winner('R', 'P') -> 'P'
winner('R', 'R') -> Tie
winner('L', 'R') -> 'R'
winner('L', 'V') -> 'L'
winner('L', 'S') -> 'S'
winner('L', 'P') -> 'L'
winner('L', 'L') -> Tie
winner('V', 'R') -> 'V'
winner('V', 'L') -> 'L'
winner('V', 'S') -> 'V'
winner('V', 'P') -> 'P'
winner('V', 'V') -> Tie
Este es el código de golf , por lo que ganan menos bytes.
PD: Avíseme si necesita más casos de prueba.
Respuestas:
Jalea , 29 bytes
Un enlace monádico que acepta una lista de listas de enteros (cada una de las cuales es la estrategia de un oponente) que produce una lista de listas de enteros, cada una de las cuales es una estrategia ganadora (por lo tanto, una lista vacía si no es posible).
(Solo agregue
Ḣ
para obtener solo una lista de estrategia única o,0
si es imposible).Pruébalo en línea! (los formatos de pie de página para mostrar siempre las listas)
O pruebe una versión mapeada de letras (donde las estrategias se toman y se muestran en sus propias líneas usando la
RPSVL
notación).¿Cómo?
Los números se eligen de manera tal que cualquiera que sea un número impar mayor que otro módulo cinco gana (es decir, están numerados alrededor del borde de un pentágono inscrito de los lanzamientos).
El código juega cada estrategia en contra de cada estrategia (incluidos ellos mismos) para el doble de lanzamientos que la estrategia más larga para garantizar que los perdedores se queden con los que no son derrotados. La lista resultante de estrategias contendrá una estrategia única si hay un ganador absoluto; sin estrategias si no hubo ganador; o múltiples estrategias si hay jugadores de dibujo. Después de esto, se agrega un conjunto ganador de movimientos a cada una de estas estrategias.
fuente
ZLḤ
porLÄ
.Ɗ
su código, ni siquiera está haciendo lo que podría haber pensado: está moldeando cada uno como si fuera su propia longitud y luego obteniendo las sumas acumulativas de esos resultados, por lo que también comparará valores incorrectos. Pruebe esto por ejemplo: toma[[1,2,3,4,5],[6,7],[8]]
, moldea cada uno por la longitud de la lista completa (3) para obtener y[[1,2,3],[6,7,6],[8,8,8]]
luego realiza la acumulación para obtener[[1,1+2,1+2+3],[6,6+7,6+7+8],[8,8+8,8+8+8]]
=[[1,3,6],[6,13,19],[8,16,24]]
.JavaScript (ES6),
122 115112 bytesToma la entrada como una matriz de cadenas de dígitos, con:
Pruébalo en línea!
¿Cómo?
Esta es una búsqueda de amplitud: primero intentamos todos los movimientos en un paso dado para ver si podemos ganar el juego. Si no podemos ganar en este momento, intentamos agregar otro movimiento a cada movimiento no perdedor.
donde
and
yxor
son operadores bit a bit.Comentado
fuente
test(['P','P','S','P','P'])
la respuesta debe ser "SR" o "SV".R ,
213190 bytes-23 bytes gracias a Giuseppe.
Pruébalo en línea!
Si existe una solución, genera una. Si no hay solución, genera una fila de
NA
. Si este formato de salida no es aceptable, puedo cambiarlo a un costo de unos pocos bytes.Los movimientos se codifican como 1 = R, 2 = S, 3 = P, 4 = L, 5 = V, de modo que la matriz de resultados es
(0 = sin ganador; 1 = el jugador 1 gana; 2 = el jugador 2 gana)
Un límite superior en la longitud de la solución, si existe, es
n=sum(lengths(L))
dóndeL
está la lista de movimientos de los oponentes. El código crea todas las estrategias posibles de longitudn
(almacenadas en la matrizv
), las prueba todas y muestra todas las estrategias ganadoras.Tenga en cuenta que este valor de
n
hace que el código sea muy lento en TIO, por lo que he codificado en el TIO,n=4
que es suficiente para los casos de prueba.Para el primer caso de prueba, la salida es
correspondiente a la solución RLSL.
Para el segundo caso de prueba, la salida es
lo que significa que no hay solución.
Explicación de una versión anterior (se actualizará cuando pueda):
los
which
es necesario deshacerse de AN que se producen cuando los dos jugadores roban siempre.No estoy convencido de que esta sea la estrategia más eficiente. Incluso si es así, estoy seguro de que el código para
m
podría jugarse bastante.fuente
lengths()
alias de volver siempre4
?v
...lengths
para forzarn=4
el TIO, porque de lo contrario lleva demasiado tiempo repasar todoEmacs Lisp, 730 bytes
No encontré un intérprete en línea de Emacs Lisp :( Si tiene Emacs instalado, puede copiar el código en un
.el
archivo, copie algunas líneas de prueba a continuacióny ejecutarlo
$ emacs --script filename.el
.Cómo funciona
Mi programa primero busca en profundidad, a veces descubriendo que es imposible ganar y terminando la rama en la que está.
Puede ver la explicación completa en la versión no abreviada del código:
fuente