Двоичное вращение


13

Для заданного двоичного трехмерного массива для каждого слоя циклически вращайте каждый из его столбцов на столько шагов, сколько указано двоичным кодированием столбцов слоя над ним, а затем циклически вращайте влево каждую из своих строк на столько шагов, сколько указано двоичное кодирование строк слоя под ним.

Там всегда будет как минимум три слоя. Столбцы верхнего слоя и строки нижнего слоя не должны вращаться.

Прохождение

Начнем с небольшого четырехслойного массива из трех столбцов с двумя строками:

[[[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 и 7 шагов соответственно, без видимых изменений.
 Третий слой, [[0,1,1],[1,1,1]]повернутый на 2, 1 и 3 шага, остается прежним, и ни один из шагов с вращением влево на 6 и 7 шагов ничего не делает.
 Наконец, четвертый слой, [[1,1,0],[1,1,1]]повернутый на 1, 3 и 3 ступени, является [[1,1,1],[1,1,0]], но его ряды не поворачиваются впоследствии, так как это последний слой.
 Снова собрав все слои вместе, мы получим бинарный трехмерный массив с автоповоротом:

[[[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 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

Попробуйте онлайн!

-2 байта, благодаря Джонатану Аллану


Поскольку вы обрабатываете Noneво время нарезки для вращения, я считаю, что оба ['0']могут стать [[]].
Джонатан Аллан

@JonathanAllan Спасибо :)
TFeld

2

APL + WIN, 53 39 байт

Большое спасибо Адаму за сохранение 14 байт

(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

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)

0

Wolfram Language (Mathematica) , 138 131 125 123 байта

t=Map@Thread
m=MapThread[r=RotateLeft,#,2]&
b=(a=ArrayPad)[Map@Fold[#+##&]/@#,1]~r~#2~a~-1&
g=m@{t@m@{t@#,t@#~b~-1},#~b~1}&

Попробуйте онлайн!

  • Map[Thread]эквивалентно Transpose[a, {1,3,2}], который транспонирует столбцы и строки.
  • Fold[#+##&]короче, чем IntegerDigits[#,2]для преобразования из двоичного файла.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.