Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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+X-Y) % 3 равно 1, если X побеждает Y или 2, если Y побеждает X.

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