Eine Flow Snake, auch Gosper-Kurve genannt , ist eine fraktale Kurve, deren Größe mit jeder Ordnung / Iteration eines einfachen Prozesses exponentiell zunimmt. Nachfolgend finden Sie Details zum Aufbau und einige Beispiele für verschiedene Bestellungen:
Bestellung 1 Flow Snake :
____
\__ \
__/
Bestellung 2 Flow Snake :
____
____ \__ \
\__ \__/ / __
__/ ____ \ \ \
/ __ \__ \ \/
\ \ \__/ / __
\/ ____ \/ /
\__ \__/
__/
Bestellung 3 Flow Snake :
____
____ \__ \
\__ \__/ / __
__/ ____ \ \ \ ____
/ __ \__ \ \/ / __ \__ \
____ \ \ \__/ / __ \/ / __/ / __
____ \__ \ \/ ____ \/ / __/ / __ \ \ \
\__ \__/ / __ \__ \__/ / __ \ \ \ \/
__/ ____ \ \ \__/ ____ \ \ \ \/ / __
/ __ \__ \ \/ ____ \__ \ \/ / __ \/ /
\ \ \__/ / __ \__ \__/ / __ \ \ \__/
\/ ____ \/ / __/ ____ \ \ \ \/ ____
\__ \__/ / __ \__ \ \/ / __ \__ \
__/ ____ \ \ \__/ / __ \/ / __/ / __
/ __ \__ \ \/ ____ \/ / __/ / __ \/ /
\/ / __/ / __ \__ \__/ / __ \/ / __/
__/ / __ \ \ \__/ ____ \ \ \__/ / __
/ __ \ \ \ \/ ____ \__ \ \/ ____ \/ /
\ \ \ \/ / __ \__ \__/ / __ \__ \__/
\/ / __ \/ / __/ ____ \ \ \__/
\ \ \__/ / __ \__ \ \/
\/ \ \ \__/ / __
\/ ____ \/ /
\__ \__/
__/
Konstruktion
Betrachten Sie die Reihenfolge, in der 1 Flow Snake aus einem Pfad mit 7 Kanten und 8 Scheitelpunkten aufgebaut wird (unten beschriftet. Aus Gründen der Durchführbarkeit vergrößert):
4____5____6
\ \
3\____2 7\
/
0____1/
Jetzt ersetzen Sie bei jeder nächsten Bestellung einfach die Kanten durch eine gedrehte Version dieses Musters der ursprünglichen Bestellung 1. Verwenden Sie die folgenden 3 Regeln, um die Kanten zu ersetzen:
1 Ersetzen Sie eine horizontale Kante durch die ursprüngliche Form wie folgt:
________
\ \
\____ \
/
____/
2 Ersetzen Sie eine /
Kante ( 12
in der obigen Konstruktion) durch die folgende gedrehte Version:
/
/ ____
\ / /
\/ /
/
____/
3 Ersetzen Sie eine \
Kante ( 34
und 67
höher) durch die folgende gedrehte Version:
/
/ ____
\ \ \
\ \ \
\ /
\/
So sieht beispielsweise die Reihenfolge 2 mit den Eckpunkten aus der Reihenfolge 1 wie folgt aus
________
\ \
________ \____ \6
\ \ / /
\____ \5___/ / ____
/ \ \ \
4___/ ________ \ \ \7
/ \ \ \ /
/ ____ \____ \2 \/
\ \ \ / /
\ \ \3___/ / ____
\ / \ / /
\/ ________ \/ /
\ \ /
\____ \1___/
/
0___/
Für eine höhere Ordnung zerlegen Sie jetzt einfach den aktuellen Pegel in Kanten der Längen 1 /
, 1 \
oder 2 _
und wiederholen den Vorgang. Beachten Sie, dass auch nach dem Ersetzen die gemeinsamen Eckpunkte zwischen zwei aufeinanderfolgenden Kanten immer noch übereinstimmen.
Herausforderung
- Sie müssen eine Funktion eines vollständigen Programms schreiben, das eine einzelne Ganzzahl
N
über das Argument STDIN / ARGV / function oder das nächste Äquivalent empfängt und die ReihenfolgeN
Flow Snake auf STDOUT ausgibt. - Die eingegebene Ganzzahl ist immer größer als
0
. - Es sollten keine führenden Leerzeichen vorhanden sein, die nicht Teil des Musters sind.
- Es sollten entweder keine nachgestellten Leerzeichen oder genügend nachgestellte Leerzeichen vorhanden sein, um das Muster aufzufüllen und das minimale Begrenzungsrechteck vollständig auszufüllen.
- Der Zeilenumbruch ist optional.
Wissenswertes
- Flow Snakes ist ein Wortspiel von Schneeflocken, das in diesem Muster der Ordnung 2 und höher ähnelt
- Der Fluss und die Schlangen spielen tatsächlich eine Rolle im Muster, da das Muster aus einem einzelnen Pfad besteht, der durch das Muster fließt.
- Wenn Sie genau hinschauen, besteht das Muster der Ordnung 2 (und höher) aus Rotationen des Musters der Ordnung 1, die auf dem gemeinsamen Scheitelpunkt der aktuellen und der vorherigen Kante gedreht sind.
- Es gibt eine Nicht-ASCII-Variante von Flow Snakes, die hier und an mehreren anderen Stellen zu finden ist.
Dies ist Code-Golf, also gewinnen Sie den kürzesten Code in Bytes!
Bestenliste
Der erste Beitrag der Serie generiert eine Rangliste.
Um sicherzustellen, dass Ihre Antworten angezeigt werden, beginnen Sie jede Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Antworten:
CJam, 144 Bytes
Neue Zeile hinzugefügt, um das Scrollen zu vermeiden. Probieren Sie es online aus
Das Programm arbeitet in mehreren Schritten:
quelle
Python 2,
428411388 BytesDieser war ziemlich knifflig. Die Muster behalten ihre Verhältnisse nach jedem Schritt nicht bei, was bedeutet, dass es sehr schwierig ist, ein Bild von ihrem Vorgänger prozedural zu erzeugen. Was dieser Code macht, obwohl er nach einigem intensiven Mathe-Golfen ziemlich unlesbar ist, ist die rekursiv definierte
D
Funktion , um die Grenze von Anfang bis Ende zu ziehen .Die Größe war auch ein Problem, und ich habe gerade erst in der Mitte eines
5*3**n
seitlichen Quadrats angefangen und die Dinge danach beschnitten. Wenn ich mir jedoch eine bessere Möglichkeit überlege, die Größe zu berechnen, kann ich sie möglicherweise ändern.quelle
r=[s*[" "]for i in range(s)]
->r=[[" "]*s]*s]
wird ein paar Bytes rasieren*
wiederholt veränderbare Objekte .l
,print'\n'.join()
zum Drucken in einer for-Schleife wechseln ,return[...][t]+x,
Klammern verwenden und entfernen(t%2)
. Sie können auch verwenden,min(c.find('\\')%s for c in S)
wenn Sie den Namen der Liste ändern,S
damit der ursprüngliche Wert von nicht überschrieben wirds
.JavaScript ( ES6 ), 356
362 370Das ist eine schwierige Frage ...
Jede Form wird als Pfad gespeichert. Es gibt 6 Grundbausteine (3 + 3 rückwärts)
0
diagonal von links oben nach rechts unten (4
rückwärts)1
diagonal von links unten nach rechts oben (5
rückwärts)2
horizontal von links nach rechts (6
rückwärts)Für jedes gibt es einen Ersetzungsschritt, der angewendet werden muss, wenn die Reihenfolge erhöht wird:
0
->0645001
(rückwärts4
->5441024
)1
->2116501
(rückwärts5
->5412556
)2
->2160224
(rückwärts6
->0664256
)Werte im
h
Array vorbelegt , auch wenn die Elemente 4..6 mit 0..2 erhalten werden könnenUm die Form für die angegebene Reihenfolge zu erhalten, wird der Pfad in der Variablen p erstellt, wobei die Ersetzungen wiederholt angewendet werden. Dann durchläuft die Hauptschleife die Variable p und zeichnet die Form innerhalb des Arrays g [], wobei jedes Element eine Zeile ist.
Ab Position (0,0) kann jeder Index negativ werden (y-Index bei hohen Ordnungen). Ich vermeide negative y-Indizes, die das gesamte g-Array verschieben, wenn ich einen negativen y-Wert finde. Es ist mir egal, ob der x-Index negativ wird, da in JS negative Indizes zulässig sind, die nur etwas schwieriger zu verwalten sind.
Im letzten Schritt scanne ich das Hauptarray mit .map, aber für jede Zeile muss ich eine explizite for (;;) -Schleife mit der
b
Variablen verwenden, die den am wenigsten erreichten x-Index enthält (der <0 sein wird).In dem
console.log
Version gibt es eine handliche führende Newline, die leicht zu einer abschließenden Newline gemacht werden kann, die 2 Zeilen vertauscht, wie in der Snippet-Version.Handliches Snippet zum Testen (in Firefox):
quelle
Haskell, 265 Bytes
(Anmerkung: auf GHC vor 7.10, müssen Sie hinzufügen
import Control.Applicative
oder ersetzenabs<$>
mitmap abs$
.)Laufen Sie online auf Ideone.com
f n :: Int -> IO ()
n
Zeichnet den Level- Flowsnake. Die Zeichnung wird nicht entlang der Kurve, sondern in Bitmap-Reihenfolge berechnet, sodass der Algorithmus im O (n) -Raum ausgeführt werden kann (dh logarithmisch in der Zeichnungsgröße). Fast die Hälfte meiner Bytes wird für die Berechnung des zu zeichnenden Rechtecks aufgewendet!quelle
Perl,
334 316309Parameter der Standardeingabe. Teste mich .
quelle
Haskell,
469419390385365 BytesDie Funktion f :: Int-> IO () nimmt eine ganze Zahl als Eingabe und gibt die Flussschlange aus
quelle
$
bei der Definition vonk
und zu ersetzen(!!)a
mit(a!!)
der von einigen Klammern loswerden. Davon abgesehen scheinen Sie viele Tricks selbst zu kennen. NizzaC,
479474468427 BytesIch schätze, es gibt keinen Sieg gegen die Perl- und Haskell-Typen, aber da hier noch kein C-Ergebnis vorliegt:
Um bei einem atoi () -Aufruf Platz zu sparen, wird die Anzahl der an das Programm übergebenen Argumente für die Ebene verwendet.
Das Programm läuft in O (n ^ 3) oder schlechter; Zuerst wird der Pfad einmal berechnet, um die Min / Max-Koordinaten zu finden, dann wird für jedes (x, y) Paar einmal berechnet, um das Zeichen an diesem bestimmten Ort zu finden. Schrecklich langsam, spart aber Speicherplatz.
Beispiel unter http://codepad.org/ZGc648Xi
quelle
X,Y,K,L,M,N,i,j,c;
anstelle vonint X,Y,K,L,M,N,i,j,c;
undmain(l)
anstelle vonvoid main(int l)
Python 2,
523502475473467450437 BytesPffft hat mich ungefähr 3 Stunden gekostet, aber es hat Spaß gemacht!
Die Idee ist, die Aufgabe in mehrere Schritte aufzuteilen:
Hier ist der Code in ungolfed Form:
Bearbeiten: Ich habe die Sprache in Python 2 geändert, um mit meiner Antwort für # 3 kompatibel zu sein (und es werden auch 6 weitere Bytes gespart).
quelle
l.extend(x)
zul+=x
. Sie können wahrscheinlich auch codegolf.stackexchange.com/questions/54/… anstelle der von.split()
Ihnen verwendeten verwenden (ich habe in meiner Antwort etwas Ähnliches getan)extend
Pari / GP, 395
Durchlaufen von x, y Zeichenpositionen und Berechnen des zu druckenden Zeichens. Mäßige Minimierungsversuche, Punkte mit Leerzeichen und Kommentare entfernt.
Jedes Zeichen ist das erste oder zweite einer Sechseckzelle. Ein Zellenort ist eine komplexe Zahl z, die in die Basis b = 2 + w mit den Ziffern 0, 1, w ^ 2, ..., w ^ 5 aufgeteilt ist, wobei w = e ^ (2pi / 6) die sechste Wurzel der Einheit ist. Diese Ziffern werden nur als Unterscheidungsmerkmal 1 bis 7 gespeichert und dann durch eine Zustandstabelle für die Nettorotation von hoch nach niedrig geführt. Dies ist im Stil von Flowsnake-Code von Ed Shouten (
xytoi
), aber nur für die Nettorotation, keine Ziffern in einen "N" -Index entlang des Pfades setzen. Die Ausdehnungen beziehen sich auf einen Ursprung 0 in der Mitte der Form. Solange das Limit kein Endpunkt ist, handelt es sich um die Mitte eines 2-stelligen Sechsecks und es wird nur 1 dieser Zeichen benötigt. Wenn der Schlangenstart und / oder das Schlangenende die X-Grenze sind, werden 2 Zeichen benötigt, was k = 0 Start und k <3 Ende ist. Pari hat "Quads" wie sqrt (-3) eingebaut, aber das gleiche kann mit Real- und Imaginärteilen getrennt gemacht werden.quelle