Investigamos en internet y así traerte la solución a tu dilema, si tienes dudas déjanos la pregunta y respondemos con mucho gusto, porque estamos para servirte.
Solución:
Python, 41 bytes
lambda r,s,p:[s>p<=r>0,p>r<=s>0,r>s<=p>0]
¡Pruébelo en línea!
Toma cuenta como (r,s,p)
. Genera una lista de tres elementos con True
en la posición del ganador, o todos False
es si hay un empate o solo aparece una figura.
Rock: [True, False, False]
Scissors: [False, True, False]
Paper: [False, False, True]
Tie: [False, False, False]
Usamos una caracterización alternativa sin multiplicación (excepto cuando solo hay una figura presente). A continuación se muestra la condición para ganar Rock, con tijeras y papel que tienen condiciones similares.
La piedra gana si: El papel tiene la menor cantidad, estrictamente menos que las tijeras, pero posiblemente lo mismo que la piedra.
Podemos escribir esto en Python como s>p<=r
utilizando el encadenamiento de desigualdad.
Desafortunadamente, esto no maneja correctamente el caso especial cuando r=p=0
, diciendo que Rock gana a pesar de que solo Scissors está presente. Para solucionar este problema, fortalecemos la condición para que Rock gane para incluir r>0
vía s>p<=r>0
, lo que hace que el único estuche de tijeras dé todo False
para cada condición, a juego con una corbata.
44 bytes
lambda r,s,p:r*s==s*p==p*r or[s>p<=r,p>r<=s]
¡Pruébelo en línea!
Toma cuenta como (r,s,p)
. Salidas como:
Rock: [True, False]
Scissors: [False, True]
Paper: [False, False]
Tie: True
El caso "Tie" también incluye donde solo hay una figura presente.
05AB1E, 14 13 bytes
Ćü*ZÊ2βD3*7%M
Ingrese como una lista de números enteros en el orden PS[r,s,p]PS.
Salida como uno de los siguientes cuatro:
Rock wins: 3
Scissors wins: 5
Paper wins: 6
Tie: 0
-1 byte gracias a @xnor.
Pruébelo en línea o verifique algunos casos de prueba más.
Explicación:
Ć # Enclose the (implicit) input-list, appending its own head
# i.e. input=[3,2,2] → STACK: [[3,2,2,3]
ü # For each overlapping pair: [a,b,c,d] → [[a,b],[b,c],[c,d]]
* # Multiply them together
# STACK: [[6,4,6]]
Z # Get the maximum (without popping)
# STACK: [[6,4,6],6]
Ê # Check which of the values in the list are NOT equals to this maximum
# STACK: [[0,1,0]]
2β # Convert this list of 0s and 1s from a binary list to integer
# STACK: [2]
D # Duplicate it
# STACK: [2,2]
3* # Multiply it by 3
# STACK: [2,6]
7% # Take modulo-7:
# STACK: [2,6]
M # Push the largest value on the stack
# STACK: [2,6,6]
# (after which the top of the stack is output implicitly as result)
Después de la Ćü*ZÊ
podemos tener los siguientes valores:
One of:
Rock wins: [[0,1,1], [0,0,1]]
Scissors wins: [[1,0,1], [1,0,0]]
Paper wins: [[1,1,0], [0,1,0]]
Ties: [[0,0,0]]
Convirtiendo los de listas binarias en enteros:
One of:
Rock wins: [3, 1]
Scissors wins: [5, 4]
Paper wins: [6, 2]
Ties: [0]
El 3*7%
(gracias a @xnor!) mapeará los valores más bajos a los valores más altos en el par, y tampoco estará seguro de que los valores más bajos no aumentarán.
Esto funciona porque los pares
[1,3], [2,6], [4,5]
se construyen a partir de bits donde el segundo número tiene dos bits establecidos: el del primer número y la posición del bit a su derecha, envuelto en 3 bits. Esto proviene de la lista binaria del juego RPS. Podemos hacer el set-next-bit con*3
y hacer cumplir el ajuste de 3 bits con%7
.
One of:
Rock wins: [3→2, 1→3]
Scissors wins: [5→1, 4→5]
Paper wins: [6→4, 2→6]
Ties: [0]
Después de lo cual podemos usar M
para mantener solo el valor más grande en la pila para nuestro resultado:
One of:
Rock wins: [3, 3]
Scissors wins: [5, 5]
Paper wins: [6, 6]
Ties: [0]
C (gcc), 61 $ cdots $53 52 bytes
Guardado 3 bytes gracias a Kevin Cruijssen !!!
Guardado 3 bytes gracias a Arnauld !!!
Guardado un byte gracias a roofcat !!!
Usa la fórmula de xnor convertida a $ 3 $ para Rock, $ 2 $ para tijeras $ 1 $ para papel, y $ 0 $ por una corbata o solo aparece una figura.
f(r,s,p)r=s>p&p<=r&&r?3:p>r&r<=s&&s?2:r>s&s<=p&&p;
¡Pruébelo en línea!
Acuérdate de que puedes optar por la opción de decir si diste con la contestación.