Вот одна интересная проблема, о которой я подумал на днях, когда биты кода конкурируют с другими битами кода не только в свойстве, которое имеет код, но и в игре против тех других битов кода.
Ваша задача состоит в том, чтобы создать программу, которая принимает текущее состояние доски Го и определяет, какой ход сделать или пройти.
Ваша программа примет следующее:
19 строк, каждая из которых содержит 19 символов, представляющих фигуры, которые в настоящее время находятся на доске Го. Символ
0
представляет пустой квадрат,1
черный и2
белый.Два числа, представляющие количество фигур заключенных, которые есть у каждого игрока (черный, затем белый).
Одно число, представляющее чью очередь (черное или белое). Как и выше,
1
черный и2
белый.
и выведите одно из следующего:
Пара координат,
a b
представляющая координаты для перемещения.1 1
является верхним левым квадратом, а первое и второе числа представляют перемещение вниз и вправо соответственно.Строка
pass
, представляющая ход для прохождения.
Например, программа может получить следующий вход:
0000000000000000000
0000000000000000000
0000000000000000000
0001000000000002000
0000000000000000000
0000000000000000000
0001210000000000000
0000100000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0002000000000001000
0000000000000000000
0000000000000000000
0000000000000000000
0 0 1
которая представляет игру, в которой было сыграно всего несколько ходов.
Затем программа может выдать результат 6 5
, что означает «положить черный камень в точку 6 сверху и 5 слева». Это захватило бы белый камень в 7 5
. Состояние доски будет затем изменено на:
0000000000000000000
0000000000000000000
0000000000000000000
0001000000000002000
0000000000000000000
0000100000000000000
0001010000000000000
0000100000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0002000000000001000
0000000000000000000
0000000000000000000
0000000000000000000
1 0 2
(Обратите внимание, что хотя белый камень был захвачен, он считается узником черного.)
Ваш код должен дополнительно удовлетворять следующим свойствам:
Если вашей программе присваивается одинаковое состояние ввода, она всегда должна выдавать один и тот же вывод. Это детерминизм Go AI. У него не должно быть случайного компонента.
Ваша программа не должна занимать более 60 секунд, чтобы определить, что делать. Это правило не будет строго применяться из-за различий в вычислительной мощности, но оно должно быть сделано в разумные сроки.
Исходный код вашей программы не должен превышать 1 мегабайт (1 048 576 байт).
Ваша программа всегда должна делать легальные шаги. Ваша программа не может сделать ход там, где камень уже существует, и не может поместить фигуру, которая привела бы к захвату группы ее собственных камней. (Единственное исключение из правил для целей этой задачи состоит в том, что программе разрешено создавать позицию, которая была изначально там - поскольку ей дается только текущая позиция доски, нельзя ожидать, что она запомнила, какие ходы были сделаны. перед.)
Ваша заявка будет затем играть в турнире «все играют все» против всех остальных заявок, в игре «Го», где состояние доски начинается как пустое, и каждая программа по очереди получает информацию о позиции доски и делает ход. ,
Каждая пара представлений будет играть два раунда - один раунд с каждым игроком, являющимся черным. Поскольку ИИ в этой задаче являются полностью детерминированными, два одинаковых ИИ, играющие вместе, всегда приводят к одной и той же игре.
Условия для победы таковы:
Если ваша программа воспроизводится до конца игры, для определения победителя будут использованы китайские правила начисления очков. Коми не будет применяться.
Если ваша программа воспроизводится до достижения более раннего состояния, что приводит к бесконечному циклу, две программы будут объявлены связанными.
Ваша заявка будет оцениваться по количеству баллов по сравнению с другими работами. Выигрыш стоит 1 очко, а ничья - полбалла. Представление с наибольшим количеством очков является абсолютным победителем.
Это вызов царя горы, в котором любой может опубликовать новую заявку в любое время, и турнирная таблица будет периодически пересматриваться, когда это произойдет.
источник
Ответы:
Вот моя запись, чтобы получить этот вызов с земли. Код Python:
Согласно вашим правилам, всегда играть в «пас» - это правильная (хотя и плохая) стратегия.
источник
Java: выбрать место, любое место
Просто выбирает места на доске, чтобы проверить на валидность. Он использует PRNG, но с заданным начальным значением, так что он детерминирован. Он использует разные порции цикла PRNG в зависимости от того, сколько пройдено оборотов.
Для каждой позиции кандидата он проверяет, является ли это правильным ходом (но не умным ). Если это не так, он переходит к следующему кандидату. Если он не может найти правильный ход после 1000 попыток, он проходит.
источник
Немного Скала:
Из чтения Википедии, я думаю, это побьет текущее решение.
источник
1 1
иpass
).1 1
, поскольку программа всегда запускается заново каждый раз, когда меняется плата.Ява
Выбирает первое пустое место. Выигрывает против любого из ИИ на момент публикации.
источник
1 1
был бы захвачен белым (теперь пустым) и не мог быть сыгран черным в следующем ходу.