One-Liner pour déterminer qui gagne dans Rock, Paper, Scissors

J’écris donc un simple jeu C, Rock, Paper, Scissors (il s’agit d’une tâche, mais l’essentiel est d’apprendre les sockets. Je suppose aussi que ce sera dû avant que je puisse obtenir une bonne réponse). Je l’ai configuré comme Rock = 0, Paper = 1 et Scissors = 2. Y a-t-il un one-line facile à déterminer qui gagne? J’ai essayé de jouer avec ça sur papier, mais je ne pouvais pas trouver de modèle.

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

Cela donnera 1 si le joueur 1 gagne, 2 si le joueur 2 gagne, 0 en cas d’égalité.

Explication : Dans la séquence Rock=0, Paper=1, Scissors=2 , chaque élément annule le précédent. Cela est vrai même si nous traitons la séquence comme un retour à la ligne (c’est-à-dire que le dernier élément précède le premier).

Pour le dire en termes plus mathématiques, pour tout élément X:

  • X est vaincu par (X+1) % 3 .
  • X défaites (X+2) % 3 .

À partir de là, on peut montrer que (3+XY) % 3 est égal à 1 si X vainque Y, ou 2 si Y vainquant X.

Il est nécessaire d’append 3 pour forcer le résultat à être non négatif: le module d’un nombre négatif sera négatif ou nul en C99 et dépend de la mise en œuvre en C89.