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, rotationque produce la nueva matriz.Utiliza el signo de rotación opuesto.
Pruébalo en línea!
¿Cómo?
Configuramos
n=-1por adelantado para guardar en paréntesis más tarde y tomar la matriz comomy 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,
mutilizando los elementos actuales filai, y columna,j...Nos ponemos
sar+iykpara(j+s//w)%h.kes 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/wcol=i%wDonde
ies un contador de bucle ywes el número de columnas. Esto varía ligeramente cuando se escanea en un patrón de serpiente.row=i/wcol=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!varpara jugar al golf, lo que no te permite declarar una lista de variables. Probablemente por eso me perdí esto. ¡Buena atrapada!ycompletamente de ahorrar 2 bytes: ¡ Pruébelo en línea!