Hintergrund
Ein L-System (oder Lindenmayer-System) ist ein paralleles Umschreibungssystem, mit dem unter anderem Fraktale einfach modelliert werden können. Diese Frage betrifft deterministische, kontextfreie L-Systeme . Diese bestehen aus einem Symbolalphabet, einer anfänglichen Axiomzeichenfolge und einem Satz von Umschreiberegeln, die jedes Alphabetsymbol einer neuen Zeichenfolge zuordnen. Die Regeln werden parallel auf das Axiom angewendet und erzeugen einen neuen String. Dieser Vorgang wird dann wiederholt.
Zum Beispiel erzeugt das System mit dem Axiom "A" und den Regeln A = ABA; B = BBB die Folge von Zeichenfolgen "ABA", "ABABBBABA", "ABABBBABABBBBBBBBABABBBABA" usw. Aus Gründen der Übersichtlichkeit erwähnen wir das nicht ausdrücklich Alphabet bei der Definition des L-Systems. Weiterhin wird angenommen, dass jedes Symbol ohne explizite Umschreiberegel unverändert ist (dh die Standardregel für ein Symbol A ist A = A).
L-Systeme können mit einer Form von Schildkrötengrafiken visualisiert werden. Konventionell beginnt die Schildkröte nach rechts zu blicken. Eine Zeichenkette wird dann durch Iteration über ihre Symbole gezogen: Ein F bedeutet "eine Einheit nach vorne ziehen", ein G bedeutet "eine Einheit nach vorne ziehen", ein + bedeutet "um eine Winkeleinheit nach links drehen" und ein - bedeutet "um einen Winkel nach rechts drehen" Einheit". Alle anderen Symbole in der Zeichenfolge werden ignoriert. Für die Zwecke dieser Frage wird angenommen, dass die Winkeleinheiten immer 90 ° sind.
Aufgabe
Wenn eine Spezifikation eines L-Systems und eine Anzahl von Iterationen gegeben ist, sollte Ihr Programm eine ASCII-Wiedergabe der resultierenden Zeichenfolge (wie oben beschrieben) unter Verwendung von Box-Zeichen ausgeben.
- Die Parameter werden als durch Leerzeichen getrennte Zeichenfolge übergeben, die das Axiom, die Umschreibungsregeln (als; -getrennte Liste von Gleichungen) und die Anzahl der Umschreibungsiterationen enthält. Beispielsweise erzeugt die Eingabe "FF = FGF; G = GGG 2" die Zeichenfolge "FGFGGGFGF" und zeichnet daher vier Linien mit entsprechenden Lücken.
- Die vom L-System verwendeten Symbole können beliebige ASCII-Zeichen außer Leerzeichen und Semikolon sein. Es ist höchstens eine explizite Regel pro Symbol angegeben (wobei die Standard-Umschreiberegel die Identitätszuordnung ist, wie oben beschrieben).
- Sie können davon ausgehen, dass die Ausgabe immer mindestens ein F enthält.
- Die Ausgabe sollte die folgenden UNICODE-Box-Zeichen zur Darstellung der Visualisierung verwenden: ─ (U + 2500), │ (U + 2502), ┌ (U + 250C), ┐ (U + 2510), └ (U + 2514) , U (U + 2518), ├ (U + 251C), ┤ (U + 2524), ┬ (U + 252C), ┴ (U + 2534), ┼ (U + 253C), ╴ (U + 2574), ╵ (U + 2575), ╶ (U + 2576) und ╷ (U + 2577). Unten finden Sie Beispiele.
- Die Ausgabe sollte keine Leerzeilen über oder unter dem obersten Kästchen enthalten. Es sollte auch keine Leerzeichen links vom linken oder rechts vom rechten Kästchen enthalten. Zeilen mit nachgestellten Leerzeichen, die nicht über das Feld ganz rechts hinausragen, sind zulässig.
Sie können ein Programm oder eine Funktion schreiben und Eingaben über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen. Die Ergebnisse sollten auf STDOUT (oder der nächstgelegenen Alternative) gedruckt, in einer Datei gespeichert oder als Zeichenfolge zurückgegeben werden.
Beispiele
# Cantor dust
>> "F F=FGF;G=GGG 0"
╶╴
>> "F F=FGF;G=GGG 1"
╶╴╶╴
>> "F F=FGF;G=GGG 2"
╶╴╶╴ ╶╴╶╴
>> "F F=FGF;G=GGG 3"
╶╴╶╴ ╶╴╶╴ ╶╴╶╴ ╶╴╶╴
# Koch curve
>> "F F=F+F−F−F+F 1"
┌┐
╶┘└╴
>> "F F=F+F-F-F+F 2"
┌┐
┌┘└┐
┌┘ └┐
┌┼┐ ┌┼┐
╶┘└┘ └┘└╴
Weitere Beispiele zum Testen Ihres Programms sind:
# Dragon curve
>> "FX X=X+YF+;Y=-FX-Y n"
# Hilbert curve
>> "A A=-BF+AFA+FB-;B=+AF-BFB-FA+ n"
# Sierpinski carpet
>> "F F=F+F-F-F-G+F+F+F-F;G=GGG n"
Die ersten beiden sehen wie folgt aus (erstellt mit der Antwort von @ edc65):
Sie können jedes der Systeme auf dieser Seite testen .
Wertung
Kürzester Code (in Bytes) gewinnt. Es gelten Standardregeln.
Verschiedenes
Diese Herausforderung wurde von Draw a Random Walk with Slashes inspiriert . Tatsächlich ist es möglich, einen Zufallsrundgang als L-System darzustellen, wenn wir das System so erweitern, dass mehrere Regeln pro Symbol zulässig sind , wobei die Erweiterung beim Umschreiben nicht deterministisch gewählt wird . Eine Formulierung ist:
"F F=FF;F=F+F;F=F++F;F=F+++F"
Eine andere verbreitete Erweiterung, die häufig beim Modellieren von Pflanzen verwendet wird, besteht darin, die Zeichen [und] so zu interpretieren, dass die aktuelle Position und der aktuelle Winkel verschoben und verschoben werden. Die meisten Pflanzen verwenden Winkel kleiner als 90 °, aber hier ist ein Beispiel, das dies nicht tut:
"FAX X=[-FAX][FAX][+FAX];A=AFB;B=A"
Keines dieser Beispiele muss bei dieser Herausforderung unterstützt werden.
Diese Herausforderung ähnelt auch "Tut mir leid, junger Mann, aber es ist Turtles ganz unten!" . Bei dieser Herausforderung wurde jedoch Linienrendering anstelle von ASCII verwendet und eine flexiblere Syntax ermöglicht.