回転不変フィンガープリンティング


15

ポリオミノをいくつか持っており、それらを一意に識別したいと考えていますが、ポリオミノは回転させることができます。

たとえば、L-テトロミノを持っている場合

x
x
xx

次のいずれかと同じフィンガープリントが必要です。

         xx
  x       x      xxx
xxx  ,    x  or  x

注:平面上での回転のみが許可されている(つまり、片側のポリオミノである)ため、次のポリオミノは異なるものになります。

 x
 x
xx 

チャレンジ

この課題のためにタスクがかかりフィンガープリント機能/プログラムを実装することであるm×nブール/ 01リスト/列の-valuedマトリックス/リスト/ ..ポリオミノ戻る文字列コード-ポリオミノの指紋を。指紋は、可能なすべての回転に対して等しくなければなりません(一般的に4)。

入出力

  • m1n1(すなわち、無空ポリオミノ)
  • あなたは、mnが可能な限り小さいことを保証されます(すなわち、すべて0mnに合うようにトリミングされますn
  • 入力が保証されます
    • 単純に接続された
    • 穴がない
  • 出力は、ポリオミノの可能な各回転に対して同じ文字列でなければなりません

いくつかの等価クラスがあります。各クラスのフィンガープリントは同じである必要があり、2つの異なるクラスの2つのポリオミノは異なる必要があります。

例のL-テトロミノの回転:

[[1,0],[1,0],[1,1]]
[[0,0,1],[1,1,1]]
[[1,1],[0,1],[0,1]]
[[1,1,1],[1,0,0]]

J-テトロミノ:

[[0,1],[0,1],[1,1]]
[[1,1,1],[0,0,1]]
[[1,1],[1,0],[1,0]]
[[1,0,0],[1,1,1]]

単位ポリオミノ:

[[1]]

5×1バー:

[[1,1,1,1,1]]
[[1],[1],[1],[1],[1]]

2×2のコーナー:

[[1,1],[1,0]]
[[1,0],[1,1]]
[[0,1],[1,1]]
[[1,1],[0,1]]

W-ペントミノ:

[[1,0,0],[1,1,0],[0,1,1]]
[[0,0,1],[0,1,1],[1,1,0]]
[[1,1,0],[0,1,1],[0,0,1]]
[[0,1,1],[1,1,0],[1,0,0]]


常に出力する場合""(空の文字列)、すべての要件を満たしていますか?
ダニエルワグナー

@DanielWagner:「[..] 2つの異なるクラス [指紋] からの2つのポリオミノの場合、異なる必要があります」-いいえ、無効です。
ბიმო

一貫してソートされた配列の可能なすべての回転を出力することは有効ですか?
シャギー、

1
@Shaggy:はい、それはすべての基準を満たすでしょう。
ბიმო

回答:


7

Python 2、48バイト

f=lambda l,z=5:z and max(l,f(zip(*l)[::-1],z-1))

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

リスト比較に関して、4つのローテーションのうち最大のものを使用します。FlipTackのソリューションに基づいています

このコードは、Python 2の機能を使用して、さまざまなタイプのオブジェクトを比較します。の基本ケース値は、どのリストよりも小さいため、0無害ですmax。また、zip入力がリストのリストである間にタプルのリストを生成しますが、タプルはリストよりも大きいため、入力リストのリストは決して競合しません。これが、4回ではなく5回ローテーションする理由です。そのため、初期リストのtuplifiedバージョンに戻ります。(入力の許可された形式であれば、タプルのリストを取得することもできます。)


4

Python 3、63バイト

def f(m):M=[];exec("m=[*zip(*m[::-1])];M+=m,;"*4);return min(M)

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

辞書の最小値で回転を見つけ、それを印刷します。

ラムダ形式は同じバイトカウントで入力されます。

lambda m,M=[]:exec("m=[*zip(*m[::-1])];M+=m,;"*4)or min(M[-4:])

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


として書き換えるlambdaことで58に到達できますlambda m,M=[]:exec("m=[*zip(*m[::-1])];M+=m,;"*4)or min(M)exec常に戻るため、動作しますNone
nedla2004

@ nedla2004一度だけ実行し、次にとして危険な取得することができることをMすでに移入され...
FlipTack

@ nedla2004 ...しかし、問題の原因を特定M[-4:]することで、同じバイトカウントが得られます。
FlipTack

私が使用したテストは、同じ「ハッシュ」で入力をチェックするだけだったので、私はそれに出くわしませんでした。それは理にかなっている。
nedla2004

2

ゼリー、5バイト

ZU$ƬṂ

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

完全なプログラム。

すべての可能な回転を生成し、辞書編集の最小値を選択します。

シングルトンリストは[]出力にラップされないことに注意してください。入力にシングルトンリストが存在する唯一のケースは垂直線(単位polyominoを含む)であり、これは同じサイズの水平線(1つはラップされていない)と同じであるため、それは重要ではありません。 )。アウター[]も存在しない唯一のケースは、ユニットポリオミノです。


