La idea
Hemos hecho espirales matriciales antes, y rotaciones completas, e incluso rotaciones diagonales , ¡pero no, por lo que puedo encontrar, rotaciones de serpientes !
¿Qué es una rotación de serpiente?
Imagine las filas de una matriz que se deslizan de un lado a otro, con divisores entre ellos como los divisores de la cola larga:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15|
+------------ |
20 19 18 17 16|
+--------------+
Ahora imagine rotar estos elementos en 2. Cada elemento avanza, como las personas que se mueven en línea, y los elementos al final se derraman y vuelven al principio:
+--------------+
--> 19 20 1 2 3|
+------------ |
| 8 7 6 5 4|
| +-----------+
| 9 10 11 12 13|
+------------ |
<-- 18 17 16 15 14|
+--------------+
Si hay un número impar de filas, saldrá por la derecha, pero aún así se ajustará al principio. Por ejemplo, aquí hay una rotación de 3:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15
+--------------+
+--------------+
--> 13 14 15 1 2|
+------------ |
| 7 6 5 4 3|
| +-----------+
| 8 9 10 11 12 -->
+--------------+
Una rotación negativa te llevará hacia atrás. Aquí hay una rotación -2:
+--------------+
<-- 3 4 5 6 7|
+------------ |
|12 11 10 9 8|
| +-----------+
|13 14 15 1 2 <--
+--------------+
El reto
Su función o programa tomará 2 entradas, en cualquier formato conveniente:
- Una matriz
- Un número entero (positivo o negativo) que indica cuántos lugares rotarlo.
Regresará:
- La matriz rotada
Notas:
- Código de golf. Pocos bytes ganan.
- Las matrices no necesitan ser cuadradas, pero contendrán al menos 2 filas y 2 columnas
- Los enteros positivos rotarán la fila 1 hacia la derecha
- Los enteros negativos rotarán la fila 1 hacia la izquierda
- Puede revertir el significado de los números de rotación positiva / negativa, si es conveniente
- El número de rotación puede ser mayor que el número de artículos. En ese caso, se envolverá. Es decir, será equivalente al módulo de número el número de elementos.
- La matriz contendrá solo enteros, pero puede contener cualquier número entero, incluidas las repeticiones.
Casos de prueba
Formato:
- Matriz
- Número de rotación
- Valor de retorno esperado
4 5
6 7
1
6 4
7 5
2 3 4 5
6 7 8 9
10 11 12 13
-3
5 9 8 7
12 11 10 6
13 2 3 4
8 8 7 7
5 5 6 6
10
5 5 8 8
6 6 7 7
Respuestas:
Jalea , 10 bytes
Un enlace diádico que acepta el marix a la izquierda y el número entero de rotación a la derecha (usa el significado inverso de positivo / negativo)
Pruébalo en línea!
¿Cómo?
fuente
R ,
121,110,101 bytesPruébalo en línea!
Tutorial
fuente
Python 3.8 (pre-releasSSSse) , 119 bytes
Una función sin nombre que acepta lo
matrix, rotation
que produce la nueva matriz.Utiliza el signo de rotación opuesto.
Pruébalo en línea!
¿Cómo?
Configuramos
n=-1
por adelantado para guardar en paréntesis más tarde y tomar la matriz comom
y la rotación comor
.Se construye una nueva matriz con las mismas dimensiones que
m
- con un ancho dew
(w:=len(m[0])
) y una altura deh
(h:=len(m)
).Cada otra fila de esta matriz se invierte (
[::n**j]
).Los valores se buscan calculando su fila y columna en el original,
m
utilizando los elementos actuales filai
, y columna,j
...Nos ponemos
s
ar+i
yk
para(j+s//w)%h
.k
es la fila del original para acceder a nuestro elemento actual.Para acceder fácilmente a filas indexadas impares desde la derecha, revertimos dichas filas antes de acceder a sus elementos (con
[:n**k]
), esto significa que el elemento de interés está ens%w
.fuente
J ,
413021 bytes-11 bytes gracias a Jonás!
-9 bytes gracias a FrownyFrog & ngn!
Pruébalo en línea!
Invertido
+/-
fuente
$@]t@$(|.,@(t=.#\,`(|.@,)/.]))
(¡ Pruébelo en línea! )&.
, perdía el argumento izquierdo todo el tiempo, por eso me di por vencido.JavaScript (Node.js) , 102 bytes
Toma entrada como
(matrix)(integer)
. El significado del signo del número entero se invierte.Pruébalo en línea!
Función auxiliar
Función principal
fuente
05AB1E , 16 bytes
Pruébalo en línea!
Gracias a Emigna por -5. Desafortunadamente, no puedo ver cómo jugar golf a la parte redundante. :(
fuente
Carbón , 36 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Invierta filas alternativas de la entrada.
Acoplar la matriz.
Gire la matriz aplanada.
Divide la matriz en filas.
Invierta filas alternas.
Convierta cada entrada en cadena y salida en el formato de salida predeterminado, que es un número por línea con filas a doble espacio. (Formatear con un separador costaría la longitud del separador).
fuente
Pyth, 20 bytes
Pruébelo en línea aquí .
fuente
Japt , 28 bytes
Intentalo
La respuesta del puerto de Arnauld . El mayor desafío fue crear una función reutilizable. En particular, hay una función auxiliar para invertir cada dos filas. El enfoque que estoy tomando es hacer una llamada recursiva y dependiendo de si se establece una variable.
JS transpuesto:
fuente
Python 3 , 94 bytes
Pruébalo en línea!
Usé la inversión de fila impar de la respuesta de Jonathan Allan .
fuente
APL (Dyalog Classic) , 20 bytes
Pruébalo en línea!
fuente
C # (compilador interactivo de Visual C #) , 141 bytes
Pruébalo en línea!
-5 bytes en total gracias a @someone!
Función anónima que realiza una modificación en el lugar de la matriz de entrada.
Un solo ciclo itera sobre las celdas. Puede escanear de arriba a abajo y de izquierda a derecha utilizando las siguientes fórmulas:
row=i/w
col=i%w
Donde
i
es un contador de bucle yw
es el número de columnas. Esto varía ligeramente cuando se escanea en un patrón de serpiente.row=i/w
col=i%w
(0ª, 2ª, 4ª fila, etc.)col=w-i%w-1
(1ª, 3ª, 5ª fila, etc.)Otra cosa a tener en cuenta es que
%
in C # no se convierte en un valor positivo como lo hace en otros lenguajes. Se necesitan un par de bytes adicionales para dar cuenta de esto.fuente
dynamic
; comentar también l. Pruébalo en línea!var
para jugar al golf, lo que no te permite declarar una lista de variables. Probablemente por eso me perdí esto. ¡Buena atrapada!y
completamente de ahorrar 2 bytes: ¡ Pruébelo en línea!