Inspirado por esta pergunta
Outra maneira de desenrolar uma imagem 2D em uma sequência 1D é usar uma Curva de Hilbert.
Há muitas versões dessa curva, dependendo do número de iterações usadas durante o cálculo. Abaixo segue o exemplo das curvas de Hilbert da primeira ordem à quinta ordem.
A maneira de calcular essa curva é a seguinte. Primeiro, definimos a Curva de Hilbert de primeira ordem como a mostrada na figura (a de n = 1), para que ela caiba em um quadrado 1x1. Nós, então, fazemos quatro cópias dessa curva, espaçando-as em um quadrado 4x4, para que todas apresentem a "concavidade" no lado esquerdo. Em seguida, invertemos as duas curvas 1 da ordem mais à esquerda, para que a concavidade superior fique voltada para o topo, enquanto a inferior fica voltada para o fundo. Finalmente, conectamos os cantos das curvas Hilbert adjacentes. Se desejar obter uma curva de ordem (n + 1), basta repetir o processo com quatro curvas de ordem n. Podemos ver uma visualização do processo aqui (também adicionarei uma imagem detalhando o processo em breve)
Sua tarefa neste desafio é desenrolar uma matriz de números inteiros ao longo da ordem mais baixa de Hilbert Curve para essa matriz.
Por uma questão de simplicidade, teremos a curva começando no canto superior esquerdo da matriz.
Você pode receber a entrada como uma lista da lista de números inteiros, onde cada sub-lista representa uma linha da matriz.
Você pode assumir que a entrada será uma matriz quadrada (n * n).
Por exemplo:
Entrada:
[[ 1, 2,]
[ 3, 4 ]]
Resultado:
[ 1, 2, 4, 3 ]
Como estamos usando a primeira curva de Hilbert mostrada na figura
Entrada:
[[ 1, 2, 3, 4, ]
[ 5, 6, 7, 8, ]
[ 9, 10, 11, 12, ]
[ 13, 14, 15, 16 ]]
Resultado:
[ 1, 5, 6, 2, 3, 4, 8, 7, 11, 12, 16, 15, 14, 10, 9, 13 ]
Usando a segunda ordem Hilbert Curve
Como sempre, brechas padrão não são permitidas.
Isso é código-golfe, então a resposta mais curta em byte vence.