Вот все двоичные матрицы 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
Порядок матриц не имеет значения, конкретный выбор из эквивалентных матриц не имеет значения, и пробелы не имеют значения, выводят матрицы, как вам угодно, если они удобочитаемы.
Вывод должен быть исчерпывающим.
Самый короткий код выигрывает.
РЕДАКТИРОВАТЬ: это мой первый пост в гольф, и я передумал на критерии победы.
Самый короткий код на языке, специально не предназначенном для лаконичности / победы в гольфе .
Я надеюсь, что поменять этот критерий не сложно, но я думаю, что делать это на «нормальном» языке - гораздо более интересное предложение.