Ваша цель - написать идеального игрока для игры в Wythoff's Nim .
Правила Витоффа Нима
Ним из Wythoff - это детерминированная игра для двух игроков, в которую играют двумя кучами одинаковых фишек. Игроки чередуются ходами, в которых они выполняют одно из следующих действий:
- Удалите один или несколько жетонов из первой стопки.
- Убрать один или несколько жетонов из второй стопки.
- Удалите равное количество жетонов (один или несколько) как из первой, так и из второй стопки.
Конечно, стопки не могут быть отрицательными, но они могут равняться 0. Любой игрок, удаляющий последний счетчик, выигрывает в игре.
Для более геометрически мыслящих, вот эквивалентная формулировка игры, в которую вы можете играть в этом апплете . Одна королева начинается на некотором квадрате четверти бесконечной шахматной доски, угол которой находится внизу слева. Игроки поочередно перемещают королеву, которая движется как шахматная королева, но ограничена тремя направлениями:
- вниз
- Осталось
- По диагонали вниз и влево
Кто бы ни перемещает королеву в угол, побеждает.
Сопоставляя координаты королевы (с углом (0,0)
) с размерами соответствующих куч, легко увидеть, что обе игры одинаковы.
Идеальная игра
(Вы можете пропустить это, если знакомы с идеями идеальной игры и выигрышных ходов.)
Поскольку игра Нима Витоффа является конечной и детерминированной игрой, в ней есть понятие идеальной игры . Идеальный игрок - это стратегия, которая всегда выигрывает с теоретически выигранной позиции, то есть позиции, в которой существует стратегия, гарантирующая победу.
Чтобы быть выигрышной стратегией, достаточно двигаться, чтобы всегда перемещаться в теоретическую выигрышную позицию для игрока, который только что перешел, и, таким образом, игрок не пойдет дальше. Первая из этих выигрышных позиций (также называемых холодными позициями ) (0,0), (1,2), (2,1), (3,5), (5,3)
. См. Статью в Википедии для объяснения алгоритма, чтобы найти выигрышную стратегию для Wythoff's Nim, а также формулы для генерации выигрышных позиций.
Требования к программе
Написать программу или функцию принимает позицию в качестве входных данных и выводит выигрышный ход в виде позиции после этого хода. Побеждает несколько байтов.
Если выигрышного хода не существует, т. Е. Позиция является теоретической потерей, ваша программа должна указать это и проиграть.
Ваша программа должна быть запущена в течение разумного периода времени. Таким образом, экспоненциального рекурсивного поиска по дереву игр будет недостаточно. Если вы хотите предварительно вычислить и жестко закодировать стратегию, это нормально.
вход
Пара (i,j)
неотрицательных чисел, представляющих размеры стопки, каждое не более 99
. Это может быть два числа, кортеж, список или любой другой контейнер, который вы предпочитаете.
Выход
Напечатайте или выведите позицию после вашего перемещения, снова в виде двух чисел или контейнера. Это должен быть законный переход к выигрышной позиции. Если таких ходов несколько, любой подойдет, но только один.
Если выигрышного хода нет, вы должны указать это в выходных данных. Любой выход , как False
, None
, 0, или (-1,-1)
будет делать, пока это не правовая позиция, и то же самое для каждого входа проигравших.
Пример работает
f(5,0) = (0,0)
f(2,2) = (1,2) # Or (2,1) or (0,0)
f(1,2) = False
f(13,9) = (13,8) # Or (10,6)
f(10,6) = False
f(5,10) = (5,3)
f(25,30) = (8,13)