Фон
MENACE ( M achine E ducable N oughts й C Rosses E ngine) є рудиментарним неглибоко машина алгоритм навчання для гри хрестики і нулики, створений британським вчений Дональд Мічі в 1960 - ті роки. Спочатку він був реалізований із 304 коробками сірників, кожен з яких позначений позицією дошки та містить кольорові намистини (з одним із дев'яти кольорів, що представляють можливі рухи). Мічі підрахував, що цих 304 сірникових коробок було достатньо для кожної комбінації ходів на дошці.
Більш математичні серед вас можуть усвідомити, що насправді на дошці N&C є 19 683 можливих комбінацій нут, хрестів та заготовок; однак, він розраховував способи скоротити цю кількість (щоб прискорити алгоритм і, швидше за все, скоротити на сірникові коробки!). По-перше, він видалив усі неможливі рухи, такі як:
-------
|X|0|X|
| |0| |
|X|X| |
-------
(дві нолиці і чотири хрестики)
Далі він компенсував обертання. Наприклад, якщо на сірниках ми бачимо:
-------
| |0|0|
|X| |X|
| |0| |
-------
ми можемо використовувати те саме поле для
-------
| |X| |
|0| |0|
| |X|0|
-------
Тому вищезгадані кольорові намистини представляють відносні положення, а не абсолютні. Наприклад, якщо ми сказали, що червона намистинка означає лівий верхній кут, ми подивимось на зображення у верхній частині вікна і побачимо:
-------
| |0|0|
|X| |X|
| |0| |
-------
тож ми б знали, що у випадку, якщо це дошка, то червона намистина означатиме:
-------
|R|0|0|
|X| |X|
| |0| |
-------
Але якщо це рада:
-------
| |X| |
|0| |0|
| |X|0|
-------
червона намистина означала б
-------
| |X|R|
|0| |0|
| |X|0|
-------
Ці перетворення застосовуються для обертання та інвертування (у всіх напрямках, включаючи діагональ). Ще раз вам потрібно лише один раз зберегти кожну скриньку таким чином: не робіть окремих віртуальних коробок для кожної трансформації!
Ще одне спрощення, яке зробив Мічі, - переконатися, що комп'ютер працює першим. Таким чином, він міг видалити всі рухи першого рівня, видаливши приблизно п'яту частину залишків. Нарешті, він видалив усі вікна, що закінчуються іграми (оскільки в цьому кроці не потрібно було більше вмісту або рухів).
Право, тепер на самому алгоритмі (це дуже просто):
- Спочатку визначимося з тим, які кольори намистини представляють. Вам потрібно 9 кольорів, щоб представити кожен пробіл на дошці.
- На початку гри кожна з 304 ящиків сірників містить намистини. Хоча намистини мають випадковий колір (тому дублікати добре), вони повинні бути можливими рухами (тому, якщо на зображенні стану дошки зображено "O" посередині праворуч, тоді ви не можете використовувати бісер, що представляє середню- право).
- Кожен раз, коли настане поворот MENACE (X), знайдіть коробку з сірником із поточним положенням дошки (або деяким перетворенням на ньому), надрукованим на ній.
- Відкрийте сірникову коробку і виберіть будь-яку намистину навмання.
- Знайдіть, як трансформувався статус плати, щоб дістатись до зображення на сірниковій коробці (наприклад, повернутий на 90 градусів проти годинникової стрілки). Потім застосуйте це перетворення до бісеру (наприклад, верхній лівий стає ліво-лівим).
- Помістіть X на цьому квадраті. Вийміть вибрану намистину з сірникової коробки. Якщо ящик в результаті залишився порожнім, покладіть у вікно три випадкові (можливі) намистинки та виберіть одну з них для руху.
- Повторюйте 3-6, поки гра не закінчиться.
- Якщо MENACE виграв гру, поверніться до кожної скриньки матчів, яку взяв MENACE. Потім простежте, який кольоровий бісер він використовував для цього ходу. Помістіть два кольори з бісеру в коробку (щоб там була оригінальна намистинка + ще одна, тим самим збільшуючи ймовірність того, що MENACE зробить цей крок наступного разу, коли він потрапить у цю позицію)
- Якщо MENACE програв гру, нічого не робіть ( не замінюйте намистинки, які вона вийняла).
- Якщо MENACE намалював гру, замініть намистину, яку вона використовувала в кожному з її кроків, але не додайте зайву, щоб ви залишилися з того, що ви почали.
Це дає нам алгоритм, який дуже простий, але важкий для реалізації. Це є основою вашого виклику.
Якщо ви все ще плутаєтесь, див. Http://chalkdustmagazine.com/features/menace-machine-educable-noughts-crosses-engine/ - це те, що я прочитав, коли вперше дізнався про цей алгоритм
Виклик
Пограйте в гру Tic-Tac-Toe з комп'ютером. На кожному кроці виведіть вміст усіх сірників.
Вхідні дані
- На початку програми номер, який говорить, скільки ігор ви хочете зіграти проти MENACE
- Потім, після першого повороту MENACE, ви вводите свій хід у вигляді двох символьних рядків, перша буква - "L", "R" або "M" (зліва, справа або посередині), що стосується осі Y. Потім ви вводите іншу літеру (знову "L", "R" або "M"), цього разу посилаючись на вісь X. Повторіть всі рухи та ігри.
Виходи
- На початку кожної нової гри виведіть "нову гру".
- Після кожного ходу гравця виведіть дошку в будь-якому розумному форматі. Він не повинен виглядати красиво (наприклад, масив масивів, що представляють позиції дошки, добре).
- Після кожного ходу гравця MENACE повинен зробити хід. Виведіть плату після переміщення MENACE
- Після кожної гри виведіть вміст усіх 304 сірників. Бісер може бути представлений буквою, назвою кольору, символом або будь-яким рядком або цілим числом, яке вам подобається (без покажчиків, анонімних функцій тощо).
Правила
- Це код-гольф , тому найкоротша відповідь у байтах виграє.
- Я повинен мати можливість вводити рухи, побачивши відповідь MENACE. Ні в якому разі не передавайте всі ваші рухи в цю функцію, і дивіться, як грає гра.
- Дошка повинна бути очищена між іграми.
- У Сірничниці повинні НЕ бути очищені між іграми (це було б скинути машинне навчання)
- У вас повинно бути 304 коробки з сірниками. Будь-хто може реалізувати цей алгоритм з усіма 19 683 коробками матчів, але навчання відбувається повільно (оскільки для отримання всіх корисних вмістів потрібно багато ігор).
- Вихід може бути у будь-якому розумному форматі, а введення можна приймати відповідно до стандартів PPCG (до тих пір, як це відповідає правилу 2). Якщо вам потрібно відкоригувати формат введення (як описано в розділі « Введення »), тоді це нормально, поки це має сенс.
- Гра закінчується, коли гравець виграє (отримуючи три поспіль по діагоналі, горизонталі чи вертикалі) або якщо є нічия (дошка повна, а переможця немає)
- У той час як MENACE повинен робити можливі рухи (і мати лише можливі намистини всередині кожної скриньки), задля виклику вам не потрібно перевіряти дані користувача. Якщо вони вводять щось не так, програма може робити все, що завгодно (піти зовсім з розуму, помилка кидання тощо) - ви можете припустити, що введення правильне.
[[0, 2, 6], [4, 8, 4, 3, 3], [7, 7, 7, 7, 7, 7, 7, 8], [1], ... [3, 3, 5, 4]]
.