2010-05-08 11 views
23

Así que estoy escribiendo un juego simple de Rock, Paper, Scissors en C (por cierto, es para una tarea, aunque lo principal es aprender sockets. Sospecho que será debido antes de obtener una buena respuesta). Lo tengo configurado como Rock = 0, Paper = 1 y Scissors = 2. ¿Hay un sencillo delineador para determinar quién gana? Traté de jugar con eso en papel, pero no pude encontrar ningún patrón.One-liner para determinar quién gana en Rock, Paper, Scissors

+1

Si esta pregunta no se refiere a la parte de los sockets de la asignación, podría convertirse fácilmente en un '[code-golf]'. – Pops

+5

6 minutos para una buena respuesta, ¿cuándo vence su tarea? –

+0

Al igual que una nota, generalmente asignaría esos valores (roca, papel, tijeras, dinamita) a cadenas o caracteres. En general, es una mala práctica hacer un número porque lógicamente nunca querrá agregarlos. Esto no es importante para los problemas de asignación, pero es bueno acostumbrarse, así que cuando tienes problemas más grandes no te patean el trasero. – sixtyfootersdude

Respuesta

77
winner = (3 + player1 - player2) % 3; 

Esto dará 1 si el jugador 1 gana, 2 si gana el jugador 2, 0 para un empate.

Explicación: En la secuencia Rock=0, Paper=1, Scissors=2, cada elemento vence al anterior. Esto es cierto incluso si tratamos la secuencia como envoltura (es decir, el último elemento precede al primero).

Para poner esto en términos más matemáticos, para cualquier artículo X:

  • X es derrotado por (X+1) % 3.
  • X derrotas (X+2) % 3.

partir de esto, se puede demostrar que (3+X-Y) % 3 es 1 si X vence a Y, o 2 si Y derrota X.

Adición 3 que se necesita para forzar el resultado a ser no negativo: El módulo de un número negativo será negativo o cero en C99 y dependiente de la implementación en C89.

+12

Esto es brillante, pero este tipo de línea necesita al menos 3 líneas de documentación. –

+2

+1 ¡¡Pónganme en una habitación con dos monos y tres tipos de escritores por toda la eternidad y nunca se nos ocurriría eso! –

+0

Creo que c tiene este tipo de constructo: '(3 + player1 - player2)% 3 == 1? winner = "player1": (3 + player1 - player2)% 3 == 2? winner = "player2": winner = "everyone"; ' – sixtyfootersdude

Cuestiones relacionadas