Создать детерминированную программу для воспроизведения п d крестиков-ноликов с другими соперниками.
Ваша программа должна работать, когда n
(ширина) и d
(номер измерения) находятся в следующих диапазонах:
n∈[3,∞)∩ℕ ie a natural number greater than 2
d∈[2,∞)∩ℕ ie a natural number greater than 1
n = 3; d = 2
(3 2, т.е. 3 на 3):
[][][]
[][][]
[][][]
n = 3; d = 3
(3 3, т.е. 3 на 3 на 3):
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
n = 6; d = 2
(6 2, т.е. 6 на 6):
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
И так далее.
Входные данные:
Вход будет в STDIN. Первая строка ввода будет двумя числами n
и d
в форме n,d
.
После этого будет строка, состоящая из координат, определяющих ходы, которые были сделаны. Координаты будут перечислены в следующем виде: 1,1;2,2;3,3
. Верхний левый угол - это начало координат (0,0 для 2D). В общем случае этот список будет аналогичен тому, 1,2,...,1,4;4,0,...,6,0;...
где первое число представляет левый-правый, второй-вверх-вниз, с третьего по третье измерение и т. Д. Обратите внимание, что первая координата - это X
первый поворот, второй Это O
первый поворот, ....
Если это будет первым ходом, вводом будет число, за которым следует 1 пустая строка.
Для согласованности ввод всегда заканчивается новой строкой. Пример ввода (\ n - новая строка):
10,10\n0,0,0,0,0,0,0,0,0,0;0,2,3,4,5,6,7,8,9,0;0,1,2,3,4,5,6,7,8,9\n
Для первого хода:
10,10\n\n
где \n
символ новой строки.
Выход:
Выведите ход, который вы хотите сделать, в том же формате, что и ввод (список через запятую). Неверный ход (т. Е. Тот, который уже был сделан) приведет к проигрышу в игре.
Примечание: Вы можете использовать генератор случайных чисел, если вы заполняете его значением, таким образом, чтобы каждый прогон был идентичен при одинаковых условиях. Другими словами, программа должна быть детерминированной.
Примечание: разрешены только действительные ходы.
Игры-победители (если вы играли в достаточно многогранные крестики-нолики, это то же самое.)
Чтобы победа была, у одного игрока должны быть все смежные квадраты вдоль линии. То есть этот игрок должен иметь n
ходы на линии, чтобы быть победителем.
Рядом:
- каждая плитка - это точка; например (0,0,0,0,0) является точкой в
d=5
- соседние плитки - это плитки, так что они обе являются точками на одном и том же d-кубе. Другими словами, расстояние Чебышева между плитками равно 1.
- другими словами, если точка
p
смежна с точкойq
, то каждая координата вp
s соответствующей координатеq
отличается от нее не более чем на единицу. Кроме того, хотя бы пара координат отличается ровно на одну.
линии:
- Линии определяются векторами и плиткой. Линия - это каждая ячейка, пораженная уравнением:
p0 + t
<
some vector with the same number of coordinates as p0>
Условия симуляции и выигрыша:
Укажите в своем ответе, готов ли он к оценке. То есть четко укажите, выполнен ли ваш ответ.
Если ваш ответ помечен как выполненный, он не будет оценен, по крайней мере, через 24 часа после последнего редактирования кода.
Программы должны работать в автономном режиме. Если программа обнаруживает мошенничество, она автоматически получит оценку
-1
и больше не будет оцениваться. (Как бы кто-нибудь в конечном итоге обманул их программы?)Если ваша программа выдает неверный вывод, она сразу же считается проигрышем для игры
Если ваша программа не выдает результат через 1 минуту, это сразу же считается проигрышем для игры. При необходимости оптимизируйте скорость. Я не хочу ждать час, чтобы протестировать программу другого.
Каждая программа будет запущена против других программ дважды для каждой
n
в диапазоне[3,6]
и каждойd
в диапазоне[2,5]
, один раз какX
и один раз какO
. Это один раунд.За каждую игру, которую выигрывает программа, она получает
+3
свой счет. Если программа связана (1 победа и 1 поражение в одном раунде или ничья в обеих играх), то она получает+1
. Если программа потеряна, то она получает+0
(т.е. без изменений).Программа с наибольшим количеством очков выигрывает. Если будет ничья, то выигрывает программа с наименьшим количеством проигранных игр (из числа соперников).
Примечание. В зависимости от количества ответов мне может понадобиться помощь в проведении тестов.
Удачи! И пусть симуляторы всегда идут вам на пользу!
источник
Ответы:
Python 3
Это просто случайный ай. Он случайным образом выбирает ход из ходов, которые все еще доступны.
источник
Python 2.7
Это представление в процессе разработки, которое я предоставляю, чтобы дать скелет / вдохновение другим ответчикам. Он работает, перечисляя каждую возможную выигрышную линию, а затем применяя эвристику для оценки этой строки в соответствии с ее ценностью. В настоящее время эвристика пуста (сверхсекретные работы). Я также добавил обработку ошибок win и clash.
Примечания по проблеме
Сколько выигрышных линий? Рассмотрим одномерный случай; Есть 2 вершины, 1 ребро и 1 линия. В двух измерениях у нас есть 4 вершины, соединенные 2 линиями, и 4 ребра, соединенные 2 * n линиями. В 3 измерениях у нас есть 8 вершин, соединенных 4 линиями, 12 ребер, соединенных 6 * n линиями, и 6 граней, соединенных
3*n^2
линиями.В общем, давайте назовем вершину 0-гранью, ребро 1-гранью и т. Д. Затем
N(i)
обозначим число i-фасетов,d
число измерений иn
длину стороны. Тогда количество выигрышных линий равно0.5*sum(N(i)*n^i,i=0..d-1)
.Согласно википедии
N(i)=2^(d-i)*d!/(i!*(n-1)!)
, итоговая формула:sum(2^(d-i-1) n^i d! / (i! * (n-i)!),i=0..d-1)
какой вольфрам | альфа не очень любит. Это становится очень большим довольно быстро, поэтому я не ожидаю, что моя программа будет иметь управляемое время выполнения для d> 8.
Некоторые результаты (извините за форматирование:
I / O
На данный момент ввод должен быть введен как:
tictactoe.py <ret> n,d <ret> move;move <ret>
- обратите внимание на несколько строк и без финала;
.Вывод выглядит так
(x_1,x_2,x_3...)
, например:tictactoe.py <ret> 6,5 <ret> <ret>
=>0, 0, 0, 0, 0
tictactoe.py <ret> 6,5 <ret> 0,0,0,0,0;0,0,0,0,5 <ret>
=>0, 0, 0, 5, 0
Редактировать: для ввода / вывода, добавлена логика. Я полагаю, что это теперь готово отметить
Обратите внимание, что этот комментарий изначально был заполнителем, который я удалил и удалил.
источник
Python 2
Большая часть кода точно такая же, как случайный ИИ Quincunx . Вместо случайного выбора хода он выбирает первый доступный ход лексикографически (то есть (0,0, ... 0), затем (0,0, ... 1), затем (0,0, ... 2) , и т.д.).
Это довольно мусорная стратегия, но она почти всегда превосходит игру наугад.
источник