Вот все двоичные матрицы 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
Порядок матриц не имеет значения, конкретный выбор из эквивалентных матриц не имеет значения, и пробелы не имеют значения, выводят матрицы, как вам угодно, если они удобочитаемы.
Вывод должен быть исчерпывающим.
Самый короткий код выигрывает.
РЕДАКТИРОВАТЬ: это мой первый пост в гольф, и я передумал на критерии победы.
Самый короткий код на языке, специально не предназначенном для лаконичности / победы в гольфе .
Я надеюсь, что поменять этот критерий не сложно, но я думаю, что делать это на «нормальном» языке - гораздо более интересное предложение.
Ответы:
J
665653 байтаГрубый поиск.
использование
объяснение
источник
Желе , 19 байт
Попробуйте онлайн!
Как это устроено
источник
Pyth -
242321 байтХочу найти лучший способ получить все отражения.Спасибо @Pietu1998 за то, что я получил в гольф 2 байта!
Попробуйте это онлайн здесь .
Я собираюсь дождаться игры в гольф, прежде чем приступить к полному объяснению, но, по сути, он создает все возможные двоичные матрицы, затем
.g
группирует их по отсортированному списку всех возможных отражений, а затем берет только одно из каждой группы.источник
3
вывод начинается с[['000', '000', '00'],
отметки отсутствующего нуля в конце.^2Q
вместоQ^2
. Фикс спасает меня тоже байт: D_MM
вместоmC_Cd
.Haskell, 100 байт
Пример использования:
f 2
->[["00","00"],["00","01"],["00","11"],["01","01"],["01","10"],["01","11"],["11","11"]]
.Как это устроено:
источник
JavaScript (ES6), 195 байт
Возвращает строки, представляющие все объединенные элементы матрицы, например,
111101111
представляет матрицу 3 × 31
s с символом a0
в середине. Объяснение:источник
.map(f=(x=p++)=>x>1?f(x>>1)+x%2:"")
Mathematica, 94 байта
источник
JavaScript (ES6), 184
Это оказалось очень похоже на Нила, но в целом мешок трюков в JavaScript не так разнообразен.
Меньше гольфа
Тест Остерегайтесь, даже для входа 4 время работы слишком велико
источник