Rotaciones Entrelazadas

25

Reto

Dada una matriz cuadrada de caracteres (caracteres ASCII imprimibles de un solo byte), gire cada "anillo" de la matriz en direcciones opuestas.

Tomemos un ejemplo:

1 2 3 4 5
6 7 8 9 A
B C D E F
G H I J K
L M N O P

Luego, el anillo más externo se gira 90 grados en el sentido de las agujas del reloj, así:

1 2 3 4 5    L G B 6 1
6       A    M       2
B       F => N       3
G       K    O       4
L M N O P    P K F A 5

El segundo anillo se gira en sentido antihorario 90 grados:

7 8 9    9 E J
C   E => 8   I
H I J    7 C H

El anillo final se gira 90 grados en el sentido de las agujas del reloj, pero como es un número único (letra en nuestro ejemplo), no se ve realmente afectado.

El resultado final es:

L G B 6 1
M 9 E J 2
N 8 D I 3
O 7 C H 4
P K F A 5

Si la matriz tiene una longitud lateral uniforme, el anillo más interno será un cuadrado de 2x2 y aún debe rotarse.

Entrada

Una lista de listas en cualquier formato estándar razonable. Por ejemplo, una cadena delimitada por espacios delimitada por una nueva línea o una lista de cadenas delimitadas por espacios es aceptable, pero una lista de los valores como anillos alrededor de la matriz no es aceptable. Los personajes no son necesariamente únicos.

Salida

Una lista de listas en cualquier formato estándar razonable. Las mismas reglas que la entrada.

Casos de prueba

1 2 3    7 4 1
4 5 6 => 8 5 2
7 8 9    9 6 3

1 2 3 4 5 6    Y S M G A 1
A B C D E F    Z E K Q W 2
G H I J K L => ! D O I V 3
M N O P Q R    @ C P J U 4
S T U V W X    # B H N T 5
Y Z ! @ # $    $ X R L F 6

Créditos

Muy inspirado por un desafío relacionado que rota cada elemento en sentido antihorario una posición (no 90 grados).

Hiperneutrino
fuente
Relacionado
rahnema1
@ rahnema1 Correcto, recuerdo esa publicación. Esta publicación está inspirada principalmente en esa; Lo acreditaré. ¡Gracias!
HyperNeutrino
@ Mr.Xcoder Whoops. Tienes razon, gracias.
HyperNeutrino
@HyperNeutrino ¿podemos tomar la dimensión de la matriz como parte de la entrada?
Uriel
Todos los personajes en tus ejemplos son únicos. ¿Será este siempre el caso?
Dennis

Respuestas:

9

Haskell , 94 bytes

Una función anónima que toma y devuelve una lista de Strings.

Usar como (cycle[t.r,r.t,r.t,r.t]?)["123", "456", "789"].

(cycle[t.r,r.t,r.t,r.t]?)
(g:h)?(a:b)=g$a:h?t(r b)
_?a=a
r=reverse;t=zipWith(:)`foldr`repeat[]

Pruébalo en línea!

Cómo funciona

  • res reverse. tes un byte más corto que la importación Data.List.transpose. t.rgira una lista de listas 90 grados en el sentido de las agujas del reloj y la r.tgira en sentido contrario.
  • El operador ?toma dos argumentos, una lista de funciones y una matriz como una lista de cadenas.
    • Se acaba de devolver una matriz vacía.
    • De lo contrario, ?elimina la primera función fde la lista de funciones y la primera línea ade la matriz.
    • Luego gira el resto bde la matriz en el sentido de las agujas del reloj, y recurre con eso y las funciones restantes. Esto elimina gradualmente la matriz desde afuera hacia adentro, un anillo cada cuatro pasos.
    • Luego antepone la línea original a al resultado y le aplica la función fpara ajustar la orientación de la matriz.
  • La función anónima llama ?con la matriz de entrada como una lista de cadenas y una lista infinita de funciones, que se repite cíclicamente cada cuatro pasos.
    • Para la mayoría de los pasos, la función es la rotación en sentido antihorario, que deshace la rotación implícita en sentido horario realizada por ? al recurrir.
    • Sin embargo, el primer paso y cada cuarto paso posterior es la rotación en sentido horario.
      • Esta función se aplica cuando se completa un anillo de la matriz, lo que hace que cada anillo gire 180 grados con respecto al siguiente.
      • Por suerte, esta es también la transformación correcta para aplicar a la matriz final completada para obtener el resultado final.
Ørjan Johansen
fuente
6

Python 2 , 104 bytes

def f(x):l=len(x)-1;r=range(l+1);return[[[x[l-i][j],x[i][l-j]][min(i,j,l-i,l-j)%2]for i in r]for j in r]

Pruébalo en línea!

x[l-i][j]son las coordenadas de un giro en el sentido de las agujas del reloj, x[i][l-j]para un giro en sentido contrario. min(i,j,l-i,l-j)%2se usa para elegir la dirección correcta

Barra
fuente
volviendo rotaciones recursivamente.
tuskiomi
@tuskiomi hmm ??
Rod
@tuskiomi Probé un enfoque recursivo en ES6. Era aproximadamente el doble de un simple puerto de esta respuesta ...
Neil
4

Mathematica, 113 bytes

r=Reverse;(l=Length[s=#];Table[s[[i+1;;l-i,i+1;;l-i]]=r/@r@s[[i+1;;l-i,i+1;;l-i]],{i,⌊l/2⌋}];r/@Transpose@s)&


es mejor ingresar como cadena de caracteres como "E" para letras especiales como E, I ...

entrada

[{{1, 2, 3, 4, 5, 6}, {A, B, C, D, "E", F}, {G, H, "I", J, K, L}, {M , N, O, P, Q, R}, {S, T, U, V, W, X}, {Y, Z, "!", "@", "#", "&"}}]

salida

{{Y, S, M, G, A, 1}, {Z, "E", K, Q, W, 2}, {"!", D, O, "I", V, 3}, { "@", C, P, J, U, 4}, {"#", B, H, N, T, 5}, {"&", X, R, L, F, 6}}

J42161217
fuente
3

Octava, 86 bytes

@(a){k=a;k(x=2:end-1,x)=0;a=rot90(a);a(m)=rot90(a,-2)(m=~mod(bwdist(+k,'ch'),2));a}{5}

Pruébalo en línea!

rahnema1
fuente