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.
quelle
Antworten:
MATL ,
8685 BytesDiese Lösung basiert auf dem File Exchange-Eintrag von Jonas Lundgren, der komplexe Zahlen verwendet, um die Hilbert-Kurve zu erstellen. Diese komplexen Zahlen werden dann in Indexwerte konvertiert, um die Elemente der Matrix abzurufen, die entlang der Kurve fallen.
Probieren Sie es online!
Erläuterung
quelle
APL (Dyalog Unicode) , 41 Byte SBCS
30 Bytes (!) Gespart, indem die Weisheit von APL Orchard konsultiert wurde, insbesondere @ngn und @ Sherlock9.
Probieren Sie es online!
Erklärung wie folgt:
Weitere Details zu " Monadic Transpose Scan ".
Dyalog-Dokumentation zum Fehlerschutz .
quelle
Mathcad, 302 Bytes
Das folgende Mathcad-Programm basiert auf dem @ Sherlock9-Python-Programm. Sie unterscheidet sich durch die Krümmung rechteckiger Matrizen, indem die Teile der Hilbert-Kurve ignoriert werden, die außerhalb der Matrixgrenzen liegen. Beachten Sie, dass Mathcad ein relativ schlechtes String-Handling hat, weshalb ich die Lindenmayer-Symbole Ganzzahlen in der Hilbert-Funktion zugeordnet habe.
Mathcad arbeitet über eine 2D-Oberfläche, mit der der Benutzer mathematische Ausdrücke, Diagramme, Texte, Eingaben und Ausgaben platzieren (und beliebig mischen) kann. Ich habe ein Byte der minimalen Benutzertastatur-Entsprechungsoperation zum Erstellen eines Symbols gleichgesetzt (zum Beispiel wird der Definitionsoperator (: =) durch einfaches Eingeben von: eingegeben.
quelle
Python 3,
327289275271239234 BytesDies ist eine Lösung, die ich von meiner Antwort auf eine andere Hilbertkurvenfrage hier geändert habe . Alle Golftipps sind willkommen.
Bearbeiten: Ändert, wie
g
inkrementiert und dekrementiert wird. Jetzt miteval()
undstr.translate
. Nicht mehr verwendenl=len(s)
.Ungolfed:
quelle
Wolfram - 233
Basierend auf der Darstellung als Lindenmayer-System :
quelle
Ruby,
224221216 BytesDiese Antwort basiert auf meiner Python-Antwort .
Ungolfing:
quelle
CJam, 60
Probieren Sie es online aus
Erläuterung:
Ich baue das Fraktal als eine Reihe von Bewegungsrichtungen auf: 0 = rechts, 1 = unten, 2 = links, 3 = oben.
quelle