Una sola línea para determinar quién gana en piedra, papel y tijera

Así que estoy escribiendo un simple juego de piedra, papel y tijera en C (es una tarea por cierto, aunque lo principal es aprender sockets. Además, sospecho que será necesario antes de obtener una buena respuesta). Lo tengo configurado como Rock = 0, Paper = 1, y Scissors = 2. ¿Hay un sencillo de una sola línea para determinar quién gana? Intenté jugar con eso en papel, pero no pude encontrar ningún patrón.

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

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

Explicación : En la secuencia Rock=0, Paper=1, Scissors=2 , cada elemento derrota al anterior. Esto es cierto incluso si tratamos la secuencia como un ajuste (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 .

A partir de esto, se puede mostrar que (3+XY) % 3 es 1 si X derrota a Y, o 2 si Y derrota a X.

Se necesita sumr 3 para forzar que el resultado sea no negativo: el módulo de un número negativo será negativo o cero en C99 y dependerá de la implementación en C89.