El tornado matricial es como cualquier otro tornado: consiste en cosas que giran alrededor de un centro. En este caso, elementos de la matriz en lugar de aire.
Aquí hay un ejemplo de un tornado matricial:
Primero comenzamos seccionando la matriz en anillos cuadrados, cada sección consta de elementos que están más lejos del borde en la misma distancia. Estas secciones se rotarán en sentido horario alrededor del centro. En los tornados reales, la gravedad aumenta hacia el centro, y también lo hace el paso de rotación en un tornado matricial: la sección más externa (la roja) gira 1 paso, la siguiente (la amarilla) gira 2, y así en. Un paso de rotación es una rotación de 90 ° alrededor del centro.
Tarea:
Su tarea, si la acepta, es escribir una función o programa que tome como entrada una matriz cuadrada, aplicarle el efecto tornado y luego generar la matriz resultante.
Entrada:
La entrada debe ser una matriz cuadrada de orden n
donde n >= 1
. No se debe suponer acerca de los elementos de la matriz, podrían ser cualquier cosa.
Salida:
Una matriz cuadrada del mismo orden que sería el resultado de aplicar el efecto tronado a la matriz de entrada.
Ejemplos:
Una matriz de orden n = 1
:
[['Hello']] ===> [['Hello']]
Una matriz de orden n = 2
:
[[1 , 2], ===> [[5 , 1],
[5 , 0]] [0 , 2]]
Una matriz de orden n = 5
:
[[A , B , C , D , E], [[+ , 6 , 1 , F , A],
[F , G , H , I , J], [- , 9 , 8 , 7 , B],
[1 , 2 , 3 , 4 , 5], ===> [/ , 4 , 3 , 2 , C],
[6 , 7 , 8 , 9 , 0], [* , I , H , G , D],
[+ , - , / , * , %]] [% , 0 , 5 , J , E]]
;)
Respuestas:
Python 3 , 100 bytes
Pruébalo en línea!
fuente
a[1:-1,1:-1]=f(a[1:-1,1:-1])
como si fuera la cosa más normal del mundo obtener y configurar directamente todo el interior de una matriz bidimensionalnumpy
numpy.rot90(a,1,(1,0))
es más corto en 3 bytes y también debería funcionar.if len(a):a=...
-1 byte).Carbón , 44 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Solo funciona en cuadrados de caracteres porque la E / S predeterminada de Charcoal no hace justicia a las matrices normales. Explicación:
Lee el cuadrado del personaje.
Bucle hasta que esté vacío.
Rota lo.
Imprímelo, pero luego mueve el cursor a un cuadrado en diagonal desde la esquina original.
Recorte el exterior de la matriz.
fuente
Jalea , 27 bytes
Pruébalo en línea!
Creo que esto podría ser mucho más corto.
fuente
µG
el pie de página y afirmar que su presentación es 25.Perl 6 ,
78 7372 bytes¡Gracias a nwellnhof por -5 bytes!
Pruébalo en línea!
Bloque de código recursivo que toma una matriz 2D aplanada y devuelve una matriz aplanada de manera similar.
Explicación:
fuente
@a[*;*]
lugar demap |*,@a
aplanar la matriz. (Sería bueno si hubiera una manera de trabajar con matrices no planas y subíndices multidimensionales, pero no puedo pensar en una)@a[1..*-2;1..@a-2].=$!
funciona.Octava ,
8681 bytesPruébalo en línea!
Soy consciente de que las funciones anónimas recursivas no son el método más corto para hacer cosas en Octave, pero son el método más divertido con diferencia. Esta es la función anónima más corta que se me ocurrió, pero me encantaría que me superaran.
Explicación
La función recursiva se define de acuerdo con esta respuesta de consejos de ceilingcat.
q=f(f=@(g)@(M) ... g(g)(M) ...
es la estructura básica de dicha función anónima, cong(g)(M)
la llamada recursiva. Ya que esto recursivo indefinidamente, envolvemos la llamada recursiva en una serie de células condicional:{@()g(g)(M),M}{condition}()
. La función anónima con la lista de argumentos vacía retrasa la evaluación después de que se haya seleccionado la condición (aunque más adelante, vemos que podemos usar esa lista de argumentos para definirz
). Hasta ahora solo ha sido la contabilidad básica.Ahora para el trabajo real. Queremos que la función devuelva
rot90(P,-1)
con P una matriz en la queg(g)
se ha llamado recursivamente en la parte central de M. Comenzamos por establecerz=2:end-1
qué podemos ocultar en la indexación de M. De esta manera,M(z,z)
selecciona la parte central de la matriz que necesita ser tornado aún más por una llamada recursiva. La,3
parte asegura que las rotaciones sean en sentido horario. Si vives en el hemisferio sur, puedes eliminar este bit por -2 bytes.Entonces lo hacemos
M(z,z)=g(g)M(z,z)
. Sin embargo, el valor resultante de esta operación es solo la parte central modificada en lugar de laP
matriz completa . Por lo tanto, hacemos{M(z,z)=g(g)M(z,z),M}{2}
que básicamente es robado de esta respuesta de consejos de Stewie Griffin.Finalmente, el
condition
es solo que la recursión se detiene cuando la entrada está vacía.fuente
R , 87 bytes
Pruébalo en línea!
fuente
seq(0.5)
devuelve 1 en lugar de un vector vacío)MATL ,
25 24 2322Pruébalo en línea!
La indexación en MATL nunca es fácil, pero con algo de golf en realidad supera la mejor respuesta actual de Jelly ...
* Para una
n x n
matriz, este programa realizan
iteraciones, mientras que realmente solo necesitan/2
rotaciones. Sin embargo, la indexación en MATL (AB) es lo suficientemente flexible como para que la indexación de rangos imposibles sea simplemente no operativa. De esta manera, no es necesario desperdiciar bytes para obtener el número de iteraciones correcto.fuente
Python 2 , 98 bytes
Pruébalo en línea!
fuente
K (ngn / k) ,
413938 bytesPruébalo en línea!
{
}
funcionar con argumentox
#x
longitud dex
- la altura de la matriz2##x
dos copias: alto y ancho (se supone que es lo mismo)s:
asignar as
para "forma"!s
todos los índices de una matriz con formas
, por ejemplo,!5 5
esEsta es una matriz de 2 filas (lista de listas) y sus columnas corresponden a los índices en una matriz de 5x5.
&/
mínimo sobre las dos filas:i&|i:
asignar ai
, invertir (|
) y tomar mínimos (&
) coni
Estos son los números de anillo aplanados de una matriz de 5x5:
4!1+
suma 1 y toma resto módulo 4(+|:)
es una función que gira invirtiendo (|
- necesitamos:
forzarla a ser monádica) y luego transponiendo (+
- ya que no es el verbo más a la derecha en el "tren", no necesitamos a:
)4(+|:)\x
aplicarlo 4 veces enx
, conservando resultados intermedios,/'
aplanar cada+
transponer(
)@'
indexar cada valor a la izquierda con cada valor a la derechas#
remodelar as
fuente
JavaScript (ES6), 99 bytes
Pruébalo en línea!
¿Cómo?
Dada una matriz cuadrada de anchoW , definimos:
Ejemplo de salida detx , y para una matriz de 5x5 (W= 5 , m = 2 ):
Empezamos conk = m y realizar una rotación de 90 ° en sentido horario de todas las celdas ( x , y) satisfactorio:
mientras que los otros no se modifican.
Esto es equivalente a decir que una celda no gira si tenemos:
cual es la prueba usada en el código:
Entonces decrementamosk y empezar de nuevo, hasta k = - 1 o k = - 3 / 2 (dependiendo de la paridad de W ) De cualquier manera, desencadena nuestra condición de detención:
fuente
Jalea , 24 bytes
Pruébalo en línea!
- Lynn
fuente
ḷ""
parece mágico ^^ ¿quieres agregar una explicación?ḷ""
es mágico. Es soloḷ"
con un extra"
... oh, hay una pequeña posibilidad de queḷ"
también sea algo que "inventé" que no se haya usado tanto, ya que a menudo se puede reemplazar con un solo átomo (no en este caso, como el la entrada puede contener0
también).Haskell , 108 bytes
Pruébalo en línea!
Solía transposición de Laikoni y modificar un poco, para girar una matriz 90 °:
Explicación
r
Rota una matriz 90 °.(!)
es una función de nivel superior: "aplicar al centro".g![1,2,3,4,5]
es[1] ++ g[2,3,4] ++ [5]
.f
es la función tornado: los casos base son de tamaño 1 y 2 (de alguna manera 0 no funciona).La última línea es donde ocurre la magia: aplicamos
r.r.r.(f!).r
en las filas del mediox
y luego rotamos el resultado. Llamemos a las filas del medio M . Queremos recurrir en las columnas centrales de M , y para llegar a ellas, podemos rotar M y luego usar(f!)
. Luego usamosr.r.r
para rotar M nuevamente a su orientación original.fuente
Java 10,
198192 bytes-6 bytes gracias a @ceilingcat .
Pruébalo en línea.
Explicación:
b
se usa básicamente para indicar en qué anillo estamos. Y luego rotará este anillo, incluyendo todo dentro de él una vez en el sentido de las agujas del reloj durante cada iteración.El reemplazo de la matriz de entrada se realiza porque Java es paso por referencia, por lo que simplemente establecerlo
r=m
significaría que ambas matrices se modifican al copiar desde las celdas, lo que causa resultados incorrectos. Por lo tanto, tenemos que crear una nuevaObject
matriz (nueva referencia) y copiar los valores en cada celda uno por uno.fuente
MATLAB, 93 bytes
Estoy seguro de que esto se puede jugar un poco más de alguna manera.
Explicación
fuente
C (gcc) ,
128118115 bytes-15 bytes de @ceilingcat
Pruébalo en línea!
fuente
Haskell, 274 bytes
w
es la función principal, que tiene el tipo[[a]] -> [[a]]
que esperarías.Estoy seguro de que un golfista más experimentado de Haskell podría mejorar esto.
fuente