щедроты
№ 1 ( награжден )
Я добавлю 50 повторений для первого правильного ответа
№ 2 ( награжден )
Я добавлю еще 100 повторений для кратчайшего правильного ответа.
№ 3 ( открыт для представления )
Я добавлю 200 повторений для первого с более коротким правильным ответом. Существенным является не более 45% самого короткого в настоящее время ответа ( 564 байта x 0,45 = максимум 254 байта ).
Игра
Вы помните классическую игру « Nine Men's Morris » или просто « Мельница »? Существует вариация под названием Three Men Morris, которая немного напоминает изменчивые крестики-нолики.
правила
Это пустая доска игры:
a b c
1 [ ]–[ ]–[ ]
| \ | / |
2 [ ]–[ ]–[ ]
| / | \ |
3 [ ]–[ ]–[ ]
[ ]
является полем и |–/\
представляет маршруты между этими полями.
Игра для двух игроков 1
и 2
каждый из которых проходят 3 жетонов на борту. Это на самом деле уже произошло, и мы в игре. Игра выиграна, если один игрок может сформировать mill
вертикальный или горизонтальный ряд из трех жетонов игрока.
Жетоны можно перемещать на доске вдоль соединительных линий, согласно этому правилу:
В любую соседнюю пустую позицию (то есть от положения края к центру, или от центра к положению края, или от положения края к соседнему положению края
Игрок должен сделать ход, если только нет соседней пустой позиции, в этом случае ход пропускается.
Соревнование
Вы игрок, 1
и ваш ход следующий. Напишите программу или функцию, которая определяет:
- Вы можете заставить выиграть с 2 или менее ходов ( определенный выигрыш )
- Вы можете выиграть с 2 или менее ходами, если ваш оппонент допустил ошибку ( возможная победа )
- Вы не можете выиграть с 2 или менее ходами, потому что вам нужно больше ходов или потому что вынужденные ходы приводят к победе вашего противника ( невозможно победить )
Требования
- Даже если вы определенно выиграете, когда утомите своего противника, ваша программа должна закончиться за конечное время.
- Вы можете написать программу или функцию.
вход
Игроки представлены 1
и 2
. 0
определяет свободное поле. Вы можете принять входные данные в виде матрицы или массива.
определенный
A B C D
2 1 0 | 2 1 0 | 1 0 1 | 1 2 2
2 1 2 | 0 1 0 | 1 0 2 | 2 1 O
0 0 1 | 2 2 1 | 0 2 2 | O O 1
A: [2,1,0,2,1,2,0,0,1]
B: [2,1,0,0,1,0,2,2,1]
C: [1,0,1,1,0,2,0,2,2]
D: [1,2,2,2,1,0,0,0,1]
Возможно
A B C
1 0 1 | 1 0 1 | 1 2 2
1 2 2 | 1 2 0 | 0 0 1
2 0 0 | 2 0 2 | 2 1 0
A: [1,0,1,1,2,2,2,0,0]
B: [1,0,1,1,2,0,2,0,2]
C: [1,2,2,0,0,1,2,1,0]
Невозможно
A B
1 0 0 | 1 2 0
1 2 2 | 2 1 0
2 0 1 | 1 2 0
A: [1,0,0,1,2,2,2,0,1]
B: [1,2,0,2,1,0,1,2,0]
Выход
Ваша программа должна вывести / вернуть смайлик:
- Определенная победа:
:)
- Возможная победа:
:|
- Невозможно выиграть:
:(
Примеры
Определенная победа в два хода:
[2][1][ ] 1. [2][1][ ]
[2][1][2] -> [2][1][2]
[ ][ ][1] [ ][1][ ]
[2][1][ ] 1. [2][1][ ] [ ][1][ ] 2. [ ][ ][1]
[ ][1][ ] -> [ ][ ][1] -> [2][ ][1] -> [2][ ][1]
[2][2][1] [2][2][1] [2][2][1] [2][2][1]
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][ ][2] -> [1][ ][2] -> [1][ ][2] -> [ ][ ][2]
[ ][2][2] [ ][2][2] [2][ ][2] [2][ ][2]
Возможен выигрыш в два хода:
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][2][ ] -> [1][2][ ] -> [1][2][2] -> [ ][2][2]
[2][ ][2] [2][ ][2] [2][ ][ ] [2][ ][ ]
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][2][ ] -> [1][2][ ] -> [1][2][2] -> [ ][2][2]
[2][ ][2] [2][ ][2] [2][ ][ ] [2][ ][ ]
[1][2][2] 1. [ ][2][2] [2][ ][2] 2. [1][2][2]
[ ][ ][1] -> [1][ ][1] -> [1][ ][1] -> [1][1][1]
[2][1][ ] [2][1][ ] [2][1][ ] [2][ ][ ]
Невозможно выиграть в два хода:
[1][ ][ ]
[1][2][2]
[2][ ][1]
бонус
Если возможен определенный выигрыш, и ваша программа выводит ходы в одну сторону к успеху, например a1:a2
(1 ход) или a1:a2,a3:b2
(2 хода), вы можете снять 30% от вашего количества байтов.
Это код гольф - поэтому выигрывает самый короткий ответ в байтах. Стандартные лазейки запрещены.
Спасибо Питеру Тейлору, который исправил некоторые недостатки и улучшил формулировку в Песочнице .
[1,0,0,2,1,0,2,2,1]
, игрок 2 не может двигаться - это выигрыш для игрока 1?