Это испытание про игру Tic Tac Toe, но в нее играют на торе.
Как играть
Чтобы создать необходимую игровую доску, вы начинаете с обычной игровой доски Tic Tac Toe. Сначала сложите его в цилиндр, соединив левый и правый край. Затем сложите его в тор, соединяя верхний и нижний края. Вот простая визуализация такой игровой доски с несколькими сыгранными ходами (навыки Sick Paint!).
Правила Tic Tac Toe на торе те же, что и у Tic Tac Toe. Каждый игрок размещает чередующиеся буквы X и Os. Первый с 3 одинаковыми символами в строке, столбце или по диагонали выигрывает.
Поскольку тор довольно сложно визуализировать, мы просто проецируем доску обратно на бумагу. Теперь мы можем играть в эту игру как обычный Tic Tac Toe. Разница лишь в том, что вы также можете выиграть с 3 одинаковыми символами в ломаной диагонали. Например, Игрок 1 (X) выигрывает следующую доску. Это легко увидеть, немного изменив вид тора.
Если вам интересно, вы можете сыграть в Tic Tac Toe на Torus Games в Torus . Есть версия для Windows, Mac и Android.
Оптимальные игры
В этом вызове были заинтересованы в оптимальных играх. Оптимальная игра - это игра, в которой оба игрока играют оптимальную стратегию. На регулярной доске Tic Tac Toe оптимальные игры всегда заканчиваются вничью. Увлекательно на торусной доске всегда побеждает первый игрок. На самом деле игра на доске тора никогда не может закончиться ничьей (даже если игроки играют не оптимально).
Оптимальная стратегия действительно проста:
- Если вы можете выиграть, разместив свой символ, сделайте это.
- В противном случае, если у вашего противника два символа в одной строке / столбце / диагонали, попробуйте заблокировать его. Иначе делай что хочешь.
- Иначе делай что хочешь.
Каждая оптимальная игра состоит из ровно 7 ходов, и эти ходы можно описать следующим образом:
- Игрок 1 размещает X в любом месте на доске (9 вариантов)
- Игрок 2 ставит О в любом месте на доске (8 вариантов)
- Игрок 1 ставит X в любом месте на доске (7 вариантов)
- Ход игрока 2 может быть принудительным (1 выбор), в противном случае он размещает О где угодно (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) или в любом формате массива / списка.
Тип вызова - код-гольф. Поэтому самый короткий код выигрывает.