Создать самую короткую программу , чтобы проверить , кто выиграл в п й Tic Tac Toe игры.
Ваша программа должна работать, когда n
(ширина) иd
(номер измерения) находятся в следующих диапазонах:
n∈[3,6]∩ℕ ie a number from this list: 3,4,5,6
d∈[2,5]∩ℕ ie a number from this list: 2,3,4,5
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):
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
И так далее.
выигрыш (если вы играли достаточно многомерных крестики-нолики, это то же самое.)
Чтобы победа была, у одного игрока должны быть все смежные квадраты вдоль линии. То есть этот игрок должен иметь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>
вход :
Вход будет в STDIN. Первая строка ввода будет двумя числами, n
и d
в видеn,d
.
После этого будет строка, состоящая из координат, определяющих ходы, которые были сделаны. Координаты будут перечислены в следующем виде: 1,1;2,2;3,3
. Верхний левый угол - это начало координат (0,0 для 2D). В общем случае этот список будет аналогичен тому, 1,2,...,1,4;4,0,...,6,0;...
где первое число представляет левый-правый, второй-вверх-вниз, с третьего по третье измерение и т. Д. Обратите внимание, что первая координата - это X
первый поворот, второй Это O
первый поворот, ....
За вводом последует новая строка.
Выход :
Выход будет на STDOUT. Просто укажите, кто выиграл, если кто-то выиграл или это ничья. Если это не ничья и не победа, ничего не выводите.
Кроме того, укажите, есть ли столкновение ходов, то есть если в одном и том же месте есть как минимум два хода.
Если до завершения ввода была победа / ничья, ваша программа может делать все, что захочет.
Тестовые случаи (кто-нибудь хочет предложить больше?):
Входные данные:
4,3
0,0,0;1,1,1;1,0,1;2,0,2;0,0,1;2,0,0;2,0,1;3,0,2;3,0,1
Пример вывода:
X wins
Другой возможный вывод (требует объяснения):
1
источник
n
чтобы стать победителем, нужны ходы на линии. (Извините, что не разместил эти замечания в песочнице, но у меня даже не было времени даже увидеть их там, потому что они были опубликованы так скоро после песочницы.)Ответы:
Python,
745578 символовЯ сделал некоторые изменения и сократил их немного. Обратите внимание, что возврат True означает, что x выиграл, False означает, что y выиграл, и означает, что был сделан неверный ход.
источник
import *
наimport*
. Используйте1
для True и0
для False (удалитьT
иF
).return -1
может бытьreturn-1
(проверить удаление пробелов). Переименуйте ваши методы в одиночные методы char. Ознакомьтесь с советами по оптимизации.if l<>q:
вместоif not l==q:
.Не ответ - Java
Мне было любопытно посмотреть, сколько было способов выиграть для данного n, d, поэтому я написал этот код, чтобы перечислить их все.
Я проверил это вручную на n, d = 2..3,2..3, и он, кажется, работает… после этого число возможных способов выиграть быстро растет, как показано ниже:
Сгенерировав все выигрышные наборы, я мог бы расширить программу, чтобы сравнить данные с выигрышными сетами, но, конечно, этот метод никогда не выиграл бы в гольфе. Так что я был рад остановиться здесь - за исключением того, что выглядело так, как будто я мог найти решение в закрытой форме для количества способов выиграть в зависимости от n и d… Это Количество способов выиграть = 0,5 ((n + 2) ^ d - n ^ d).
источник
C ++ 794
849символовВывод: «X» (X побед), «O» (O побед) или «!» (незаконная попытка переезда).
Это просто отображает точки в линейный массив и проверяет все возможные подмножества размера n, сначала на постоянство в X или O, а затем на наличие в линии. Чтобы проверить нахождение в линии, координаты точек в каждом подмножестве проверяются по одному; каждый из них должен либо увеличиваться от 0 до n-1, уменьшаться от n-1 до 0, либо быть постоянным. Точки естественным образом упорядочены в линейном массиве, поэтому имеет смысл называть координаты, увеличивающиеся или уменьшающиеся для данного набора точек.
Спасибо Говарду за указание на серьезную ошибку в первой версии.
В знак солидарности с Quincunx я должен отметить, что в случае победы C ++ победа будет пародией
источник
X wins
илиO wins
. Вполне законно выводить1
или2
(или некоторые другие варианты), если вы объясните в своем ответе, что они обозначают. Как я уже сказал (выделение добавлено): « укажите, кто победил».