... das ist also eine Herausforderung, mich zu einem Baum zu machen.
Erstellen Sie ein Programm oder eine Funktion namens tree, die ein einzelnes ganzzahliges Argument N verwendet und einen Pythagoras-Baum mit einer Tiefe von N Ebenen zeichnet, wobei die Ebene 0 nur der Stamm ist.
Jeder Knotenpunkt des Baumes sollte den Scheitelpunkt des Dreiecks an einem zufälligen Punkt am Umfang platzieren (dieser Punkt sollte gleichmäßig über mindestens 5 gleichmäßig verteilte Punkte oder gleichmäßig über den gesamten Halbkreis verteilt sein).
Optional kann Ihr Baum 3d sein, bunt sein oder je nach Tageszeit beleuchtet werden. Dies ist jedoch Code-Golf, so dass die kleinste Datei gewinnt.
EDIT: Ich schließe den Wettbewerb und akzeptiere die kleinste Antwort, wenn es eine Woche alt ist
quelle
Antworten:
Mathematica,
246234221 ZeichenDies ist sicherlich nicht der eleganteste / kürzeste Weg, dies zu tun.
Verwendung:
f[8]
Und hier sind beispielsweise Ausgaben für
f[6]
undf[10]
jeweils.Etwas ungolfed:
quelle
Show
undModule
sind auch unnötig.Show
Hinweis, aber wie kann ich das loswerdenModule
? Wenn ichp
local nicht deklariere , wird es in den rekursiven Aufrufen überschrieben, sodass ich nicht beide Aufrufe mit demselben ausführen kannp
, oder?Block
, das kürzer ist alsModule
.CFDG, 134 Zeichen
Dieser ist nicht genau gültig, da Sie die Rekursionstiefe nicht einschränken können. Aber das Problem nur Anrufe für eine Lösung in diesem . :)
Die Ergebnisse sehen ungefähr so aus
Für weitere 46 Zeichen (insgesamt 180 Zeichen ) können Sie es sogar einfärben:
quelle
Postscript,
322270Bearbeiten: Es
realtime
sieht so aus, als könne kein richtiger Zufallsgenerator-Startwert verwendet werden. Daher verwenden wir für diesen Zweck die Umgebungsvariable und führen das Programm folgendermaßen aus:oder
Jetzt sind unsere Bäume weniger vorhersehbar. 14 Bytes werden zur Gesamtanzahl hinzugefügt. Sonstige Änderungen: 1) Das Programmargument wird jetzt in der Befehlszeile übergeben. 2) Zu diesem Zweck dient keine explizite Iterationszählstapelgröße (der Rotationswinkel des linken Zweigs wird auf dem Stapel gespeichert, um später den rechten Zweig zu zeichnen). 3) Es gibt keine benannte Variable für die erforderliche Tiefe - die Stapelgröße ist der Versatz auf dem Stapel. Es bleibt dort beim Verlassen, dh es wird nicht verbraucht.
Ich denke, es ist ziemlich offensichtlich - der Grafikstatus ist vorbereitet und die
f
Prozedur wird für jede aufeinanderfolgende Tiefenebene zweimal rekursiv aufgerufen - für 'linke' und 'rechte' Zweige. Das Arbeiten mit einem Rechteck mit der1x1
Größe (siehe Originalmaßstab) erspart die Multiplikation mit der Seitenlänge. Der Drehwinkel des linken Zweigs ist zufällig gewählt - es wird eine von 5 zufälligen, gleichmäßig verteilten Unterteilungen verwendet - ich denke, dies verhindert mögliche hässliche Fälle für eine gleichmäßige Zufälligkeit.Bei einer erforderlichen Tiefe von mehr als 20 kann es langsam sein.
Als nächstes folgt die Golfversion mit ASCII-codierten binären Token (siehe die Antwort von luser droog aus dem verlinkten Thema). Beachten Sie ,
cos
,sin
,rand
können diese Schreibweise verwenden..
quelle
-dGraphicsAlphaBits
ist ein Flag für die Anti-Alias-Ausgabe, um gezackte Kanten größerer Quadrate zu verhindern. Es kann weggelassen werden (oder in z. B. Umgebungsvariablen 'versteckt' werden). Einige Leute mögen es vielleicht mehr ohne diese Flagge (Baumblätter bekommen mehr "Volumen"). Nun, diese 20 Bytes sind nicht so wichtig. Ich würde sagen, 20-25% Rabatt bei Verwendung von ASCII-codierten binären Token (gemessen an der Antwort auf ein verknüpftes Thema). Möglicherweise 50% Rabatt ohne ASCII-Codierung, 2 binäre Bytes pro Systemnamens-Token.Coffeescript
377B352BIch fühle mich beim Schreiben von Coffeescript schmutzig, aber ich kann kein anständiges Zeichenpaket für python3 finden: - /
Javascript
393B385BEtwas hübscher in Javascript und ich bin mit der for-Schleife viel zufriedener, aber ohne die Syntax [x, y, z] = Ich kann es einfach nicht kurz genug machen, um Coffeescript zu übertreffen
Ich muss sagen, ich bin ein bisschen verärgert, das ist fast doppelt so lang wie die Mathematica-Lösung: - / sehe es in Aktion: http://jsfiddle.net/FK2NX/3/
quelle
X
RückgabeX
verketten. Und Sie können durch die Einsparung wieder ein gutes Bündel von Zeichen speichernM.sin
undM.cos
in Variablen mit einem Zeichen.s=M.sin
.rotate
verwendetthis
undsin
nicht. Sie müssten so etwas tunR=X.rotate.bind(X)
, aber das ist es wahrscheinlich nicht mehr wert.