Auto-rotazione binaria


13

Dato un array 3D binario, per ogni livello, ruotare ciclicamente su ciascuna delle sue colonne tutti i passaggi indicati dalla codifica binaria delle colonne del livello sopra di esso, quindi ruotare ciclicamente a sinistra ciascuna delle sue righe quanti passaggi indicati da la codifica binaria delle righe del livello sottostante.

Ci saranno sempre almeno tre livelli. Le colonne del livello superiore e le righe del livello inferiore non devono essere ruotate.

Procedura dettagliata

Iniziamo con il piccolo array a 4 strati, 2 file e 3 colonne:

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

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

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

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

Il primo passo è valutare i numeri codificati in binario dalle colonne e dalle righe di ogni livello:

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

Il primo strato [[1,0,1],[1,0,0]]non ruoterà le sue colonne, ma le sue file verranno ruotate ciclicamente a sinistra rispettivamente di 5 e 3 passi, diventando così [[1,1,0],[1,0,0]].
 Il secondo strato, [[1,0,1],[0,1,1]]avrà le sue colonne ruotate ciclicamente rispettivamente di 3, 0 e 2 passi, dando [[0,0,1],[1,1,1]], e quindi le righe saranno ciclicamente ruotate a sinistra rispettivamente 3 e 7 passi, senza cambiamenti visibili.
 Il terzo livello, [[0,1,1],[1,1,1]]ruotato di 2, 1 e 3 passi rimane lo stesso, e nemmeno la rotazione di 6 e 7 passi a sinistra fa nulla.
 Infine, il quarto strato, [[1,1,0],[1,1,1]]ruotato di 1, 3 e 3 passi è [[1,1,1],[1,1,0]], ma le sue file non vengono ruotate in seguito, poiché è l'ultimo strato.
 Riunendo tutti i livelli, ci dà l'array 3D binario auto-ruotato:

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

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

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

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

Casi di esempio:

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

Risposte:


3

Gelatina ,  18  17 byte

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

Provalo online!

Come?

ṙ""Ḅ} - 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) )

Nota: $$(o forse $$ ... $$?) Sembra incasinare la formattazione del blocco di codice (ma solo una volta pubblicato, non nell'anteprima), quindi ho aggiunto uno spazio per semplificarmi la vita.


3

Python 2 , 220 211 209 185 176 174 164 161 159 byte

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

Provalo online!

-2 byte, grazie a Jonathan Allan


Dal momento che maneggi Nonedurante il taglio per la rotazione, credo che entrambi ['0']possano diventare [[]].
Jonathan Allan il

@JonathanAllan Thanks :)
TFeld il

2

APL + WIN, 53 39 byte

Mille grazie ad Adám per aver salvato 14 byte

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

Provalo online! Per gentile concessione di Dyalog Classic

Richiede l'immissione di un array 3d del modulo:

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

che produce:

1 0 1
1 0 0

1 0 1
0 1 1

0 1 1
1 1 1

1 1 0
1 1 1

Spiegazione:

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

Invece di racchiudere e utilizzare ¨, basta elaborare l'intero array in una sola volta. Provalo online!
Adám,

@ Adám Mille grazie. Non so perché ci ho pensato troppo e ho seguito la strada nidificata :( Invecchiare?
Graham,

2

R , 226 216 205 byte

-21 byte grazie a digEmAll

function(a,L=`for`){d=dim(b<-a)
r=function(a,n,l=sum(a|1))a[(1:l+sum(n*2^(sum(n|1):1-1))-1)%%l+1]
L(i,I<-2:d[3],L(j,1:d,b[j,,i]<-r(b[j,,i],a[j,,i-1])))
L(i,I-1,L(k,1:d[2],b[,k,i]<-r(b[,k,i],a[,k,i+1])))
b}

Provalo online!


1

05AB1E , 41 39 byte

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

Sembra troppo lungo .. Può sicuramente giocare a golf ancora un po '.

Provalo online o verifica tutti i casi di test .

Spiegazione:

ε                    # 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 byte

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}&

Provalo online!

  • Map[Thread]è equivalente a Transpose[a, {1,3,2}], che traspone le colonne e le righe.
  • Fold[#+##&]è più breve rispetto IntegerDigits[#,2]alla conversione da binario.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.