Cuando era niño, solía jugar mucho a este juego.
Reglas
Hay dos jugadores (llamémoslos A y B), y cada jugador usa sus manos como pistolas. Hay tres movimientos posibles:
Manos arriba para cargar municiones a tu arma.
Cada arma comienza vacía. La carga aumenta la munición en uno.
Manos apuntando al otro jugador para disparar.
Esto disminuye la munición en uno. Debes tener al menos una unidad de munición para disparar.
Brazos cruzados para protegerse de un disparo.
Ambos jugadores se mueven simultáneamente. Si ambos jugadores disparan al mismo tiempo, las balas se golpean entre sí y el juego continúa. El juego termina cuando un jugador dispara mientras el otro carga municiones.
Disparar y arma vacía se considera trampa . Si un jugador hace trampa mientras el otro realiza una acción legal, el tramposo pierde inmediatamente. Si ambos jugadores hacen trampa al mismo tiempo, el juego continúa.
Los intentos de trampa no disminuyen la munición, por lo que nunca puede ser negativa.
Desafío
Dados los movimientos realizados por los jugadores A y B, salida que jugador ganó el juego: 1para el jugador A, -1para el jugador B y 0para un empate. Puede usar cualquier otro triple de valores de retorno, pero debe indicar en su respuesta cuáles usa.
El juego puede:
- terminar sin tener que procesar todos los movimientos;
- no termina con los movimientos dados, y por lo tanto se considera un empate.
La entrada se puede tomar:
- como cuerdas
- como matrices / listas de enteros
- de cualquier otra manera que no preprocese la entrada
Programa completo o funciones permitidas. Como se trata de código de golf , ¡la respuesta más corta en bytes gana!
Casos de prueba
A: "123331123"
B: "131122332"
-----^ Player B shoots player A and wins.
Output: -1
A: "111322213312"
B: "131332221133"
-------^ Player B cheats and loses.
Output: 1
A: "1333211232221"
B: "1213211322221"
----------^^ Both players cheat at the same time. The game continues.
Output: 0
A: "12333213112222212"
B: "13122213312232211"
| || ^---- Player A shoots player B and wins.
^-------^^------ Both players cheat at the same time. The game continues.
Output: 1

Respuestas:
Jalea,
333224 bytesEsto imprime 5 en lugar de -1 y 7 en lugar de 1 . Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Pyth,
48464947 bytesPruébalo aquí!
¡Gracias a @isaacg por guardar
24 bytes!Toma la entrada como una tupla de 2 con la lista de los movimientos del jugador A primero y los movimientos del jugador B segundo. La salida es la misma que en el desafío.
Explicación
Breve resumen
[cheating win, fair win]con los valores posibles-1, 0, 1para cada una de ellas, para indicar si un jugador ganó en este punto (-1, 1) o si el juego continúa (0)[0,0], y tomar el primer elemento distinto de cero que indica el ganadorDesglose de código
.xhfT | Me, -FmgF.b / <dhkY2S2Q?} b_BS2-FbZ.b, NYCQ) 0 # Q = lista de las listas de movimientos .b, NYCQ # empareja los elementos de ambas listas de entrada .e # mapa sobre la lista de pares con # b es el par yk es índice m Q # asigna cada lista de movimientos d .b mapa 2S2 # sobre [1,2], no puedo usar m porque es La variable # lambda entra en conflicto con la de .e <dhk # d [: k + 1] / Y # cuenta las ocurrencias de 1 o 2 en esta lista -F # (recuento de 1s) - (recuento de 2s), indica victoria de trampa ?} b_BS2 # si b es (1,2) o (2,1) -Fb # toma la diferencia, indica victoria justa Z # más 0, todavía no hay ganador , # emparejar esos 2 valores | M # Para cada par resultante, tome el primero si # no es cero, de lo contrario el segundo fT # filtra todos los valores cero .xh # intenta tomar el primer valor que indica el ganador ) 0 # si eso no es posible porque la lista está vacía # salida cero para indicar un empatefuente
m|Fdes el mismo que|M.Meso también salpica. Por cierto: el problema sobre las variables lambda en conflicto que discutimos en el chat me está costando varios bytes aquí: P,1 2es lo mismo queS2Python, 217 bytes
Explicación : Toma A y B como listas de enteros. Simplemente pasa por cada par de movimientos, suma o resta 1 si es necesario y regresa cuando alguien hace trampa o gana. Hace lo mismo dos veces usando otro bucle for, uno para el movimiento de A y otro para el movimiento de B. Agrega 1 si x va por debajo de 0 a -1.
fuente
Java,
226212200196194 bytes-14 bytes reordenando la lógica
-12 bytes gracias al Sr. Public que señala cómo utilizar una operación ternaria para la lógica de disparo
-4 bytes agrupando la lógica de carga en un cortocircuito si
-2 bytes porque
==1===<2cuando la entrada sólo puede ser1,2,3Uso y versión sangrada:
Ya no es tan sencilla la implementación de las reglas del juego, sino simple. Cada ciclo, realiza estas operaciones:
rhacia perderrno lo es0, devuelve el valor porque alguien hizo trampaxes una variable ficticia utilizada para hacer que el compilador me permita usar una expresión ternaria.Espera, ¿Java es MÁS CORTO que Python?
fuente
w==2&&m<1?r--:m++int x=w==2?m<1?r--:r:m--;luego continúe usando la x (ya que esta es solo una variable ficticia para hacer que el ternario opere) comox=v==2?n<1?r++:r:n--;