Ваша мета - написати ідеального гравця для гри Nim Wythoff .
Правила Німа Вайтофа
Nim Wythoff - це детермінована гра для двох гравців, яка грається з двома купами однакових лічильників. Гравці чергують повороти, в яких вони роблять один із таких:
- Видаліть один або кілька лічильників з першої ворсу
- Видаліть один або кілька лічильників з другої ворсу
- Видаліть рівну кількість лічильників (одного або декількох) як з першої, так і з другої.
Звичайно, палі не можуть стати негативними, але вони можуть дорівнювати до 0. Залежно від того, хто з гравців видаляє останню лічилку, виграє гру.
Для більш геометрично налаштованих, ось еквівалентний склад гри, який ви можете грати в цей аплет . Єдина королева починається з якоїсь площі чверть-нескінченної шахової дошки, кут якої знаходиться внизу зліва. Гравці чергують королеву, яка рухається як шахова королева, але обмежується трьома напрямами:
- Вниз
- Зліва
- По діагоналі вниз і вліво
Хто перемістить королеву в кут, той виграє.
Пов’язавши координати королеви (з кутом (0,0)
) до розмірів відповідних паль, легко побачити, що обидві ігри однакові.
Ідеальна гра
(Ви можете пропустити це, якщо знайомі з поняттями ідеальної гри та виграшних рухів.)
Оскільки Nim Wythoff - це скінчена та детермінована гра, вона має поняття ідеальної гри . Ідеальний гравець - це стратегія, яка завжди виграє з теоретично виграної позиції, тобто позиція, в якій існує стратегія, яка гарантує виграш.
Щоб бути виграшною стратегією, досить рухатися, щоб завжди переходити на теоретичну виграшну позицію для гравця, який щойно перемістився, і, отже, гравець не йде далі. Перші з цих виграшних позицій (їх також називають холодними ) (0,0), (1,2), (2,1), (3,5), (5,3)
. Пояснення статті алгоритму див. У статті Вікіпедії для пошуку виграшної стратегії Nim Wythoff, а також формули для отримання виграшних позицій.
Вимоги до програми
Написати програму або функцію приймає позицію як вхідну та виводить виграшну ходу у вигляді позиції після цього переміщення. Виграє найменше байт.
Якщо виграшного кроку не існує, тобто позиція є теоретичною втратою, ваша програма повинна вказати так і втратити.
Ваша програма повинна працювати протягом розумного часу. Отже, експоненціального рекурсивного пошуку по дереву ігор буде недостатньо. Якщо ви хочете заздалегідь обчислити і жорстко кодувати стратегію, це добре.
Вхідні дані
Пара (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)