バイナリ自己回転


13

バイナリ3D配列が与えられた場合、各レイヤーについて、その上のレイヤーの列のバイナリエンコーディングで示されるステップ数だけ各列を循環的に上に回転させ、その後、その下のレイヤーの行のバイナリエンコーディング。

常に少なくとも3つのレイヤーがあります。最上層の列と最下層の行は回転させないでください。

ウォークスルー

小さな4層、2行、3列の配列から始めましょう。

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

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

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

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

最初のステップは、各レイヤーの列と行によってバイナリでエンコードされた数値を評価することです。

     3 0 2
5 [[[1,0,1],
4   [1,0,0]],

     2 1 3
5  [[1,0,1],
3   [0,1,1]],

     1 3 3
3  [[0,1,1],
7   [1,1,1]],

     3 3 1
6  [[1,1,0],
7   [1,1,1]]]

最初のレイヤーの[[1,0,1],[1,0,0]]列は回転しませんが、行はそれぞれ左に5ステップと3ステップ左に循環的に回転するため、になり[[1,1,0],[1,0,0]]ます。
 2番目のレイヤーの列は、[[1,0,1],[0,1,1]]それぞれ3、0、および2ステップ上で[[0,0,1],[1,1,1]]周期的に回転します。次に、行は、目に見える変化なしに、それぞれ、3および7ステップ左に周期的に回転します。2、1、および3ステップ
 上に[[0,1,1],[1,1,1]]回転した3番目のレイヤーは同じままで、左および6ステップを回転しても何も実行されません。
 最後に[[1,1,0],[1,1,1]]、1、3、および3ステップ上に回転した4番目のレイヤーはですが[[1,1,1],[1,1,0]]、その行は最後のレイヤーであるため、その後は回転しません。
 すべてのレイヤーを再びまとめると、バイナリの自己回転3D配列が得られます。

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

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

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

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

例:

[[[1,0,1],[1,0,0]],[[1,0,1],[0,1,1]],[[0,1,1],[1,1,1]],[[1,1,0],[1,1,1]]] 与える
[[[1,1,0],[1,0,0]],[[0,0,1],[1,1,1]],[[0,1,1],[1,1,1]],[[1,1,1],[1,1,0]]]

[[[1]],[[1]],[[0]]] 与える
[[[1]],[[1]],[[0]]]

[[[1,0,1],[1,0,1],[1,0,1]],[[0,0,1],[0,0,1],[0,0,1]],[[1,0,0],[1,0,1],[0,0,1]]] 与える
[[[0,1,1],[0,1,1],[0,1,1]],[[0,1,0],[1,0,0],[0,1,0]],[[1,0,1],[1,0,1],[0,0,0]]]

回答:


3

ゼリー 18  17 バイト

ṙ""Ḅ}
Z€çŻṖ$$Z€çḊ

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

どうやって?

ṙ""Ḅ} - Link 1, rotation helper: 3d matrix to rotate, 3d matrix of rotation instructions
    } - use the right argument for:
   Ḅ  -   un-binary (vectorises) - get the rotation amounts as a 2d matrix
  "   - zip with:
 "    -  zip with:
ṙ     -    rotate (the current row) left by (the current amount)

Z€çŻṖ$ $Z€çḊ - Main Link: 3d matrix, M
Z€           - transpose €ach (layer of M)
       $     - last two links as a monad:
     $       -   last two links as a monad:
   Ż         -     prepend a zero
    Ṗ        -     pop (i.e. remove the tail)
  ç          -   call the last Link as a dyad (i.e. f(Z€ result, ŻṖ$ result) )
        Z€   - transpose €ach (layer of that)
           Ḋ - dequeue (i.e. remove the head layer of M)
          ç  - call the last Link as a dyad (i.e. f(Z€çŻṖ$$Z€ result, Ḋ result) )

注:($$または場合によっては$$ ... $$)コードブロックの書式設定を台無しにしているようです(ただし、プレビューではなく一度だけ投稿しています)。


3

Pythonの2220 211 209 185 176 174の 164 161 159バイト

lambda m:map(R,z(map(R,z(m,['']+[z(*l)for l in m])),m[1:]+['']))
R=lambda(l,L):map(lambda r,i:r[i:]+r[:i or 0],z(*l),[int(`b`[1::3],2)%len(b)for b in L])
z=zip

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

-2バイト、ジョナサンアランのおかげ


あなたNoneは回転のためのスライス中に処理するので、私は両方['0']がなることができると信じてい[[]]ます。
ジョナサンアラン

@JonathanAllanありがとう:)
TFeld

2

APL + WIN、 53 39バイト

14バイトを節約してくれたAdámに感謝

(1 0↓⍉2⊥⍉m⍪0)⌽(¯1 0↓2⊥2 1 3⍉0⍪m)⊖[2]m←⎕

オンラインでお試しください!Dyalog Classic提供

次の形式の3D配列の入力を要求します。

4 2 3⍴1 0 1 1 0 0 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 1

生成されるもの:

1 0 1
1 0 0

1 0 1
0 1 1

0 1 1
1 1 1

1 1 0
1 1 1

説明:

m←⎕ Prompt for input

(¯1 0↓2⊥2 1 3⍉0⍪m) Calculate column rotations

(1 0↓⍉2⊥⍉m⍪0) Calculate row rotations

(...)⌽(...)⊖[2]m Apply column and row rotation and output resulting 3d array:

1 1 0
1 0 0

0 0 1
1 1 1

0 1 1
1 1 1

1 1 1
1 1 0

を囲んで使用する代わりに¨、配列全体を一度に処理するだけです。オンラインでお試しください!
アダム

@Adámありがとう。私はなぜこれを考え過ぎてネストされたルートに行ったのか分かりません:(古いですか?
グラハム


1

05AB1E41 39 バイト

εNĀiø¹N<èøJC‚øε`._}ø}N¹g<Êi¹N>èJC‚øε`._

これは長すぎるように感じます。

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

説明:

ε                    # Map each layer in the (implicit) input to:
                     # (`N` is the layer-index of this map)
 NĀi                 #  If it is not the first layer:
    ø                #   Zip/transpose the current layer; swapping rows/columns
    ¹N             #   Get the `N-1`'th layer of the input
        ø            #   Zip/transpose; swapping rows/columns
         J           #   Join all inner lists (the columns) together
          C          #   And convert it from binary to integer
                    #   Pair it with the current layer's columns we're mapping
            ø        #   Zip/transpose; to pair each integer with a layer's columns
             ε   }   #   Map over these pairs:
              `      #    Push both values of the pair separately to the stack
               ._    #    Rotate the column the integer amount of times
    ø                #   Zip/transpose the rows/columns of the current layer back
   }                 #  Close the if-statement
 N¹gi              #  If this is not the last layer (layer-index-1 != amount_of_layers):
       ¹N          #   Get the `N+1`'th layer of the input
           J         #   Join all inner lists (the rows) together
            C        #   And convert it from binary to integer
                    #   Pair it with the current layer's rows we're mapping
              ø      #   Zip/transpose; to pair each integer with a layer's rows
               ε     #   Map over these pairs:
                `    #    Push both values of the pair separately to the stack
                 ._  #    Rotate the row the integer amount of times
                     # (implicitly output the result after the layer-mapping is done)

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