反射まで異なるバイナリ行列を生成します


14

ここにすべての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=21つの有効な出力は

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

マトリックスの順序は重要ではなく、同等のマトリックスからの特定の選択は重要ではなく、空白は重要ではありませんが、人間が読み取れる限り、好きなマトリックスを出力します。

出力は網羅的でなければなりません。

最短のコードが優先されます。

編集:これは私の最初のゴルフポストであり、勝利基準について考えを変えました。

簡潔さ/ゴルフの勝利のために特別に設計されていない言語の最短コード。

この基準を事後的に変更することは悪いエチケットではないことを望みますが、「通常の」言語でそれを行うことは、はるかに興味深い提案だと思います。


5
PPCGへようこそ!これは素晴らしい最初の課題ですが、結果を柔軟な形式で出力できるようにすることをお勧めします(たとえば、各マトリックスをリストのリストとして)。そうすれば、人々は出力のフォーマットを心配する必要がなく(簡単に同じバイト数を取り、主な課題のゴルフを減らすことができる)、チャレンジの非常に興味深いコア(対称性までのユニークなマトリックスを見つける)に集中することができます重要)。
マーティンエンダー

フィードバックをありがとう、あなたの両方、私はそれに応じて質問を編集しました。
-spraff

2
回転を等価として含めたいと思いました。また、各ビットを等価として反転することも含めたいと思いました。また、行/列の順列を等価として含めたいと思いました。最終的に、要件をかなり単純にするために、私はarbitrary意的な決定を下しました。バリエーションを投稿してください。
spraff

1
私たちは、過去にこのことを議論してきたし、支配に対して除くまたはコードのゴルフ大会で特定の言語を罰する、オフトピック考慮しなければならないそうその挑戦を意味します。さらに、受け入れられた答えは、チャレンジ勝つ答えであり、これは、ゴルフに関する質問のコードの最短コードを意味します。要約:回答をまったく受け入れたくない場合は、受け入れないでください。ただし、回答を受け入れる場合は、最短の回答にする必要があります。
デニス

1
最後に、J言語はゴルフ言語ではなく、25年間存在していた高レベルで汎用の高性能プログラミング言語です。現在のルールでさえ、あなたはまだ間違った答えを受け入れました。
デニス

回答:


1

J、66 56 53バイト

