Задача состоит в том, чтобы написать минимаксную функцию на выбранном вами языке, чтобы вывести следующий лучший ход в игре в крестики-нолики NxN с учетом текущего состояния доски . Входная плата может быть принята в виде матрицы, 2D-коллекции или чего-либо еще, что имеет смысл для вас, но соответствует правилам . Выход будет следующим лучшим ходом для того, чей ход будет в данный момент , где Х считается начатым .
Краткий обзор минимаксного алгоритма
Основная идея алгоритма минимакса состоит в том, чтобы перечислить все возможные результаты в виде DAG, а затем взвесить их с той выгодой, которую последовательность ходов приносит игроку, определяемой первым сделанным ходом. Все возможные исходы затем «разбиваются» на первый ход и оцениваются на основе суммы всех исходов (-1 для проигрыша, 0 для ничьей и 1 для выигрыша). В реализациях, где для игры требуется несколько игроков, вы перечисляете все возможные ходы игрока, а также все возможные ответы оппонентов. Например, в игре в крестики-нолики (после первого хода) есть 8 возможных первых ходов, которые вы можете сделать, и все они могут казаться равными при анализе только следующего хода. Но, перебирая все возможные результаты для каждого возможного набора шагов, которые приводят к окончательному результату, и суммируя их все,
Для лучшего, более глубокого и контекстуального описания алгоритма мини-макс в терминах крестики-нолики читайте здесь: http://neverstopbuilding.com/minimax
XKCD (только решение 3х3)
Правила
- Можно использовать любой язык, но внешние минимаксные библиотеки не допускаются.
- Выходными данными может быть координата (0-n, 0-n) или число (1-n * n), указывающее лучший следующий ход.
- В дополнение к этому вы должны быть в состоянии определить, когда лучшим вариантом является проигрыш или ничья, а не победа.
- То, как вы обозначаете проигрыш или ничью, опять зависит от вас.
- Ввод должен использовать традиционные X и O, и вы должны предположить, что X перемещается первым; пробелы могут быть представлены чем угодно.
- Вы можете предположить, что любые входные данные, входящие в вашу программу, имеют n O и n + 1 X, другими словами, вы можете предположить, что вы получаете правильно сформированную доску.
- Текущее состояние платы должно быть единственным входом в вашу программу. Если вы используете рекурсию, должны быть созданы вспомогательные методы для облегчения требований ввода. См. Https://codegolf.stackexchange.com/a/92851/59376 для уточнения.
- Любое значение 10> = n> = 1 должно поддерживаться; если ваша программа «истекает» при n> 10, я нахожу это также приемлемым, поскольку некоторые языки имеют значительно меньшую вычислительную мощность (особенно при использовании веб-консолей).
судейство
- Это код-гольф, поэтому выигрывает наименьшее количество байт программы, и стандартные лазейки повсеместно запрещены.
- В случае ничьей победит программа, которая поддерживает наибольшее «n».
Пример входов
2х2
[[X,O]
[-,-]]
Вывод: 2 или [0,1] (3 или [1,1] также могут быть правильными) (некоторая форма указания местоположения, произвольная, если вы можете легко объяснить используемый вами формат)
3x3
[[X,O,X]
[O,X,-]
[-,-,-]]
Выход: -1 (потеря)
Еще раз, любой входной формат, который вы хотите, разрешен, но X и O должны использоваться, предоставленные примеры не предназначены для того, чтобы ограничивать этот формат, просто чтобы вдохновить.
источник
Ответы:
Perl
10198 байтВключает
+4
в себя для-0p
Запустить с вводом на STDIN
Выходные данные представляют собой ту же диаграмму, но с каждым ходом, который обновляется в соответствии со своим статусом,
1
представляет выигрыш,2
представляет ничью и3
представляет убыток. Для этого случая это будеттак что 3 хода ничья, 1 победа и 1 поражение (я обновлю решение, если этот формат вывода неприемлем, но основной код останется прежним)
tictactoe.pl
:Это уже мучительно медленно и использует много памяти для пустой доски 3 * 3 (почему на самом деле рекурсия не идет так глубоко. Должна быть некоторая утечка памяти). Добавление запоминания стоит 6 байт, но намного разумнее:
источник
do$0
использует в 10 раз меньше памяти. Имейте в виду, этот случай настолько экстремальный, что может быть настоящей утечкой памяти.Javascript (ES6),
320294 байтавход
1) Массив массива символов, описывающих текущую доску, например:
2) Целое число, описывающее текущий ход: 1 =
X
, -1 =O
Выход
Массив из:
[x, y]
форматепример
В следующем примере
X
гарантированно выиграть, играя[1, 2]
.СТРАННАЯ ИГРА. ЕДИНСТВЕННАЯ ПОБЕДА НЕ ДУМАЕТ.
КАК О ХОРОШЕЙ ИГРЕ ШАХМАТЫ?
источник
The current state of the board must be the only input to your program
. Вашему коду нужны два входа, что нарушает это правило.