Вот все двоичные матрицы 2x2
#0 #1 #2 #3 #4 #5 #6 #7 #8 #9 #10 #11 #12 #13 #14 #15
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
00 00 00 00 01 01 01 01 10 10 10 10 11 11 11 11
00 01 10 11 00 01 10 11 00 01 10 11 00 01 10 11
Две бинарные квадратные матрицы эквивалентны по отношению, ~если одну можно отобразить на другую с помощью любого количества отражений на горизонтальной или вертикальной осях .
#1 ~ #2под отражением на вертикальной оси, поэтому нам нужно оставить только один из них (не важно, какой). Точно так же #3 ~ #12, #6 ~ #9и так далее.
Цель состоит в том, чтобы создать программу, которая принимает один вход Nи печатает столько N x Nдвоичных матриц, сколько существует, так что все матрицы в выходных данных различаются в соответствии с вышеуказанным соотношением.
В ручном волновом псевдокоде допустимым решением будет
define M[i] = N by N matrix with bit pattern equal to i
for i = 0 to (2^(N^2)) - 1
valid = true
for j = i+1 to (2^(N^2)) - 1
if (equivalent(M[i], M[j]))
valid = false
break
if (valid)
print (M[i])
Для ввода N=2один действительный вывод будет
00 00 00 01 10 01 11
00 01 11 01 01 11 11
Но, выбирая разные матрицы из одного и того же класса эквивалентности, можно получить другой действительный результат.
00 10 11 11 11 10 01
00 00 00 10 11 10 10
Порядок матриц не имеет значения, конкретный выбор из эквивалентных матриц не имеет значения, и пробелы не имеют значения, выводят матрицы, как вам угодно, если они удобочитаемы.
Вывод должен быть исчерпывающим.
Самый короткий код выигрывает.
РЕДАКТИРОВАТЬ: это мой первый пост в гольф, и я передумал на критерии победы.
Самый короткий код на языке, специально не предназначенном для лаконичности / победы в гольфе .
Я надеюсь, что поменять этот критерий не сложно, но я думаю, что делать это на «нормальном» языке - гораздо более интересное предложение.