Ваша цель - написать идеального игрока для игры в 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)