щедроты
№ 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?Ответы:
Haskell,
580564441 байтЭто то, как далеко я могу играть в гольф на данный момент. Не уверен, что другие языки могут победить.
Вызовите
m
список списков, таких как[[2,1,0],[2,1,2],[0,0,1]]
(Определенный A).Тестовый код:
mapM_ m al
возвращает:источник
C # -
739663 байтаЗавершить программу, читает входные данные из argv и, кажется, работает. Запустите это как
Если этот метод ввода неприемлем, я буду рад изменить его (никогда не нравится использование argv).
Я не был готов опубликовать это вчера, потому что у меня не было возможности сыграть в него много (у меня не было столько времени, и я мог бы быть вне практики), но так как ответа еще не было, я ' Я опубликую это в любом случае, я, конечно, не ожидаю награду, я бы предпочел, чтобы она досталась кому-то, кто приложил немного больше усилий, прежде чем отправлять!
Редактировать: заменил все bool-ы на целые, что означало, что я мог лучше использовать Linq, и мне удалось свернуть оба цикла foreach, что дало большую экономию. Я немного удивлен, что
h
счетчик работает ... ++ такая тонкая утилита.Программа очень проста, она просто исследует каждый возможный набор ходов (сохраняет состояние доски в строке []). Он перебирает все наши возможные ходы (доски, на которых это происходит) и подсчитывает количество ответов нашего оппонента, которые мы можем успешно победить (
G
) (то есть те, которые мы выиграли, а он нет). Также подсчитывается количество возможных ответов (h
). Если мы можем выиграть любой, то это возможно, и мы добавляем 1 к сумме, если мы можем выиграть их все, это определенно, и мы добавляем 2 к сумме. Таким образом, максимальный некоторый результат является нашим наилучшим возможным результатом, и мы индексируем строку «(|))», чтобы вернуть соответствующее лицо. Обратите внимание, что нам нужно дополнительное ")", потому что сумма может быть 2 или 3, если она определенная (возможно, мы не сможем побить ни одного ответа, уже выигравшего с первого хода, поэтому возможная проверка немного вводит в заблуждение).Программа проверяет победу, создавая строку с доски, то есть разделенные пробелами строки и столбцы, и просто ищет строку из 3 символов игрока в этой строке (например, «201 201 021 220 002 111» является победить для нас)
Вот мой тестовый скрипт:
Какие выводы
источник
PowerShell
576550 байтМеня не так легко удержать - если я не смогу получить C # ниже 631 байта, мне придется вместо этого использовать другой язык! Я надеюсь, что Лейф Виллертс выбьет из своего ответа 5 байтов, потому что я решил, что я не слишком люблю PowerShell, возможно, мне просто нужно взглянуть на него объективно с точки зрения количества байтов ...
Это сценарий, вы запускаете его
. .\mill.ps1 "201102021"
. Это довольно хорошая копия моего ответа на C #, только на языке, с которым у меня мало опыта. Я не приложил слишком много усилий, чтобы играть в гольф, потому что это заняло так много времени, чтобы начать работать в первую очередь, и уже достаточно компактно.Изменить: не мог просто оставить эти
[Math]::Floor
звонки тамЕсли вы описываете, как это работает ... ответ на C # для вас, но, надеюсь, комментарии прояснят это. Точки с запятой могут не совсем совпадать с однострочной командой, я еще не уверен, где они нужны и не нужны, и не скопировал их обратно, когда я поставил все это в одну строку.
Тестовый скрипт (PowerShell):
Вывод их:
источник
Python 3,
566557 байтМне нужно будет посмотреть, смогу ли я сыграть в гольф дальше или получу бонус в 30%, но после долгих проволочек вот мой ответ.
Ungolfed:
источник