Eine Koch-Schneeflocke generieren
Eine Koch-Schneeflocke ist ein Dreieck, n
in dessen Mitte jeweils ein weiterer gleichseitiger Punkt eingefügt wird: http://en.wikipedia.org/wiki/Koch_snowflake#Properties
Wir hatten bereits eine Kolmogrov-Komplexität Koch Snowflake Herausforderung für n=4
. Die neue Herausforderung besteht darin, eine Kochschneeflocke n
zwischen 1
und zu zeichnen 10
.
Regeln
Die Schneeflocken sind möglicherweise nicht im Programm oder in Dateien fest codiert - sie müssen von Ihrem Programm generiert werden.
Ihr Programm muss alle Größen
n
zwischen 1 und 10 unterstützen.Die Anzahl der Seiten muss vom Benutzer über die Standardeingabe eingegeben werden.
Sie müssen eine grafische Darstellung der Schneeflocke auf dem Bildschirm drucken.
Probieren Sie Koch-Schneeflocken mit den n
Werten 1, 2, 3 und 4 aus (grüne Linien nur zur Verdeutlichung, reproduzieren Sie sie nicht):
Bei einem Tie-Break gewinnt das Programm mit der höchsten Anzahl von Upvotes (Pop-Contest).
quelle
n=7
können Sie die neu hinzugefügten Dreiecke in der Schneeflocke auf einem Computerbildschirm nicht sehen. Ist hier alles in Ordnung? Gibt es eine Mindestauflösung für pixelbasierte Lösungen?Antworten:
Mathematica 72
n = 3
Danke für Alephalpha.
quelle
AnglePath
in Mathematica 10.1 verwenden.Graphics@Line@AnglePath[Nest[Join@@({-1,2,-1,#}&/@#)&,{2,2,2},Input[]-1]Pi/3]
ListLinePlot@AnglePath[Nest[Join@@({#,1,4,1}&/@#)&,{4,4,4},Input[]-1]π/3]
MATLAB,
119,115In einer ungewöhnlichen Wendung stellte ich fest, dass dieses Programm tatsächlich besser funktionierte, als ich es spielte. Erstens wurde es aufgrund der Vektorisierung viel schneller. Jetzt wird eine hilfreiche Eingabeaufforderung angezeigt,
~n:~
die den Benutzer daran erinnert, welche Menge eingegeben werden muss!Newlines sind nicht Teil des Programms.
n = 9:
o
ist eine willkürliche Zeichenkette, die gleich[0 2 4 0]
Modulo 6 ist. e iπ / 3, erhöht auf diese Potenzen, ergibt die Eckpunkte eines gleichseitigen Dreiecks in der komplexen Ebene. Die erstekron
wird verwendet, um eine Kopie der Punkteliste zu erstellen, wobei jede 4-mal dupliziert wird.~~o
ist der bequeme Weg, um einen Vektor von 4 zu erhalten. Zweitensdiff(P)
findet der Vektor zwischen jedem Paar aufeinanderfolgender Punkte. Zu jedem der alten Punkte werden Vielfache dieses Vektors (0, 1/3, (1 + e -iπ / 3 ) / 3 und 2/3) addiert.quelle
T-SQL: 686 (ohne Formatierung)
Für SQL Server 2012+.
Auch wenn dies niemals ein Konkurrent sein wird, musste ich sehen, ob ich es in T-SQL schaffen konnte. Der Ansatz, mit den drei Anfangskanten zu beginnen, dann durch jede Kante zu rekursieren und sie für jedes Level durch 4 Kanten zu ersetzen, ist vorüber. Zum Schluss wird alles in einer einzigen Geometrie für die Ebene zusammengefasst, die für @i angegeben wurde
quelle
LOGO: 95
Definiert die Funktion
k
mit einem einstufigen Parameter.Bearbeiten
In diesem Online-Editor können Sie http://www.calormen.com/jslogo/ hinzufügen
k readword
zur Verwendung Eingabeaufforderung , aber aus irgendeinem Grund unterstützt dieser Befehl die Standardabkürzung nichtrw
.Die folgende Lösung mit 102 Zeichen funktioniert in USBLogo mit der in der Frage angegebenen Standardeingabe. Der Code musste jedoch leicht geändert werden, da UCBLogo einen seltsamen Parser hat. Es erfordert
to
undend
in getrennten Zeilen und Leerzeichen zu sein, bevor:
es erforderlich ist, aber auf der anderen Seite:
sind optional.quelle
BBC BASIC, 179
REV 1
Nach wie vor, jedoch in Schwarzweiß, ungolfed (aber stromlinienförmig) und golfed. Kein Gewinner, obwohl auf diese Weise die Notwendigkeit einer speziellen Behandlung für n = 1 vermieden wird.
REV 0
Laut der Antwort des OP auf @xnor sind ausgefüllte Schneeflocken in Ordnung. Diese Antwort wurde von xnors Kommentar inspiriert. Die Farben sind nur zum Spaß und um zu zeigen, wie es aufgebaut ist. Nehmen Sie ein Dreieck (in diesem Fall Magenta) und überzeichnen Sie es mit 6 Dreiecken 1/3 der Basis.
quelle
Mathematica - 177
Bonusclip zum Variieren des Winkels des Mittelstücks
quelle
Python 3 - 139
Verwendet die Turtle-Grafikbibliothek.
quelle
"G">j
,"Q"<j
und verwenden Siefd(9/b)
3 Bytes speichern? Außerdem können Sie vermeiden, dass sich dieif
Anweisungen beispielsweise("G">j)
mit dem Argument multiplizieren,9/b
und sie alle in einer Zeile dahinter setzenfor
. Oh! Dann können Sie sogar kombinierenrt
undlt
verwenden120*(...)-60*(...)
Python 3, 117 Bytes
Methode:
n
istinput - 1
0000
wir jedes Zeichen101
n
mit dem eval-Trick (danke an @xnor dafür).1
oder0
), und bewegen uns dann um eine Länge (99/3^n
) vorwärts, die allen eine ähnliche Größe garantiertn
.0
der Zeichenfolge ist unbrauchbar,0
zeichnet jedoch nur dieselbe Linie neu, die beim ersten Mal gezeichnet wurde .Beispielausgabe für
input = 3
:quelle
R:
240175Da ich versuche, mich um R zu kümmern, ist hier eine andere Version. Es gibt wahrscheinlich viel bessere Möglichkeiten, dies zu tun, und ich freue mich über Hinweise. Was ich getan habe, scheint sehr verworren zu sein.
quelle
Wise fwom youw gwave ...
Ich wusste, dass ich versuchen würde, dies in Befunge-98 mit TURT zu implementieren, aber ich konnte nicht herausfinden, wie ich das machen sollte, und saß mehrere Monate darauf. Jetzt, erst kürzlich, habe ich einen Weg gefunden, dies ohne Selbstmodifikation zu tun! Und so...
Befunge-98 mit dem TURT-Fingerabdruck, 103
Lassen Sie uns zunächst einige Implementierungsdetails aus dem Weg räumen:
I
das Bild in eine SVG-Datei "gedruckt" wird. Wenn Sie dies in CCBI ohne das Befehlsargument--turt-line=PATH
ausführen, wird es standardmäßig als Datei mit dem Namen CCBI_TURT.svg ausgegeben. Dies ist der nächste Punkt, den ich erreichen könnte, um "eine grafische Darstellung der Schneeflocke auf dem Bildschirm zu drucken". mit verfügbaren Funge-Dolmetschern, die ich finden konnte. Vielleicht gibt es eines Tages einen besseren Dolmetscher, der eine grafische Darstellung für die Schildkröte bietet, aber fürs Erste ...Grundsätzlich funktioniert dies, indem der Stack als eine Art provisorisches L-System verwendet und im laufenden Betrieb erweitert wird. Bei jedem Durchgang lautet die oberste Zahl auf dem Stapel:
f
in der letzten Zeile ändern );n-1, -1, n-1, 0, n-1, -1, n-1
.Denn
n = 10
dieser Vorgang dauert sehr lange (ein paar Minuten auf meinem System), und die resultierende SVG ist ~ 10 MB groß und unsichtbar , wenn im Browser angezeigt , weil Sie nicht die Größe der Pinsel TURT anpassen können. IrfanView scheint anständig zu funktionieren, wenn Sie die richtigen Plugins haben. Ich bin mit SVG nicht besonders vertraut, daher weiß ich nicht, wie diese Dateien angezeigt werden sollen (besonders wenn sie wirklich groß sind).Hey, zumindest funktioniert es - was, wenn man bedenkt, dass es Befunge ist, etwas ist, wofür man allein dankbar ist.
quelle
Python 2, 127 Bytes
quelle