Це завдання стосується гри Tic Tac Toe, але вона грається на торі.
Як грати
Щоб створити необхідну ігрову дошку, ви починаєте з звичайної ігрової дошки Tic Tac Toe. Спочатку складіть його в циліндр, з'єднавши лівий і правий край. Потім складіть його в торус, з'єднавши верхній і нижній край. Ось проста візуалізація такої ігрової дошки з кількома відтвореними рухами (навички Sick Paint!).
Правила Tic Tac Toe на торі такі ж, як і у звичайного Tic Tac Toe. Кожен гравець розміщує чергування Xs та Os. Виграє перший з 3-ма однаковими символами в рядку, стовпцем або діагоналлю.
Оскільки тору досить важко уявити, ми просто проектуємо дошку назад на папір. Тепер ми можемо грати в гру як звичайний Tic Tac Toe. Різниця лише в тому, що ви також можете виграти з трьома однаковими символами в розбитій діагоналі. Наприклад, Player 1 (X) виграє наступну дошку. Це можна легко побачити, трохи змінивши погляд на торус.
Якщо вас зацікавило, ви можете пограти в Tic Tac Toe на торі в Torus Games . Є версія для Windows, Mac та Android.
Оптимальні ігри
У цьому виклику були зацікавлені оптимальні ігри. Оптимальна гра - це гра, де обидва гравці грають оптимальну стратегію. На звичайній дошці Tic Tac Toe оптимальні ігри завжди закінчуються внічию. Захоплюючим на дошці тора завжди виграє перший гравець. Насправді гра на дошці тору ніколи не може закінчитися внічию (також якщо гравці грають не оптимально).
Оптимальна стратегія дійсно проста:
- Якщо ви можете перемогти, розмістивши свій символ, зробіть це.
- Інакше, якщо у опонента є два символи в одному рядку / стовпці / điagonal, спробуйте заблокувати його. Інакше робіть те, що хочете.
- Інакше робіть те, що хочете.
Кожна оптимальна гра складається з рівно 7 ходів, і ці рухи можна описати наступним чином:
- Гравець 1 розміщує X десь на дошці (9 варіантів)
- Гравець 2 розміщує O де-небудь на дошці (8 варіантів)
- Гравець 1 розміщує X десь на дошці (7 варіантів)
- Хід гравця 2 може бути вимушеним (1 вибір), якщо ні, він розміщує O куди завгодно (6 варіантів)
- Хід гравця 1 змушений (1 вибір)
- Гравець 2 потрапляє у вилку (Гравець 1 може виграти двома різними способами), тому Гравець 2 повинен блокувати гравця 1 одним способом (2 варіанти)
- Гравець 1 розміщує свій останній хід і виграє (1 вибір)
На нашій прогнозованій дошці є 9 * 8 * 1 * 6 * 1 * 2 * 1 + 9 * 8 * 6 * 1 * 1 * 2 * 1 = 1728 різних оптимальних ігор. Тут ви можете побачити одну типово оптимальну гру:
Якщо позначити кожну комірку дошки цифрами 0-8
, ми можемо описати цю гру цифрами 3518207
. По-перше, X - це місце у комірці 3 (середній рядок, лівий стовпець), ніж O у комірці 5 (середній рядок, правий стовпець), ніж X у комірці 1 (верхній рядок, середній стовпчик), ...
Використовуючи цю цифру, ми автоматично створили замовлення. Тепер ми можемо сортувати всі 1728 оптимальних ігор, і ми отримаємо список:
Game 0000: 0123845
Game 0001: 0123854
Game 0002: 0124735
Game 0003: 0124753
Game 0004: 0125634
...
Game 0674: 3518207
...
Game 1000: 5167423
Game 1001: 5167432
Game 1002: 5168304
...
Game 1726: 8765034
Game 1727: 8765043
Виклик
Цей список є частиною вашої роботи. Ви отримаєте одне число k
між 0 і 1727, і вам доведеться повернути цю k
гру в цифрному позначенні цього відсортованого списку.
Напишіть функцію або програму, яка отримує число k
(ціле число), обчислює відповідну гру. Ви можете прочитати вхід через STDIN, аргумент командного рядка, аргумент підказки або функцію та надрукувати результат (7 цифр) у читаному форматі (наприклад, 0123845
або [0, 1, 2, 3, 8, 4, 5]
) або повернути його, використовуючи рядок (у форматі, прочитаному людиною) або ціле число (містить усі цифр у базі 10) або у будь-якому форматі масиву / списку.
Тип виклику - код-гольф. Тому виграє найкоротший код.