Eine Hilbert-Kurve ist eine Art raumfüllende Kurve und ordnet im Grunde eine Linie einer Ebene zu. Jeder Punkt in der Linie entspricht nur einem Punkt in der Ebene, und jeder Punkt in der Ebene entspricht nur einem Punkt auf der Linie. Dargestellt sind die Iterationen 0 bis 4 der Hilbert-Kurve:
Iterationen 0 bis 4:
Das Ziel dieser Aufgabe: Schreiben Sie Code, der die vierte Iteration der Hilbert-Kurve wie oben definiert zeichnet. Ihr Code sollte vollständig sein. Wenn Sie also eine Funktion zum Zeichnen der Hilbert-Kurve erstellen, muss Ihr Code diese Funktion aufrufen. Die Ausgabe kann entweder direkt auf dem Bildschirm angezeigt werden, oder Sie können die Ausgabe in eine Bilddatei schreiben. Die Kurve kann gedreht oder gespiegelt werden, die Linien müssen sich jedoch im rechten Winkel schneiden, und die Ausgabe kann nicht gedehnt werden. ASCII-Kunst wird geschätzt, aber nicht akzeptiert. Kürzester Code in Bytes gewinnt!
quelle
Antworten:
R, 90 Bytes
Schamloser R-Port des Algorithmus, der in dem von @Luis Mendo geposteten Link verwendet wird.
Denn
n=5
wir bekommen:quelle
MATL ,
3938 BytesDies übernimmt die Anzahl der Iterationen als Eingabe. Wenn Sie es hart codieren möchten, ersetzen Sie es
i
durch die Nummer.Das Programm ist eine Portierung des hier gezeigten Matlab-Codes von Jonas Lundgren .
Das Ergebnis ist unten dargestellt. Sie können es auch bei MATL Online ausprobieren! Die Ausgabe dauert einige Sekunden. Dieser Compiler ist experimentell. Möglicherweise müssen Sie die Seite aktualisieren und erneut auf "Ausführen" klicken, wenn dies anfangs nicht funktioniert.
Erläuterung
quelle
MATLAB,
264262161 BytesDies funktioniert immer noch sehr ähnlich, außer dass wir im Grunde genommen die "Ableitung" der Hilbert-Kurve berechnen, die wir dann über "Cumsum" "integrieren". Dies reduziert die Codegröße um eine ganze Menge Bytes.
Alte Version
Dies ist nur ein rekursiver Ansatz. Ich habe der Einfachheit halber komplexe Zahlen verwendet, um vektorielle Informationen zu speichern. Sie können die Kurve am Teil ändern
h(0,1,1+i,4)
. Das erste Argumentp=0
ist die Anfangsposition, das zweite Argumentf
ist ein Flag für die Ausrichtung (+1
oder-1
), das dritte Argumentd
ist die Richtung / Drehung, in der die Kurve gezeichnet werden soll, und das vierte Argumentl
ist die Rekursionstiefe.So sieht es in älteren Versionen aus:
So sieht es 2015b aus:
->quelle
cumsum
Idee, die einfach genial ist, ein bisschen Golf spielen !MATLAB / Octave, 202 Bytes
Ich bemerkte die Version @LuisMendo verknüpft
heißtwar viel kürzer als die bisherigen „handmade“ Lösung nutzt aber einen ganz anderen Ansatz. Ich poste hier jetzt eine Golfversion als CW:Diese Version basiert auf dem Lindenmayer-Systemansatz:
quelle
JavaScript (ES6),
266...233232 BytesEin SVG-Rendering der Hilbert-Kurve.
1 Byte dank Neil gespeichert
quelle
fill=none
Python 3,
177175171 BytesEine einfache Implementierung des Lindenmayer-Systems für die Hilbert-Kurve. Golfvorschläge willkommen!
Edit: -2 Bytes dank Kade. -3 Bytes aus der Umstrukturierung der Hilbert-Kurve. -1 Byte mit Dank an ETHproductions.
Ungolfing
quelle
t
zwei Bytes speichern können:t+=[[c,"+AF-BFB-FA+"][c=="B"],"-BF+AFA+FB-"][c=="A"]
. Da das Muster für die beiden fast gleich ist, frage ich mich, ob es eine Möglichkeit gibt, das zu verwenden.if c>"E":
,if"E"<c:
um ein Byte zu speichern?MSWLogo (Version 6.5b), 136 Byte
Basierend auf dem endgültigen Hilbert-Kurvenprogramm hier .
Es
h
wird eine Funktion definiert, die die Anzahl der Iterationen:n
(1-basiert), den Winkel:a
und die Länge verwendet:l
. Es ist rekursiv und ruft eine niedrigere Iteration von sich selbst auf, wobei der Winkel:a
in zwei Fällen negiert wird, um die richtige Ausrichtung zu erzielen.rt :a
,lt :a
drehe die Schildkröte (Dreieck-Ding, dessen Weg verfolgt wird) nach rechts, links von:a
Grad.fd :l
bewegt die Schildkröte schrittweise vorwärts:l
.Schließlich wird die Funktion aufgerufen:
h 5 90 9
. Die Schildkröte kann für zusätzliche 2 Bytes ausgeblendet werdenht
.quelle
ht
.Mathematica 128 Bytes
Ersetzen Sie die 4 oben durch eine andere Anzahl von Iterationen, wenn Sie möchten.
Wird als Lindenmayer-System mit ganzzahligen Sequenzen anstelle von Zeichenfolgen ausgeführt, sodass die zweite Produktionsregel nur das Negativ der ersten Regel ist. Diese Version ist 151 Bytes.
Der Port des MATLAB-Codes von Jonas Lundgren ist nur 128 Byte groß.
Ich sehe, dass dies in einer zukünftigen Version von Mathematica sehr kurz werden kann, so etwas wie:
http://mathworld.wolfram.com/HilbertCurve.html
quelle
LindenMASM , 63 Bytes
Noch eine Frage mit einer LindenMASM-Antwort? Genial!
Aufgrund einiger Zeichnungsfehler mit Python ist
turtle
manchmal, wenn Sie dies ausführen, die gesamte Zeichnung nicht vorhanden. Sie können jedoch sehen, dass es tatsächlich funktioniert:quelle