다음은 모든 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
행렬의 순서는 중요하지 않으며 동등한 행렬의 특정 선택은 중요하지 않으며 공백은 중요하지 않습니다.하지만 사람이 읽을 수있는 한 원하는대로 행렬을 출력하십시오.
출력은 철저해야합니다.
가장 짧은 코드가 승리합니다.
편집 : 이것은 내 첫 번째 골프 게시물이며 우승 기준에 대해 마음을 바꿨습니다.
간결함 / 골프 승리를 위해 특별히 설계되지 않은 언어로 된 가장 짧은 코드 .
나는이 기준을 사후에 바꾸는 것이 나쁜 예절이 아니기를 바란다. 그러나 나는 "정상적인"언어로하는 것이 훨씬 더 흥미로운 제안 이라고 생각 한다.