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).
Respuestas:
Haskell , 94 bytes
Una función anónima que toma y devuelve una lista de
String
s.Usar como
(cycle[t.r,r.t,r.t,r.t]?)["123", "456", "789"]
.Pruébalo en línea!
Cómo funciona
r
esreverse
.t
es un byte más corto que la importaciónData.List.transpose
.t.r
gira una lista de listas 90 grados en el sentido de las agujas del reloj y lar.t
gira en sentido contrario.?
toma dos argumentos, una lista de funciones y una matriz como una lista de cadenas.?
elimina la primera funciónf
de la lista de funciones y la primera líneaa
de la matriz.b
de 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.a
al resultado y le aplica la funciónf
para ajustar la orientación de la matriz.?
con la matriz de entrada como una lista de cadenas y una lista infinita de funciones, que se repite cíclicamente cada cuatro pasos.?
al recurrir.fuente
Python 2 , 104 bytes
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)%2
se usa para elegir la dirección correctafuente
Mathematica, 113 bytes
es mejor ingresar como cadena de caracteres como "E" para letras especiales como E, I ...
entrada
salida
fuente
Octava, 86 bytes
Pruébalo en línea!
fuente