Ihre Aufgabe: Eine Kochschneeflocke bis in die n-te Tiefe erzeugen. Sie müssen keine vollständige Kochschneeflocke herstellen, nur eine Seite des Startdreiecks. Wikipedia zu Koch Flakes: https://en.wikipedia.org/wiki/Koch_snowflake .
Regeln:
- Das Programm muss eine Seite der Kochschneeflocke bis zur n-ten Tiefe erzeugen.
- Die Ausgabe muss ASCII sein.
- Sie können die ganze Schneeflocke erzeugen; Dies ist nicht erforderlich.
- Es gelten die Standardregeln für Input / Output und Lücken.
- Leerzeichen spielen keine Rolle, solange sich alle Zeichen an der richtigen Stelle relativ zueinander befinden.
- Kürzester Code gewinnt!
Testfälle:
n = 0:
__
n = 1:
__/\__
n = 2:
__/\__
\ /
__/\__/ \__/\__
n = 3:
__/\__
\ /
__/\__/ \__/\__
\ /
/_ _\
\ /
__/\__ __/ \__ __/\__
\ / \ / \ /
__/\__/ \__/\__/ \__/\__/ \__/\__
Ich hoffe das macht Sinn. Beachten Sie, dass das Fraktal in jedem Testfall in drei Teile gleicher Länge unterteilt werden kann. Beachten Sie auch, dass die Breite jeder Schneeflocke das Dreifache der Breite der vorherigen Schneeflockengeneration beträgt.
__/\__
mit zwei Unterstreichungen verwendet, wodurch jede Iteration konsistent dreimal so groß war wie die vorherige. Die Verwendung von nur einer Unterstreichung scheint zu Widersprüchen zu führen, die in n = 3 sehr unangenehm werden. ZB haben die Außenteile die Breite 12, während das Mittelteil nur die Breite 10 hat, als Folge der/_
und_\
die zu eng sind. Und schon vorher haben Sie die_
doppelte Breite von/
und\
./_
und_\
sind der einzige wirklich fatale Teil - die Unterstriche müssen weg, weil sie in der gleichen Position wie das/
und sein müssen\
. Sobald dies erledigt ist, können sich die Dinge von n = 1 an um das Dreifache erweitern (aber n = 0 passt nicht.)Antworten:
Haskell ,
308300299 BytesBearbeitungen:
zipWith(+)
zuzipWith(-)
und Einstellen Kodierungen und Offsets jeder Negation Zeichen losgeworden.#
gelöscht werden, indemr=reverse
anstelle des direkten Mustervergleichs der Wert verwendet wurde.zipWith(-)
.o=[0,0]
das Kürzen von Listenkonstanten.?
.Probieren Sie es online! (Leider wird alles, was größer als n = 3 ist, fürchterlich verpackt und unlesbar, aber Sie können es in ein anderes Programm kopieren, um es zu sehen.)
Variationen
[6]
in[6,4,4]
, erhalten Sie eine ganze Schneeflocke. Probieren Sie es online!,3..gcd 3x
, erhalten Sie eine Kurve im Stil, mit dem diese Frage ursprünglich gestellt wurde. Probieren Sie es online!Wie es funktioniert
k
ist die Hauptfunktion, es dauert einInt
n
und gibt ein zurückString
.iterate(>>=(:[1,4,1]))[6]
generiert eine unendliche Liste, die für jedes n die Umdrehungen zwischen aufeinanderfolgenden Linien in dieser Kurveniteration (Turtle-Grafikstil) als nominelle Zahlen zwischen0
und enthält5
. Jede Iteration ist nur die vorherige mit den überlappenden1,4,1
Runden. Der einzige Grund , warum die Unterlisten beginnen mit ,6
anstatt0
ist das zu machengcd
Trick inf
Arbeit zu vermeidenf 0
.scanl1(+)
konvertiert die Windungen in "absolute" Richtungen, bis zu Modulo 6. A0
bedeutet nach rechts, dann ist jede höhere Zahl 60 Grad gegen den Uhrzeigersinn von der vorherigen. (Nun, es wären 60 Grad, wenn dies eine richtige Zeichnung wäre und nicht ASCII.)f
konvertiert eine absolute Richtung in eine Liste von (Zeichen-, Offset-Codierungs-) Paaren, die codiert, welche Zeichen zur Kurve hinzugefügt werden sollen (für horizontale Richtungen werden zwei Paare generiert, andernfalls eines) und wie sich die relative Position ändert.#
Operator durchläuft die vorherige Liste von (Zeichen-, Offset-Codierungs-) Paaren und generiert tatsächliche (Koordinaten-, Zeichen-) Paare._/\
nominal repräsentiert eine Linie, die von einer Startecke durch eine rechteckige Zelle zu einer anderen Endecke gezogen wird.[y,x]
oben nach unten und von links nach rechts, sodass sie in der Reihenfolge sortiert werden, in der sie gedruckt werden sollen. Spalten sind 1-basiert. Listen werden anstelle von Tupeln für kürzere Vektorarithmetik mit verwendet(&)=zipWith(-)
.[y,x]
wie die Zelle oben links angegeben. Dies stellt sicher, dass alle Offsets von einer Ecke zu den benachbarten Zellen nicht negativ sind, wodurch negative Konstanten vermieden werden.[y1,x1,x2,y2]
wo[y1,x1]
die von der Start Ecke zur Zeichenzelle Offset - Koordinate und[y2,x2]
wird die von der Endecke an die Zeichenzelle versetzt. Das heisst:3
..5
sind nur die Umkehrung der Listen für0
..2
, mit denen sie generiert werden können[id,r]<*>
.(&)=zipWith(-)
entweder mit einer Codierungsliste oder umgekehrt durchgeführt werden.?
, wodurch das FinaleString
aus ihnen generiert wird .x?l@(([_,w],c):r)
x
ist die x-Koordinate des vorherigen Zeichens, das in dieser Zeile oder0
am Anfang einer Zeile angezeigt wird.l
ist die gesamte aktuelle Liste,w
ist die x-Koordinate des nächsten hinzuzufügendenc
Zeichens, ist das Zeichen undr
ist die verbleibende Liste.\
und/
, daher wird er zuletzt sortiert, wenn er sich mit einem anderen Zeichen an derselben Position überschneidet. Somit wird ein redundanter Unterstrich erkannt, indem überprüft wird, ob eine x-Koordinate wiederholt wurde.quelle