Це завдання полягає в тому, щоб написати функцію minimax мовою на ваш вибір, щоб вивести наступний найкращий хід у грі NxN з тик-так-носком з урахуванням поточного стану дошки . Вхід дошки може бути прийнятий як Матриця, 2D колекція або що- небудь інше, що для вас має сенс, але дотримується правил . Вихід є наступним найкращим кроком для того, хто навертається на даний момент , де X вважається розпочатим .
Швидкий перегляд алгоритму Minimax
Основна ідея алгоритму minimax полягає в перерахуванні всіх можливих результатів як DAG, а потім зважування їх на користь, яку послідовність рухів має для гравця, вводиться під час першого зробленого ходу. Усі можливі результати потім "заряджаються" першим кроком і оцінюються на основі суми всіх результатів (-1 за програш, 0 за нічию та 1 за виграш). У реалізаціях, в яких потрібно грати декількох гравців, ви перераховуєте всі можливі рухи гравця, а також всі можливі відповіді опонентів. Наприклад, в грі в тик-так-ногу (після першого ходу) є 8 можливих перших кроків, які ви можете зробити, і всі вони можуть здатися рівними лише при аналізі наступного ходу. Але шляхом повторення всіх можливих результатів для кожного можливого набору кроків, що призводить до кінцевого результату, та підведення їх підсумків,
Для кращого, більш поглибленого та контекстуального резюме алгоритму mini-max з точки зору tic-tac-toe читайте більше тут: http://neverstopbuilding.com/minimax
XKCD (лише 3x3 рішення)
Правила
- Можна використовувати будь-яку мову, але не допускаються зовнішні бібліотеки minimax.
- Вихід може бути координатою (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] також може бути вірним) (деяка форма вказівки місця, довільна до тих пір, поки ви можете легко пояснити використаний формат)
3х3
[[X,O,X]
[O,X,-]
[-,-,-]]
Вихід: -1 (втрата)
Ще раз дозволений будь-який потрібний формат введення, але потрібно використовувати X та O, надані приклади не мали на меті обмежувати цей формат, а лише надихати.