私は挑戦を読んだとき、私はこれが起こることを知っていた:)
ngn


2

K(ngn / k)、16バイト

{a@*<a:3{+|x}\x}

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

回転の最小

{ } 引数付きの関数 x

{+|x}回転、すなわち逆(|)および転置(+

3{ }\中間結果を保存して3回適用します。これは4回転のリストを返します

a: に割り当てます a

< ascend(ソート昇順の順列を計算)

* 最初

a@インデックスaそれと


1

Japt -g、6バイト

4Æ=zÃñ

それを試してみてください

           :Implicit input of 2d-array U
4Æ         :Map the range [0,4)
   z       :  Rotate U 90 degrees
  =        :  Reassign to U
    Ã      :End map
     ñ     :Sort
           :Implicit output of first element

ある-gフラグが必要?並べ替えとは、すべての初期ローテーションが同じリストになることを意味する必要があります。そのため、何かが欠落していなければ、完全なリストが指紋として正常に機能するはずです。
カミルドラカリ

@KamilDrakari、あなたは正しいかもしれません-私が言ったように、私は完全に挑戦を理解したかどうかはわかりません。ただし、それを残しても問題はありません。1バイトもかかりません。
シャギー

@KamilDrakari:必須ではありませんが、バイトカウントにカウントされないため、害はありません。
ბიმო

1

J、16バイト

シャギーのおかげで-2バイト

[:/:~|.@|:^:(<4)

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

J、18バイト

0{[:/:~|.@|:^:(<4)

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

ポリミノの語彙的にソートされた回転のリスト内の最初のアイテムを返します。

説明:

            ^:(<4)  - do the verb on the left 4 times, storing all the steps
       |.@|:        - tranpose and reverse
    /:~             - sort up the 4 matrices
  [:                - cap the fork
0{                  - take the first matrix  

@Shaggyありがとう!
ガレンイワノフ

0

05AB1E10 8バイト

3FÂø})Σ˜

-2バイトのおかげで @Shaggyの

オンラインで試すたり、すべてのテストケースを確認してください

説明:

3F  }       # Loop 3 times
  Â         #  Bifurcate (short for Duplicate & Reverse) the top of the stack
            #  (which is the input-matrix implicitly the first iteration)
   ø        #  Transpose: swap rows/columns
     )      # After the loop, wrap everything on the stack in a list
      Σ˜    # Sort this list of matrices by their flattened array (and output implicitly)

注:ßまたはで最小値をとるWと暗黙的に平坦化されるため、が出力されます0。並べ替え{は行列のリストでは機能しないようですΣ˜。そのため、代わりに使用します。


1
@Shaggyありがとう!:)その場合、最後の2バイトは削除できます}。これは、その後に何も来なければ暗黙的に行われるためです。
ケビンCruijssen

1
今日、私は05AB1Eについて何かを学びました!:) Japtでも同じです。
シャギー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.