Como parte de su algoritmo de compresión, el estándar JPEG desenrolla una matriz en un vector a lo largo de antidiagonales de dirección alterna:
Su tarea es tomar una matriz (no necesariamente cuadrada) y devolverla en forma desenrollada. Como ejemplo:
[1 2 3 4
5 6 7 8
9 1 2 3]
debería rendir
[1, 2, 5, 9, 6, 3, 4, 7, 1, 2, 8, 3]
Reglas
Puede suponer que los elementos de la matriz son enteros positivos menores que 10
.
Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y generando el resultado a través de STDOUT (o la alternativa más cercana), el valor de retorno de la función o el parámetro de función (out).
La matriz de entrada se puede proporcionar en cualquier lista conveniente o inequívoca, anidada o en formato de cadena, o como una lista plana junto con ambas dimensiones de la matriz. (O, por supuesto, como un tipo de matriz si su idioma los tiene).
El vector de salida puede estar en cualquier formato de cadena o lista conveniente, inequívoca y plana.
Se aplican reglas estándar de código de golf .
Casos de prueba
[[1]] => [1]
[[1 2] [3 1]] => [1 2 3 1]
[[1 2 3 1]] => [1 2 3 1]
[[1 2 3] [5 6 4] [9 7 8] [1 2 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 3 4] [5 6 7 8] [9 1 2 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 6 3 1 2] [5 9 4 7 8 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 5 9 6 3 4 7 1 2 8 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1] [2] [5] [9] [6] [3] [4] [7] [1] [2] [8] [3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
Desafíos relacionados
- Reconstruir una matriz zigzagificada (la transformación inversa algo más complicada)
- Rotar las antiagoniales
fuente
Respuestas:
J,
3130141211 bytesYch . Demasiado grande.Toma una matriz como entrada.
Explicación
J tiene una ventaja aquí. Hay un comando llamado oblicuo (
/.
) que toma las líneas oblicuas a su vez y les aplica un verbo. En este caso, estoy usando un gerundio para aplicar dos verbos alternativamente:<
( recuadro ) y<@|.
( reverso y recuadro). Entonces es solo cuestión de desempaquetar todo usando;
( raze ).fuente
Pyth,
24232120191817 bytesVersión alternativa de 17 bytes:
ssuL_G=!T.T+LaYkQ
¡Gracias a @FryAmTheEggman por un byte, @Jakube por 2 bytes y @isaacg por un byte!
Explicación de la "magia negra" aludida anteriormente:
m_W=!Td
esencialmente invierte cualquier otro subconjunto. Lo hace mediante el mapeo_W=!T
sobre cada submatriz;W
es una aplicación condicional, por lo que_
s (invierte) todas las submatrices donde=!T
es verdadero.T
es una variable preinicializada a diez (verdad), y=!T
significa(T = !T)
. Por lo tanto, alterna el valor de una variable que comienza con la verdad y devuelve el nuevo valor, lo que significa que alternará entre devolver falso, verdadero, falso, verdadero ... (crédito a Jakube por esta idea)Prueba de suite aquí .
fuente
Jalea,
2419151311 bytesToma el número de filas, el número de columnas y una lista plana como argumentos separados de la línea de comandos.
Pruébalo en línea!
Cómo funciona
fuente
⍁
y⍂
? O tal vez escandinavoø
yǿ
?MATL ,
2827 bytesAdaptado de mi respuesta aquí . La idea general es crear una matriz 2D del mismo tamaño que la entrada, llena de valores que aumentan en el mismo orden que la ruta en zig-zag. Luego, se ordena la versión linealizada (aplanada) de esa matriz y se mantienen los índices de esa clasificación. Esos son los índices que deben aplicarse a la entrada para producir la ruta en zig-zag.
La entrada está en la forma
Explicación
Pruébalo en línea!
fuente
Matlab, 134 bytes
Solo hice mi mejor esfuerzo para acortar mi código en Matlab, como telegrafiarlo.
Notas:
M
Es unam×n
matriz.a
yb
son ambas matrices del mismo tamañoM
, cada fila dea
consta de números iguales a su número de fila, mientras que cada columna deb
es igual a su número de columna. Por lo tanto,a
+b
es una matriz cuyo elemento es igual a la suma de su fila y columna de número, es decir,matrix(p,q)=p+q
.A(p,q)=p+q-1
; yB(p,q)=p-q
.C
se establece matemáticamente como la ecuación a continuación. con la ecuación, se puede hacer una matriz que aumenta en zigzag como se muestra a continuación.C
indica el orden de los elementos de M en resultados zigzagificados. Luego,[~,I]=sort(C(:));
devuelve el orden, es decirI
,V=V(I)'
es el resultado.fuente
JavaScript (SpiderMonkey 30+), 99 bytes
Probado en Firefox 44. Toma datos como una matriz 2D.
fuente
Python 2, 84 bytes
Portando la respuesta de nimi . Toma una matriz plana con ancho y alto dados. xsot guardó un byte.
88 bytes:
Toma una matriz plana con ancho y alto dados. Ordena las coordenadas 2D correspondientes
(i/w,i%w)
en orden de zigzag de suma creciente para obtener diagonales, separadas por el aumento o la disminución del valor de la fila, en función de si la fila más la columna es impar o par.fuente
Haskell,
797873 bytesLa entrada es una lista plana con el número de filas y columnas, por ejemplo,
( [1,2,6,3,1,2,5,9,4,7,8,3] # 2) 6
->[1,2,5,9,6,3,4,7,1,2,8,3]
.Cómo funciona: recorra las coordenadas xey de la matriz (
h
filas,w
columnas) en dos bucles anidados:es decir, de arriba / derecha a abajo / izquierda, omitiendo los índices encuadernados (
y
yx
debe satisfacery<h
yx-y<w
). Cuandox
es par, el orden del bucle interno se invierte:y
va dex
a0
. Hago esto eligiendo una función de modificación para el rango y[0..x]
que es elx
elemento th de[reverse,id,reverse,id,...]
.Editar: @xnor reorganizó los bucles y guardó 5 bytes. ¡Gracias!
fuente
g=id:reverse:g
.(y-x)*w
se pueden cortar mediante la transposición del problema:(m#h)w=[m!!(x*w+y-x)|y<-[0..h+w],x<-g!!y$[0..y],x<h,y-x<w] g=reverse:id:g
. La traducción a Python ahorra 3 caracteres sobre lo que tenía.Python 2 + NumPy, 122 bytes
Lo admito. Trabajé por delante. Desafortunadamente, este mismo método no puede modificarse fácilmente para resolver los otros 2 desafíos relacionados ...
Toma una matriz numpy como entrada. Emite una lista.
Pruébalo en línea
Explicación:
Una lambda tiene la misma longitud:
fuente
Python 3,
131118115107 bytesBasado en el mismo principio que mi respuesta al desafío de Deusovi
Supongo que no podemos tener cero en la matriz de entrada
Explicación
cómo funciona :
Resultados
fuente
reverse even line
serreverse odd lines
en su lugar?