One-liner, чтобы определить, кто победит в Rock, Paper, Scissors

Поэтому я пишу простую игру Rock, Paper, Scissors в C (это для задания, кстати, хотя главное – изучить сокеты. Кроме того, я подозреваю, что это произойдет, прежде чем я получу хороший ответ). У меня есть настройка Rock = 0, Paper = 1 и Scissors = 2. Есть ли простой однострочный ключ, чтобы определить, кто победит? Я попытался поиграть с ним на бумаге, но я не мог понять никаких шаблонов.

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

Это даст 1, если игрок 1 победит, 2, если игрок 2 победит, 0 за ничью.

Объяснение : В последовательности Rock=0, Paper=1, Scissors=2 , каждый элемент побеждает предыдущий. Это верно, даже если мы рассматриваем последовательность как обертывание (т. Е. Последний элемент предшествует первому).

Чтобы сделать это более математически, для любого элемента X:

  • X побежден (X+1) % 3 .
  • X поражений (X+2) % 3 .

Из этого можно показать, что (3+XY) % 3 равно 1, если X побеждает Y или 2, если Y побеждает X.

Добавление 3 необходимо, чтобы заставить результат быть неотрицательным: модуль отрицательного числа будет отрицательным или нулевым на C99 и зависит от реализации на C89.