ここにすべての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
2つの2乗正方行列は、水平軸または垂直軸の任意の数の反射~
によって一方を他方にマッピングできる場合、関係の下で等価です。
#1 ~ #2
垂直軸の反射下にあるので、これらのうちの1つを保持するだけです(どちらでもかまいません)。同様に#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
1つの有効な出力は
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
マトリックスの順序は重要ではなく、同等のマトリックスからの特定の選択は重要ではなく、空白は重要ではありませんが、人間が読み取れる限り、好きなマトリックスを出力します。
出力は網羅的でなければなりません。
最短のコードが優先されます。
編集:これは私の最初のゴルフポストであり、勝利基準について考えを変えました。
簡潔さ/ゴルフの勝利のために特別に設計されていない言語の最短コード。
この基準を事後的に変更することは悪いエチケットではないことを望みますが、「通常の」言語でそれを行うことは、はるかに興味深い提案だと思います。