Digamos que tengo la siguiente matriz (2D):
[[1, 2, 3, 4 ],
[5, 6, 7, 8 ],
[9, 10, 11, 12],
[13, 14, 15, 16]]
Gire la matriz en sentido antihorario R
(no en incrementos de 90 grados, solo 1 número cada vez),
1 2 3 4 2 3 4 8 3 4 8 12
5 6 7 8 --> 1 7 11 12 --> 2 11 10 16
9 10 11 12 5 6 10 16 1 7 6 15
13 14 15 16 9 13 14 15 5 9 13 14
Ejemplo completado:
Entrada:
2
[[1, 2, 3, 4 ],
[5, 6, 7, 8 ],
[9, 10, 11, 12],
[13, 14, 15, 16]]
Salida:
[[3, 4, 8, 12],
[2, 11, 10, 16],
[1, 7, 6, 15],
[5, 9, 13, 14]]
(los espacios extraños son para alinear los números en columnas bonitas)
El "anillo" externo de la matriz gira 2 en sentido antihorario, y el derecho interno también gira 2. En esta matriz, solo hay dos anillos.
Un ejemplo con 1 "anillo":
2
[[1, 2],
[3, 4],
[5, 6]]
Debería dar salida:
[[4, 6],
[2, 5],
[1, 3]]
Su desafío es incorporar una matriz y un número entero R
y generar la versión traducida después de las R
rotaciones.
La rotación de una matriz 4x5 está representada por la siguiente figura:
Restricciones:
2 ≤ M, N ≤ 100
, donde M y N son las dimensiones de la matriz. Se garantiza que el mínimo de M y N será par.1 ≤ R ≤ 80
, donde r es el número de rotaciones.- La matriz solo contendrá enteros positivos.
- Los valores no siempre son distintos.
- La entrada siempre debe ser como una matriz 2D (si no puede tomar la entrada de tiempo de ejecución como una matriz 2D, entonces solo tiene que encontrar otra forma de obtener la entrada).
Otro caso de prueba, con valores no distintos:
1
[[1, 1],
[2, 2],
[3, 3]]
Salidas:
[[1, 2],
[1, 3],
[2, 3]]
Este es el código de golf , por lo que gana la respuesta más corta.
fuente
[[3, 4, 8, 12], [2, 11, 10, 16], [1, 7, 6, 16], [5, 9, 13, 14]]
el 16 se duplica de repente, supongo que debería ser[[3, 4, 8, 12], [2, 11, 10, 16], [1, 7, 6, 15], [5, 9, 13, 14]]
:?Respuestas:
Gelatina ,
39383635 bytesPruébalo en línea!
fuente
Octava, 210 bytes
Pruébalo en Octave Online!
Versión sin golf:
Explicación:
Una función que obtiene un número y genera un rango ordenado y centrado para la entrada 4 (par) genera
-2 -1 1 2
para la entrada 5 (impar) genera
-2.5 -1.5 0 1 2
solo que debe ordenarse y centrarse
una matriz compleja generada a partir de rangos
Convierta las coordenadas rectangulares a polares y los ángulos de retorno para que los ángulos de cada anillo se ordenen en sentido antihorario
La siguiente matriz generada
Calcula la transformación de distancia de B usando la distancia del tablero de ajedrez para generar índices de anillo
para una matriz de 6 * 7 tendremos la siguiente matriz
clasificación lexicográfica primero basada en el índice de anillo y luego por orden de ángulo (índices de elementos ordenados devueltos)
y finalmente circular desplazar cada anillo.
fuente
Python 3,
292288 bytesToma entrada con las nuevas líneas eliminadas, pero dejando un espacio después del número de incrementos para rotarlo.
Explicación:
En lugar de modelar la matriz como una serie de anillos concéntricos según la sugerencia del OP, uno puede dividirla en cuatro regiones donde los elementos viajan hacia arriba, hacia abajo, hacia la derecha o hacia la izquierda durante una sola rotación. Este es el propósito de la cadena de evaluación larga
f
: determinar en qué regióni,j
cae cada combinación. Luego, el resultado de eso se busca dos vecesl
, dando el elemento que debe rotar en posicióni,j
en el siguiente paso. La funcióng
que hace todo esto y forma la nueva matriz después de un solo paso se llama repetidamente evaluando una cadena generada que contiene la representación de una llamada de función anidada.Cuando hice esto originalmente, accidentalmente hice que la matriz girara en sentido horario en lugar de hacerlo en sentido antihorario. En lugar de hacer una corrección adecuada, agregué dos copias colocadas estratégicamente
[::-1]
para invertir la matriz antes y después de la rotación. Probablemente estos podrían tener un golf de ~280276 bytes, pero soy demasiado vago para hacerlo.Además, este es un puerto rápido no probado de un programa Python 2 un poco más largo, así que perdóname si no funciona del todo bien. Aquí está el código de Python 2, de todos modos:
EDITAR: Golfed 4 bytes reemplazando
or
con|
dos veces.and
No se puede evitar, por desgracia.fuente
Perl,
330328 bytesPruébalo en Ideone .
Sin golf:
fuente