Unterlast, 196 Bytes
()()(<svg width="99" height="147">)S(<g transform="translate):S((33,33)">)S((3,0)rotate)*a(*a(~*)*~("><path d="M0h3" stroke="#"/>)~*a(*)**:(-90)a~^~(90)a~^)*::*:**:*^S(</g>)(:*)::*:**:*^S(</svg>)S
Ich dachte, es könnte interessant sein, diese Herausforderung in einem Esolang mit niedriger Leistung zu versuchen. Unterlast ist für eine Sprache mit einer so geringen Anzahl von Befehlen recht gut.
Die Ausgabe ist eine SVG-Datei mit sehr stark verschachtelten Tags und einigen Golf-Shortcuts. Bisher habe ich keinen Browser gefunden, der es anzeigen kann (Firefox bleibt einige Minuten lang hängen und versucht, es zu laden, und sowohl Firefox als auch Chromium zeigen einen leeren Bildschirm an). Die meisten Bildverarbeitungsprogramme können es auch nicht laden (was die Konvertierung in ein anderes Format erschwert), aber ich habe es geschafft, es in den Bildbetrachter Eye of Gnome zu laden (der Teil der Standardinstallation unter Ubuntu ist). Also habe ich einen Screenshot des Bildes gemacht, damit Sie es sehen können (das tatsächliche Bild hat einen transparenten Hintergrund, aber Sie können nicht wirklich einen transparenten Screenshot machen):
Wir müssen die Bildgröße explizit angeben. Durch Auswahl einer geeigneten Ausrichtung für das Bild, Zeichnen aller Elemente in der zulässigen Mindestgröße und Ausführen der Mindestanzahl von Iterationen, die durch die Herausforderung angegeben werden, erhalten wir ein Bild, das nur in eine Breite von 99 Pixel passt und ein Byte speichert. Es ist schön, wenn es so läuft.
Der allgemeine Algorithmus, der zum Zeichnen des Bildes verwendet wird, besteht darin, zwei Variablen beizubehalten (Unterlast nennt keine Variablen, aber ich habe sie als x und y betrachtet ), die beide anfangs leer waren. Dann ersetzen wir wiederholt ( x , y ) durch ( x , drehen Sie sich nach links und bewegen Sie sich vorwärts, y ) und ( x , drehen Sie sich nach rechts und bewegen Sie sich vorwärts, y ). Nach zehn Iterationen halten sowohl x als auch y eine Drachenkurve mit neun Iterationen.
Es gibt auch einige Mikrooptimierungen und unterlastungsspezifische Tricks. Um zu vermeiden, dass bei jeder Schleifeniteration zu viel mit der Stapelspitze herumgespielt wird, kombinieren wir zunächst x und y in der Funktion "Rückgabe des durch Verketten erzeugten Strings: x , eine Turn-Anweisung, das Funktionsargument, eine Move-Anweisung". Vorwärtsanweisung und y . " Diese Funktion belegt nur ein Leerzeichen im Stapel, sodass wir sie duplizieren, -90
als Argument aufrufen , den Rückgabewert unter dem Duplikat austauschen und 90
als Argument aufrufen können , um neue Werte für x und y zu erhaltenohne jemals mehr als die beiden obersten Elemente des Stapels berühren zu müssen (die bei weitem am häufigsten zugänglich sind). Diese Funktion wird zur Laufzeit durch Code generiert. Der Generator selbst wird auch zur Laufzeit mit Code generiert, damit er die Zeichenfolge wiederverwenden kann <g transform="translate
, mit der auch der Ursprung des Bildes festgelegt wird. Wir generieren zuerst alle offenen Tags und können dann, da alle schließenden Tags gerecht sind </g>
, 1024 schließende Tags durch einfaches Wiederholen der Zeichenfolge ausgeben, ohne dass wir uns darum kümmern müssen, sie mit den offenen Tags abzugleichen. (Effizientes Schreiben von Zahlen in Unterlast ist ein interessantes Problem für sich; es (:*)::*:**:*
ist jedoch wahrscheinlich die effizienteste Methode, 1024 zu schreiben, was "2 hoch (1 + 2 × 2) × 2" bedeutet.
Unterlast hat keine Grafikbibliotheken, daher erstelle ich SVG, indem ich Linien an einer festen Position zeichne und das Bild um einen bestimmten Punkt drehe. anstatt den Stift zu drehen, drehen wir das Papier. Die Idee ist, dass wir durch Zeichnen einer Linie, Drehen des gesamten Bilds, Zeichnen einer anderen Linie, erneutes Drehen des Bilds usw. Schildkrötengrafiken effektiv simulieren können, ohne Arithmetik ausführen oder Grafikbibliotheken verwenden zu müssen, da alle Linien gezeichnet werden am selben Ort. Das bedeutet natürlich, dass wir einige sehr stark verschachtelte Tags zum Drehen des Bildes haben, was viele SVG-Betrachter verwirrt.
Das Stylen des Bildes würde gegen die Byteanzahl anrechnen, daher musste ich das minimale Stylen angeben, das zum Anzeigen des Bildes erforderlich ist. Es stellt sich heraus, dass stroke="#"
dies mehr oder weniger bedeutet, dass die Linie eine Farbe haben muss. dies scheint erweitert zu werden, um es in schwarz zu zeichnen. (Normalerweise geben Sie die Farbe als "# 000" an.) Der Hintergrund ist standardmäßig transparent. Wir geben keine Strichbreite an, aber die Auswahl von Eye of Gnome lässt alles sichtbar.
Viele Unterlast-Interpreten haben Probleme mit diesem Programm, z. B. das auf Try It Online stürzt ab, weil es intern einige sehr große Zeichenfolgen generiert. Der ursprüngliche Online-Unterlast-Interpreter funktioniert jedoch. (Interessanterweise war der allererste Dolmetscher online, sodass die Sprache online verwendet werden konnte, bevor sie offline verwendet werden konnte.)
Etwas, das mir etwas unbehaglich ist, ist, dass es hier nur 1023 Liniensegmente zu geben scheint und wir 1024 erwarten würden. Es könnte sein, dass eines der Segmente am Ende nicht mit diesem Algorithmus gezeichnet wird (es würde sein) stattdessen in der nächsten Iteration gezeichnet). Wenn dies disqualifiziert, kann das Programm möglicherweise angepasst werden, es kann aber auch erheblich länger dauern. (Es ist ohnehin nicht so, dass diese Herausforderung den Wettbewerb gewinnen wird; es gibt bereits mehrere kürzere Einsendungen.)