Rotar cada fila y columna en una matriz

15

El reto

Dada una n x nmatriz de enteros conn >= 2

1 2
3 4

y una lista de enteros con 2nelementos exactos

[1,2, -3, -1]

Salida de la matriz girada. Esta matriz se construye de la siguiente manera:

  • Tome el primer entero de la lista y gire la primera fila a la derecha por este valor.
  • Tome el siguiente entero y gire la primera columna hacia abajo por este valor.
  • Tome el siguiente número entero y gire la segunda fila hacia la derecha por este valor, etc. hasta que haya rotado cada fila y columna de la matriz una vez.

La lista puede contener enteros negativos, lo que significa que desplaza la fila / columna a la izquierda / arriba en lugar de a la derecha / abajo. Si el entero es cero, no gire la fila / columna.

Ejemplo usando la entrada de arriba

Elemento de la lista Matriz Explicación
-------------------------------------------------- ----------
1 2 1 Girar la primera fila a la derecha por 1
                   3 4

2 2 1 Gire la primera columna hacia abajo 2
                   3 4

-3 2 1 Girar la segunda fila a la izquierda por 3
                   4 3

-1 2 3 Girar la 2da columna hacia arriba por 1
                   4 1

Reglas

  • Puede elegir el formato de entrada más conveniente. Solo deja en claro cuál usas.
  • Función o programa completo permitido.
  • Reglas predeterminadas para entrada / salida.
  • Se aplican lagunas estándar .
  • Este es el , por lo que gana el conteo de bytes más bajo. Tiebreaker es una presentación anterior.

Casos de prueba

El formato de entrada aquí es una lista de listas para la matriz y una lista normal para los enteros.

[[1,2], [3,4]], [1,2, -3, -1] -> [[2,3], [4,1]]
[[1,2], [3,4]], [1,1,1,1] -> [[3,2], [4,1]]
[[1,2], [3,4]], [0,0,0,0] -> [[1,2], [3,4]]
[[1,2, -3], [- 4,5,6], [7, -8,0]], [1, -2,0, -1,3,4] -> [[7, 5,0], [- 3, -8,2], [- 4,1,6]]
[[1,2, -3], [- 4,5,6], [7, -8,0]], [3,12, -3,0, -6, -3] -> [[1 , 2, -3], [- 4,5,6], [7, -8,0]]

¡Feliz codificación!

Denker
fuente
mapcar debería ayudar ...
msh210

Respuestas:

6

CJam, 13 bytes

{{a.m>1m<z}/}

Un bloque (función) sin nombre que toma la matriz y la lista en la parte superior de la pila (en ese orden) y deja la nueva matriz en su lugar.

Ejecute todos los casos de prueba.

La misma idea, el mismo recuento de bytes, diferentes implementaciones:

{{\(@m>a+z}/}
{{(Im>a+z}fI}
{{:\Im>]z}fI}

Explicación

Idealmente, queremos tratar cada instrucción en la lista de la misma manera, y solo usarla para rotar la primera fila de la matriz. Esto se puede hacer fácilmente transformando un poco la matriz después de cada instrucción y asegurándose de que todas esas transformaciones adicionales se cancelen al final. Entonces, después de procesar cada instrucción, rotamos todas las filas una hacia arriba (de modo que la siguiente instrucción a lo largo de la misma dimensión procesa la siguiente fila) y luego transponemos la matriz, de modo que en realidad estamos procesando columnas a continuación. Estas transformaciones adicionales son ortogonales a las instrucciones de la lista y tienen un período de exactamente 2nexactamente lo que necesitamos.

En cuanto al código:

{      e# For each instruction...
  a    e#   Wrap it in a singleton array.
  .m>  e#   Combine it element-wise with the matrix to rotate right. This is
       e#   a fairly common idiom to apply a binary operation only to the first
       e#   element of an array, since element-wise operations just retain all the
       e#   unpaired elements of the longer array.
  1m<  e#   Rotate the rows one up.
  z    e#   Transpose.
}/
Martin Ender
fuente
4

APL (Dyalog Extended) , 17 15 14 13 bytes

-3 bytes por Adám

(⍉1⊖⌽`@1⍢⌽)/⌽

Pruébalo en línea!

Toma la entrada como una lista donde el primer elemento es la matriz, y los elementos restantes son las cantidades de rotación. Si ⌽ gira a la derecha en lugar de a la izquierda, esto superaría a CJam.

(⍉1⊖⌽@1 1⍢⌽)/⌽    Monadic train:
(⍉1⊖⌽@1 1⍢⌽)      Helper function to rotate and transpose once.
                        Takes args  (amount to rotate) and  (current array)
                      Function to rotate left
        1 1             2-element vector containing 1.
                        The second 1 is redundant, but saves 1 byte over (,1).
     ⌽@1 1             Function to rotate the 1st row left by ⍺.
     ⌽@1 1⍢⌽          Reverse ⍵, rotate 1st row left by ⍺, then reverse again.
                        This rotates the first row of  to the *right*.
  1                   Rotate all the rows upward,
                                                  then transpose.
(⍉1⊖⌽@1 1⍢⌽)/⌽   Fold (/) this function over the reversed input.
                     If our input is ⍵, _1, _2, ..., _2n,
                     the reversed input will be _2n, ..., _1, ⍵.
                     The / operator applies the function right to left,
                     so the  is necessary.
lirtosiast
fuente
{⍉1⊖⌽⍺⌽@(⍳1)⌽⍵}(⍉1⊖⌽@(⍳1)⍢⌽)pero ¿puedes explicarme por qué @1no funciona en lugar de @(⍳1)o @(,1)? Además, OP puede permitirle tomar la entrada en reversa.
Adám
Entonces resulta que dfns ' atque está detrás del extendido @no es una extensión compatible. Sin embargo, puede usar el nativo @con el `@1que guarda un byte @1 1.
Adám
¿funciona rotar de manera diferente en apl vs J? Estoy tratando de traducir esto a J y lo encuentro mucho más detallado ...
Jonás
2

Python 2, 96 bytes

def f(m,v):
    for i,x in enumerate(v):x%=len(m);r=m[i/2];m[i/2]=r[-x:]+r[:-x];m=zip(*m)
    return m

Pruebas

fdevuelve una lista de tuplas. Cada línea en el cuerpo de la función está sangrada con 1 carácter de tabulación.

vaultah
fuente
¿Una escalera no return zip(*m)te ahorraría 5 bytes?
Denker
@DenkerAffe: ¿sugieres reemplazar m=zip(*m);return mcon just return zip(*m)? No puedo hacer eso porque m=zip(*m)es parte del forciclo
vaultah
Sí, ese fue mi sin embargo. No vi que está en el bucle, mi mal.
Denker