Inspiré par cette question
Une autre façon de dérouler une image 2D dans une chaîne 1D consiste à utiliser une courbe de Hilbert.
Il existe de nombreuses versions de cette courbe, selon le nombre d'itérations utilisées lors du calcul. Ci-dessous, un exemple de courbes de Hilbert du premier au cinquième ordre.
La façon de calculer cette courbe est la suivante. D'abord, nous définissons la courbe de Hilbert de premier ordre comme celle représentée sur la figure (celle pour n = 1), de sorte qu'elle s'insère dans un carré 1x1. Nous faisons ensuite quatre copies de cette courbe, en les espaçant dans un carré 4x4, afin qu'elles présentent toutes la "concavité" vers le côté gauche. Nous inversons ensuite les deux courbes d'ordre 1 les plus à gauche, de sorte que la concavité du haut soit tournée vers le haut, tandis que celle du bas fait face au bas. Nous connectons enfin les coins des courbes de Hilbert adjacentes. Si vous voulez obtenir une courbe d'ordre (n + 1), il suffit de répéter le processus avec quatre courbes d'ordre n. Nous pouvons voir une visualisation du processus ici (j'ajouterai également une image détaillant le processus bientôt)
Votre tâche dans ce défi est de dérouler une matrice d'entiers le long de la courbe de Hilbert d'ordre le plus bas pour cette matrice.
Par souci de simplicité, nous aurons la courbe en partant du coin supérieur gauche de la matrice.
Vous pouvez recevoir l'entrée soit sous la forme d'une liste de liste d'entiers, où chaque sous-liste représente une ligne de la matrice.
Vous pouvez supposer que l'entrée sera une matrice carrée (n * n).
Par exemple:
Contribution:
[[ 1, 2,]
[ 3, 4 ]]
Production:
[ 1, 2, 4, 3 ]
Puisque nous utilisons la courbe de Hilbert de premier ordre illustrée sur la figure
Contribution:
[[ 1, 2, 3, 4, ]
[ 5, 6, 7, 8, ]
[ 9, 10, 11, 12, ]
[ 13, 14, 15, 16 ]]
Production:
[ 1, 5, 6, 2, 3, 4, 8, 7, 11, 12, 16, 15, 14, 10, 9, 13 ]
Utilisation de la courbe de Hilbert de second ordre
Comme d'habitude, les échappatoires standard ne sont pas autorisées.
C'est le code-golf, donc la réponse la plus courte en octets l'emporte.