Führen Sie ein Lindenmayer-System aus
Ein Lindenmayer-System (oder L-System) ist mit Thue- und Post- Systemen verwandt und wird in der botanischen Modellierung und Fraktalerzeugung verwendet .
Ein L-System wird durch Umschreiben von Zeichenfolgen beschrieben , wobei ein Symbol aus dem Symbolalphabet auf eine Ersatzsequenz von Symbolen abgebildet wird . Eine Sammlung dieser Abbildungen bildet das eigentliche L-System.
Die von Prusinkiewicz entwickelte grafische Ausgabemethode interpretiert die resultierende Sequenz, nachdem die Zuordnungen für eine bestimmte Anzahl von Iterationen auf eine Anfangssequenz angewendet wurden , als Turtle-Drawing-Befehle: Vorwärts, Rückwärts, Links, Rechts, solche Dinge. Dies erfordert möglicherweise zusätzlichen Code, um den Maßstab der Zeichnung zu steuern, da unterschiedliche Iterationszahlen Bilder mit drastisch unterschiedlicher Größe erzeugen können.
Ihre Aufgabe ist es, ein L-System mit der geringsten Anzahl von Zeichen auszuführen. Ihr Programm muss in der Lage sein, sowohl die Drachenkurve als auch die Verzweigungsstämme von der Wikipedia-Seite zu rendern, indem Sie die entsprechende Eingabe (Datei, Befehlszeile, aber bitte außerhalb der Quelle) bereitstellen.
Das ist Code Golf.
Bearbeiten: Hier sind einige Beispiele, die ich in der Stadt gepostet habe. Antwort auf SO / Rotate-Nord { Wo ich zuerst das L-System entdeckt } , Antwort auf SO / wie-zu-Programm-a-Fraktal , Antwort auf SO / Rekursion-in-Nachsatz , comp.lang.postscript Diskussion / Erwägungsgrund , Postscript-L-System-Sammlung , Codegolf.SE/draw-a-sierpinski-triangle {Ursprung des Wettbewerbs zwischen mir und ThomasW} .
quelle
Antworten:
Mathematica
200198188171168Leerzeichen zur Verdeutlichung hinzugefügt:
Woher:
Grammatik der Produktionsregeln:
Die {2,4,6,8} -Sequenz ist da, weil ich
I^n
(I
= imaginäre Einheit) verwende, um Runden zu machen.Beispiele:
quelle
Graphics@k
durch ,Graphics@Flatten@k
wenn Sie vorhaben , viele Iterationen zu verwenden. Andernfalls wird ein Rekursionslimit Sie beißen und Ihre MMA-Sitzung wird abgebrochen.Python,
369294Kein Gewinner, aber ich werde trotzdem posten, was ich versucht habe.
Nicht gut im Golfen mit Python ...... Vielleicht kann es jemand anderes tun.
Eingang
Die Eingabe erfolgt aus einer externen Datei mit dem Namen "l" (keine Erweiterung) im folgenden Format:
Zeile 1 : Anfangszustand (Axiom)
Zeile 2 : Kommagetrennte Regeln
Symbole
f
undF
: Vorwärts zeichnen+
: 5 Grad nach rechts drehen: 5 Grad nach-
links drehen[
: Position und Überschrift speichern]
: Pop-Position und ÜberschriftAndere Symbole werden von der Zeichenfunktion ignoriert.
Regeln
Eine Regel hat das Format
"predecessor":"successor(s)"
Beachten Sie, dass einfache oder doppelte Anführungszeichen erforderlich sind.
predecessor
muss ein einzelnes Zeichen sein.Außerdem gibt es keine impliziten Konstanten: Sie müssen für diese explizit eine Änderungsregel angeben.
Beispiele
Verzweigungsstiele
Ausgabe
Beachten Sie, dass die Quelle so geändert wird, dass diese nur ausgegeben wird, um die Grafik auf den sichtbaren Bereich zu verkleinern. Die Konsole wird auch verwendet, um die "Schildkröte" zu verstecken.
Drachenkurve
Ausgabe
Wieder wird die Konsole verwendet, um die "Schildkröte" zu verbergen.
Sierpinski-Dreieck
Output
Generations hier auf 5 reduziert.
quelle
f
,r
,l
; Hinzufügen eines Dummy-Parameters zuo
undc
; und dann den Pseudo-Schalter auf{'f':fd,'F':fd,'+':rt,'-':lt,'[':o,']':c}[k](5)
g
, und ich denke,o
undc
es lohnt sich, mit Inline-if
Anweisungen zu beseitigen (billiger als dieglobal
Erklärung)o
undc
direkt im Pseudo-Switch), gaben Syntaxfehler, andere jedoch nicht. ' t.s,R,*p=input().split()
. 3. Generieren Sie den Endwert vons
byexec('s="".join(map(eval(R).get,s));'*8)
. 4. Auslassencontinue
. 5. Nur 1 Leerzeichen einrücken. 6. Speichern Sie den Platz nach dem,if
indem Sie die Seiten für den Test wechseln. 7. Geben Siek:int
dendict
(ersten Eintrag) ein und dann brauchen Sie nichtexcept: try:
. (Ich erhalte 215 Zeichen.)Javascript (179 Bytes)
Dies ist nicht ganz sicher, da das Regelobjekt die gesamte Zeichnung ausführt.
Demo (Dragon, animiert):
- Erweitert: http://jsfiddle.net/SVkMR/9/show/light
- Mit Code: http://jsfiddle.net/SVkMR/9/
Minimiert:
Lesbar (ish):
Eingang:
Verwendung:
Bonus: Golden Spiral http://jsfiddle.net/SVkMR/35/show/light/
quelle
Nachsatz
264298295255Hier ist mein Versuch, es anders zu machen. Anstelle der Makro-Erweiterung, die ich normalerweise verwende, überprüft diese die Größe des Ausführungsstapels, um die Rekursion zu begrenzen. Wenn die Grenze überschritten wird, wird die Prozedur nicht mehr rekursiv überprüft und es wird versucht, Turtle-Befehle zu interpretieren (und
pop pop
ansonsten verworfen ). Ein Vorteil dieser Methode ist, dass sie keinen enormen Speicherbedarf hat. Ein Nachteil ist, dass die Rekursionssteuerung ziemlich umständlich ist, da die Stapelgröße von einer Rekursionsstufe zur nächsten um mehr als nur 1 zunimmt.Bearbeiten: +34 Zeichen zum Verzweigen.
Bearbeiten: -3 Zeichen. Überarbeitet, um den Operandenstapel für die Rekursionssteuerung zu verwenden. Dies macht das Basissystem viel einfacher. Aber Klammern brauchen einen unabhängigen Stapel, also habe ich die gespeicherte Position in den Wörterbuchstapel eingefügt und fast alle Einsparungen zurückgezahlt.
Neu gestaltet, um Zeichenfolgen und Ganzzahlen anstelle von Arrays und Namen zu verwenden.
Bearbeiten: -40 Zeichen. Es wurden zwei Prozeduren zum Aufrufen von Systemnamen nach Nummer hinzugefügt (Ich kann nicht scheinen, dass rohe Binärtoken funktionieren. Aber diese Redewendung funktioniert für mich.)
Semikommentierte Binärdatei.
Un- "binär".
Dazu muss das L-System in einem Wörterbuch auf dem Dictstack definiert sein, mit der Anfangszeichenfolge und der Startposition der Schildkröte auf dem Operandenstapel (vor der Quelle, z. B.
gs dragon.sys lsys.ps
).Drachenkurve.
Verzweigungsstiele.
Ungolfed und kommentiert.
Um es auszuführen, können diese 3 Blöcke als 3 Dateien gespeichert werden: dragon.ps, stems.ps, lsys.ps (jeder der obigen Programmblöcke funktioniert identisch). Dann laufe mit gs:
gs dragon.ps lsys.ps
odergs stems.ps lsys.ps
. Bei Bedarf können sie auch zuerst verkettet werden:cat dragon.ps lsys.ps | gs -
odercat stems.ps lsys.ps | gs -
.Kein Stängelbild. In höheren Tiefen wird es nicht interessanter.
quelle
Mathematica 290
Diese Bare-Bones-Implementierung konzentriert sich eher auf die Ausgabe als auf die Verarbeitung. Es werden keine Produktionsregeln verwendet. Daher ist dies möglicherweise keine geeignete Antwort auf die Herausforderung.
Verzweigungsstiele nach Theo Grays Vorführung .
Code
Verwendung
Der erste Parameter bestimmt, ob die Drachenkurve oder die Zweigstämme angezeigt werden. Der zweite Begriff bezieht sich auf die Generation.
Mehr Beispiele
quelle
A->F[+A][-A]
WoF
ist bewegen,+
ist links drehen 30,-
ist rechts drehen 30, und[
/]
sind Push / Pop