Inspirado por esta pregunta
Otra forma de desenrollar una imagen 2D en una cadena 1D es usar una curva de Hilbert.
Hay muchas versiones de esta curva, dependiendo del número de iteraciones utilizadas al calcularla. A continuación, siga el ejemplo de las curvas de Hilbert de primer orden a quinto orden.
La forma de calcular esta curva es la siguiente. Primero definimos la curva de Hilbert de primer orden como la que se muestra en la figura (la de n = 1), para que quepa en un cuadrado de 1x1. Entonces hacemos cuatro copias de esta curva, espaciándolas en un cuadrado de 4x4, de modo que todas presenten la "concavidad" hacia el lado izquierdo. Luego volteamos las dos curvas de orden 1 más a la izquierda, de modo que la concavidad superior se enfrenta hacia la parte superior, mientras que la inferior se enfrenta a la parte inferior. Finalmente conectamos las esquinas de las curvas adyacentes de Hilbert. Si queremos obtener una curva de orden (n + 1), solo necesitamos repetir el proceso con cuatro curvas de orden n. Podemos ver una visualización del proceso aquí (también agregaré una imagen que detalla el proceso pronto)
Su tarea en este desafío es desenrollar una matriz de enteros a lo largo de la curva de Hilbert de orden más bajo para esa matriz.
En aras de la simplicidad, tendremos la curva comenzando desde la esquina superior izquierda de la matriz.
Puede recibir la entrada como una lista de enteros, donde cada sublista representa una fila de la matriz.
Puede suponer que la entrada será una matriz cuadrada (n * n).
Por ejemplo:
Entrada:
[[ 1, 2,]
[ 3, 4 ]]
Salida:
[ 1, 2, 4, 3 ]
Como estamos usando la curva de Hilbert de primer orden que se muestra en la figura
Entrada:
[[ 1, 2, 3, 4, ]
[ 5, 6, 7, 8, ]
[ 9, 10, 11, 12, ]
[ 13, 14, 15, 16 ]]
Salida:
[ 1, 5, 6, 2, 3, 4, 8, 7, 11, 12, 16, 15, 14, 10, 9, 13 ]
Usando la curva de Hilbert de segundo orden
Como de costumbre, las lagunas estándar no están permitidas.
Este es el código de golf, por lo que gana la respuesta más corta en bytes.