이진 자체 회전


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]].
 두 번째 레이어 인 [[1,0,1],[0,1,1]]에는 열이 각각 3, 0 및 2 단계 씩 [[0,0,1],[1,1,1]]주기적으로 회전하여을 제공 한 다음 행이 눈에 띄는 변화없이 각각 왼쪽 및 3 단계 씩 왼쪽으로 순환됩니다. 2, 1 및 3 단계로 회전 한
 세 번째 레이어 [[0,1,1],[1,1,1]]는 동일하게 유지되며 왼쪽 및 6 단계에서 7 단계 회전해도 아무런 작업이 수행되지 않습니다.
 마지막으로 [[1,1,0],[1,1,1]]1, 3, 3 단계로 회전 한 네 번째 레이어 는입니다 [[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

파이썬 (2) , 220 (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

온라인으로 사용해보십시오!

Jonathan Allan 덕분에 -2 바이트


당신 None이 회전 슬라이싱 동안 처리하기 때문에 나는 둘 다 ['0']될 수 있다고 생각합니다 [[]].
Jonathan Allan


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

@ Adám 많은 감사합니다. ? 내가 이상이 일을 생각하고 중첩 된 경로 :( 늙어 갔다 이유를 모르겠어요
그레이엄


1

05AB1E , 41 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.