Rotar cada bloque de 2x2 en una matriz

11

El reto

Dada una n x mmatriz con n > 1y m > 1 llena de enteros

1 2 3
4 5 6

y una lista de enteros con exactamente tantos valores como 2x2bloques en la matriz ( (n-1)*(m-1)si necesita el número exacto)

[1, 2]

Salida de la matriz con cada 2x2bloque girado por el valor actual en la lista en el orden dado. El ejemplo anterior produciría

4 6 2
5 3 1

El primer bloque se gira una vez hacia la derecha y el segundo bloque se gira dos hacia la derecha.

Notas

  • Un número entero positivo significa que giras a la derecha en tantos pasos.
  • Un número entero negativo significa que giras a la izquierda en tantos pasos.
  • Un cero significa que no giras.
  • Gira los bloques en fila. Eso significa que comienzas en la primera fila y vas a la derecha. Una vez que rotó cada bloque en esa fila, pasa al siguiente. Al final, cada bloque se rotó exactamente una vez.
  • Tenga en cuenta que los bloques se superponen entre sí. La primera matriz anterior tiene los bloques [[1,2],[4,5]]y, [[2,3],[5,6]]por ejemplo.
  • Cada rotación de un bloque afecta la rotación en los bloques adyacentes. Es por eso que debe hacer las rotaciones en el patrón descrito anteriormente.

Reglas

  • Puede tomar la entrada en el formato más conveniente. Por favor, especifique en su respuesta cuál usa. Sin embargo, esto no le permite leer la matriz en bloque.
  • 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 valores.

[[1,2], [3,4]], [-3] -> [[4,1], [3,2]]
[[1,1,1], [1,1,1]], [-333, 666] -> [[1,1,1], [1,1,1]]
[[1,2,3], [4,5,6]], [1,2] -> [[4,6,2], [5,3,1]]
[[1,2,3], [4,5,6], [7,8,9]], [4,0,12, -20] -> [[1,2,3], [4, 5,6], [7,8,9]]
[[1,2,3,4,5], [5,4,3,2,1], [1,2,3,4,5]], [2, -3,4,1,6, 24,21, -5] -> [[4,1,5,2,4], [2,1,3,5,5], [3,2,4,3,1]]

¡Feliz codificación!

Denker
fuente

Respuestas:

4

CJam ( 42 40 bytes)

{(\@2$,(/.{@a@a+z(\@.{4,={+2/zW%~}*}z~}}

Demostración en línea

Básicamente esto aplica la misma técnica dos veces para doblar el bloque

{4,={+2/zW%~}*}

que opera en una matriz de 2x2 y varias veces para rotar.

[first row] [[second row] [third row] ... [last row]] [value_0 value_1 ... value_n]

puede ser procesado con

.{block}

y tiene el efecto de

[first row]
[second row] value_0 {block}~
[third row] value_1 {block}~
...

porque .(como %en CJam) no reúne los resultados en una matriz hasta que finaliza.

Peter Taylor
fuente
Puede guardar un byte utilizando 4,=el módulo correcto (a menos que su bloque deba ejecutarse al menos una vez).
Martin Ender
¿Y qué hay zW%de la rotación?
Martin Ender
@ MartinBüttner, pensé que la rotación parecía demasiado larga, pero no podía recordar la más corta. Buen truco en el módulo.
Peter Taylor
2

CJam, 65 63 60 55 bytes

No debe haber una mejor manera de hacer esto ...

{_e_\z,:N(@/Ta*ee{~4,=,f{;1$,,\[XTN_)]f+_(+er\f=}~}/N/}

Esta es una función sin nombre que espera las instrucciones y la matriz (en ese orden) en la pila y deja la matriz resultante en su lugar.

Pruébalo aquí.

Explicación

No tengo ganas de escribir el desglose completo del código en este momento, así que aquí hay una descripción general:

  • La manipulación de la matriz 2D es una molestia en CJam, por lo que, en cambio, desenrollo la matriz, calculo cada rotación como una permutación de los elementos en posiciones específicas y luego divido la matriz en filas nuevamente al final. El ancho de la matriz se almacena en N.
  • Una rotación en la posición ken la matriz de desenrollado cambia cuatro índices: k <- k+1, k+1 <- k+1+N, k+N <- k, k+1+N <- k+1. Para cada índice a lo klargo de la lista de instrucciones, calculo una permutación correspondiente a esto y la aplico a la matriz de entrada desenrollada.
  • Esto deja el problema, que en la matriz lineal se colocarán algunas rotaciones con su esquina superior izquierda en la última columna de la entrada. Para omitirlos, riflo los ceros en la lista de instrucciones, de modo que estos subbloques no válidos de 2x2 se procesen técnicamente, pero con un no-op.
Martin Ender
fuente
1

Python 2 , 166 159 bytes

A,R=input();m=~-len(A[0])
for j,r in enumerate(R):exec r%4*"a,b,c,d=A[j/m][j%m:][:2]+A[j/m+1][j%m:][:2];A[j/m][j%m:j%m+2]=c,a;A[j/m+1][j%m:j%m+2]=b,d;"
print A

Pruébalo en línea!

Jonathan Frech
fuente