[:~.,~{.@/:~@(2:_&(][:,(;|.;|."1)&>)<)@$"#.2#:@i.@^*:

ブルートフォース検索。

使用法

   f =: [:~.,~{.@/:~@(2:_&(][:,(;|.;|."1)&>)<)@$"#.2#:@i.@^*:
   f 2
┌───┬───┬───┬───┬───┬───┬───┐
│0 0│0 0│0 0│0 1│0 1│0 1│1 1│
│0 0│0 1│1 1│0 1│1 0│1 1│1 1│
└───┴───┴───┴───┴───┴───┴───┘
   # f 3
168
   # f 4
16576

説明

[:~.,~{.@/:~@(2:_&(][:,(;|.;|."1)&>)<)@$"#.2#:@i.@^*:  Input: integer n
                                                   *:  Square n
                                           2      ^    Compute m = 2 ^ (n ^ 2)
                                               i.@     Make a range [0, m)
                                            #:@        Convert each to binary digits
    ,~                                                    Pair, make [n, n]
                                       $"#.            Reshape each binary list
                                                          to a matrix with size [n, n]
             (                       )@                Operate on each
                                    <                    Box it, call x
              2:                                         The constant 2
                _&(                )                     Repeat that many times on x
                       (        )&>                        For each box
                            |."1                             Reverse by column
                         |.                                  Reverse by row
                           ;                                 Join them
                        ;                                    Join with initial
                    [:,                                    Flatten
                   ]                                       Return that as the new x
         /:~@                                          Sort each
      {.@                                              Take the head of each
[:~.                                                   Unique and return

4

ゼリー、19 バイト

Ṛ€;U;
2ḶṗṗµWdz¡Ṃµ€Q

オンラインでお試しください!

使い方

2ḶṗṗµWdz¡Ṃµ€Q  Main link. Argument: n (integer)

2Ḷ             Unlength 2; yield [0, 1].
  ṗ            Cartesian product; construct all vectors of {0, 1}^n.
   ṗ           Cartesian product; construct all vectors of ({0, 1}^n)^n.
               This yields A, the array of all binary n×n matrices.
    µ     µ€   Begin a new, monadic chain and apply it to all matrices M in A.
     W           Wrap; yield [M].
      dz¡        Call the helper link n times, initially with argument [M], then
                 on the previous return value.
         Ṃ       Take the minimum of the results.
               This replaces all matrices with the lexicographical minimum of their
               equivalence classes, mapping equivalent matrices to the same matrix.
            Q  Unique; deduplicate the resulting array of matrices.

Ṛ€;U;          Helper link. Argument: L (array of matrices)

Ṛ€             Reverse the order of the rows of each M in L.
   U           Reverse the order of the columns of each M in L.
  ;            Concatenate the resulting matrix arrays.
    ;          Concatenate the result with L.

2

Pyth- 24 23 21バイト

すべての反射を取得するより良い方法を探したいです。

2バイトのゴルフをしてくれた@ Pietu1998に感謝します!

hM.gS+K_Bk_MMKcRQ^`T*

こちらからオンラインでお試しください

完全な説明を行う前にゴルフを待ちますが、本質的にすべての可能なバイナリ行列を.g作成し、すべての可能な反射のソートされたリストでそれらをループし、各グループから1つだけを取得します。


引数付きで実行すると3、出力が始まり[['000', '000', '00'],、最後にゼロがないことに注意してください。
-spraff

@spraffおっと、^2Q代わりにやったQ^2。修正するとバイトも節約できます:D
Maltysen

@spraffが修正しました。
マルティセン

_MM代わりにできると確信していますmC_Cd
-PurkkaKoodari

@ Pietu1998そうそう、ありがとう!
マルティセン

1

Haskell、100バイト

import Data.List
r=reverse
e#n=mapM id$e<$[1..n]
f n=nubBy(\a b->elem a[r b,r<$>b,r$r<$>b])$"01"#n#n

使用例:f 2-> [["00","00"],["00","01"],["00","11"],["01","01"],["01","10"],["01","11"],["11","11"]]

使い方:

e#n=mapM id$e<$[1..n]        -- helper function: creates a list of all combinations
                             -- of the elements of e of length n
                             -- "01" # 2 -> ["00","01","10","11"]

                   "01"#n#n  -- creates all binary n x n matrices
nubBy                        -- remove duplicates according to the equivalence
                             -- relation
   \a b ->                   -- a equals b if
       a elem                -- a is an element of
         [r b,r<$>b,r$r<$>b] -- the list of reflections of b 

1

JavaScript(ES6)、195バイト

n=>[...Array(p=1<<n*n)].map(_=>(p++).toString(2).slice(1)).filter((s,i,a)=>![1,0,1].some(c=>a.indexOf((c?b.reverse():b=b.map(s=>[...s].reverse().join``)).join``)<i,b=s.match(eval(`/.{${n}}/g`))))

連結されたすべての行列エントリを表す文字列を返します。たとえば1111011111sの3×3行列を表します0。説明:

n=>[...Array(p=1<<n*n)].map(            Enumerate all binary matrices
 _=>(p++).toString(2).slice(1)          Convert to padded binary
).filter((s,i,a)=>![1,0,1].some(        Check reflections of each matrix
 c=>a.indexOf((c?b.reverse():           Reverse the order of lines
  b=b.map(s=>[...s].reverse().join``    Or reverse each line
  )).join``)<i,                         Has this been seen before?
 b=s.match(eval(`/.{${n}}/g`))))        Reshape string into a square

再帰的な数値からバイナリへの関数の長さはまったく同じです.map(f=(x=p++)=>x>1?f(x>>1)+x%2:"")
。– ETHproductions

1

Mathematica、94バイト

DeleteDuplicatesBy[{0,1}~Tuples~{#,#},Sort@Join[Join@@Outer[Reverse,{#},{1,2,{1,2}},1],{#}]&]&

1
こんにちはJHM!答えてくれてありがとう。私はMathematicaをあまりよく理解していないので、何が起こっているのかについて少し説明を加えていただけますか?(私はあなたの他の最近の答えに同じことを投稿しました。このサイトでの答えに対するいくつかの説明を与えることは強い期待です)
isaacg

0

JavaScript(ES6)、184

これはNeilのものと非常に似ていることが判明しましたが、javascriptのすべてのトリックのバッグはすべてそれほど多様ではありません。

n=>eval("r=x=>[...x].reverse();for(l='',i=m=1<<n*n;i<m+m;i++)a=i.toString(2).slice(1).match(eval(`/.{${n}}/g`)),[b=a.map(x=>r(x).join``),r(a),r(b)].some(x=>~l.search(x))?0:l+=a+`\n`")

少ないゴルフ

n=>{
  r = x =>[...x].reverse();
  for(l = '', i = m = 1<<n*n; i < m+m; i++)
    a = i.toString(2).slice(1).match(eval(`/.{${n}}/g`)), // base matrix as an array of strings
    b = a.map(x => r(x).join``), // horizontal reflection
    c = r(a), // vertical reflection
    d = r(b), // both reflections
    // check if already found 
    [b, c, d].some(x => ~l.search(x)) // using search, arrays are converted to comma separated strings 
      ? 0 
      : l += a+`\n` // add new found to list (again as a comma separated string)
  return l
}

テストが実行されている時間が過度に長くなっても入力4のために、用心します

f=n=>eval("r=x=>[...x].reverse();for(l='',i=m=1<<n*n;i<m+m;i++)a=i.toString(2).slice(1).match(eval(`/.{${n}}/g`)),[b=a.map(x=>r(x).join``),r(a),r(b)].some(x=>~l.search(x))?0:l+=a+`\n`")

function update() {
  var i=+I.value;
  
  result = f(i)
  count = result.split('\n').length
  O.textContent = count+'\n'+result
}

update()
Input <select id=I onchange="update()"><option>2<option>3<option>4<option>5</select>
<pre id=O></pre>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.