Inspiriert von dieser Frage
Eine andere Möglichkeit, ein 2D-Bild in eine 1D-Zeichenfolge abzurollen, ist die Verwendung einer Hilbert-Kurve.
Abhängig von der Anzahl der beim Berechnen verwendeten Iterationen gibt es viele Versionen dieser Kurve. Nachfolgend sehen Sie ein Beispiel für Hilbert-Kurven von erster bis fünfter Ordnung.
Die Berechnungsweise für diese Kurve ist die folgende. Zuerst definieren wir die Hilbert-Kurve erster Ordnung als die in Abbildung gezeigte (die für n = 1), so dass sie in ein 1x1-Quadrat passt. Wir machen dann vier Kopien dieser Kurve und platzieren sie in einem 4x4-Quadrat, so dass sie alle die "Konkavität" zur linken Seite hin aufweisen. Wir drehen dann die beiden Kurven ganz links um 1, so dass die obere Konkavität nach oben zeigt, während die untere nach unten zeigt. Wir verbinden schließlich die Ecken der benachbarten Hilbertkurven. Um eine Kurve (n + 1) zu erhalten, müssen wir den Vorgang nur mit vier Kurven n-ter Ordnung wiederholen. Wir können hier eine Visualisierung des Prozesses sehen (ich werde auch bald ein Bild hinzufügen, das den Prozess detailliert)
Ihre Aufgabe bei dieser Herausforderung ist es, eine Matrix von ganzen Zahlen entlang der Hilbert-Kurve niedrigster Ordnung für diese Matrix zu lösen .
Der Einfachheit halber wird die Kurve in der oberen linken Ecke der Matrix beginnen.
Sie können die Eingabe entweder als Liste mit ganzen Zahlen empfangen, wobei jede Unterliste eine Zeile der Matrix darstellt.
Sie können davon ausgehen, dass die Eingabe eine quadratische Matrix (n * n) ist.
Beispielsweise:
Eingang:
[[ 1, 2,]
[ 3, 4 ]]
Ausgabe:
[ 1, 2, 4, 3 ]
Da wir die in der Abbildung gezeigte Hilbertkurve erster Ordnung verwenden
Eingang:
[[ 1, 2, 3, 4, ]
[ 5, 6, 7, 8, ]
[ 9, 10, 11, 12, ]
[ 13, 14, 15, 16 ]]
Ausgabe:
[ 1, 5, 6, 2, 3, 4, 8, 7, 11, 12, 16, 15, 14, 10, 9, 13 ]
Verwendung der Hilbert-Kurve zweiter Ordnung
Standardlücken sind wie üblich nicht zulässig.
Das ist Code-Golf, also gewinnt die kürzeste Antwort in Byte.