Zeichnen Sie die Sierpinski-Pfeilspitzenkurve

14

Einführung

Die Sierpinski-Pfeilspitzenkurve ist eine Kurve, deren Grenze das Sierpinski-Dreieck ist.

Es beginnt zunächst so:

 _
/ \

Dann wird jede Zeile durch eine gedrehte Version der ersten ersetzt:

  _
 / \
 \ /
_/ \_

Nächster:

     _
    / \
    \ /
   _/ \_
  /     \
  \_   _/
 _  \ /  _
/ \_/ \_/ \

Sierpinski Arrowhead Curve Evolution

Deine Aufgabe

Bei einer gegebenen Zahl n wird die n- te Iteration der Sierpinski-Pfeilspitzenkurve ausgegeben .

Sie können zwischen 0- und 1-Index wählen. Bitte geben Sie dies in Ihrer Antwort an.

Sie können ein Bild erstellen oder Ascii Art in dem oben angegebenen Format verwenden.

Sie können diese Kurve möglicherweise nicht mit integrierten Funktionen erstellen.

Denken Sie daran, das ist , also gewinnt der Code mit den wenigsten Bytes.

Oliver Ni
quelle

Antworten:

14

Oktave, 240 236 221 Bytes

Dies wurde mit der gleichen Idee gemacht, die hier verwendet wurde, aber ich musste sie ändern, um sie an die Sierpinsky-Pfeilspitzenkurve anzupassen.

m=input(0);g=2*pi/6;u=cos(g);v=sin(g);A=[1,0];B=[u,v];C=[-u,v];D=-A;E=-B;F=-C;for k=1:m;f=[E;F;A];b=[A;B;C];A=[B;A;F];d=[C;D;E];C=[D;C;B];E=[F;E;D];B=b;D=d;F=f;end;A=[0,0;cumsum(A)];plot(A(:,1),A(:,2));axis off;axis equal

Bildbeschreibung hier eingeben

fehlerhaft
quelle
u=.5;v=3^u/2;B=[u,v];C=[-u,v];A=C<0;ist 16 Bytes kürzer :) Sie können auch axis off equalweitere 5 Bytes speichern.
Stewie Griffin
3

Haskell + Diagramme, 176 Bytes

import Diagrams.Prelude
import Diagrams.Backend.SVG
g n=renderSVG"a"(mkWidth 99).strokeT.a n
a 0=hrule 1
a n|b<-a(n-1)=b%6<>b<>b%(-6);a%n=rotateBy(1/n).reflectY$a::Trail V2 Double

Erstellt eine SVG-Datei mit transparentem Hintergrund mit dem Namen "a".

g 0gibt eine horizontale Linie aus, g 1ist /¯\.

Bildbeschreibung hier eingeben

Angs
quelle
Großartig, ich wusste es nicht Diagrams!
Fehler
@flawr, es ist großartig, aber es gelten die üblichen Einschränkungen des grafischen Programms von Haskell. Es wäre großartig, einfach das Äquivalent von anzurufen plot() , um ein Fenster zu öffnen.
Angs
2

MSWLogo (Version 6.5b), 102 Byte

Nimmt die beiden Funktionen shapeL, shapeRgegeben hier und verschmilzt sie durch Hinzufügen eines zusätzlichen Argument:a , die die entgegengesetzte Funktion aufruft , wenn negiert.

to s :n :a :l
if :n=0[fd :l stop]
rt :a
s :n-1(-:a):l
lt :a
s :n-1 :a :l
lt :a
s :n-1(-:a):l
rt :a
end

Es swird eine Funktion definiert, die die Anzahl der Iterationen :n(1-basiert), den Winkel :aund die Länge verwendet :l. Es ist rekursiv und nennt eine niedrigere Iteration von sich selbst mit dem Winkel:a in zwei Fällen negiert wird, um die richtige Ausrichtung zu erzielen.

  • rt :a, lt :a Dreht , um die Schildkröte (aufgezeichnetes Dreieck thingy dessen Pfad) rechts, links von :aGrad.
  • fd :l bewegt die Schildkröte vorwärts :l .

Die Funktion ist mit :agleich 60 aufzurufen.

Pfeilspitzen

Hierbei repeathandelt es sich im Wesentlichen um eine FOR-Schleife mit integriertem Zähler repcount.puund pdbedeutet "Stift nach oben" und "Stift nach unten", wodurch die Schildkröte am Zeichnen gehindert wird, während ihre Position mit festgelegt wird setxy.

Die Zeichnungen jeder Iteration wurden mit der :lgleichen Länge aufgerufen power 2 (7-repcount), die exponentiell abnimmt; Dies ist darauf zurückzuführen, dass die Definition :lim rekursiven Schritt dasselbe verwendet , sodass :ldie Gesamtgröße der Ausgabe bei Festeinstellung exponentiell mit zunimmt :n.

u54112
quelle
Dies ist die richtige Sprache für den Job, aber technisch gesehen sind für Antworten keine zusätzlichen Daten zulässig. Idealerweise würden Sie die 60 in Ihrer Antwort verschlüsseln.
Neil
@Neil Also zähle ich nur 60die Bytes mit?
u54112
Ich bin mir nicht sicher, ob es so einfach ist, aber ich kenne die Sprache selbst nicht.
Neil
1

Python 2, 124 Bytes

Basierend auf dem Code im Wikipedia-Artikel.

from turtle import*
def c(o,a):
 if o:o-=1;c(o,-a);lt(a);c(o,a);lt(a);c(o,-a)
 else:fd(9)
n=input()
if n%2==0:lt(60)
c(n,60)

Ordnung 0 ist eine gerade Linie.

BookOwl
quelle
Sie müssen Ihren Code ändern, um einen Winkel von 60 Grad zu verwenden, da er sich sonst dem Sierpinsky-Dreieck nicht annähert. Auch die Ausrichtung ändert sich je nach Reihenfolge, was ich nicht für richtig halte. trinket.io/python/a803546939
mbomb007
Die Logo-Antwort gibt auch eine Funktion an, die den Winkel als Parameter verwendet. Ich denke also, dass dies in Ordnung ist. In Bezug auf die Ausrichtung ist es immer noch dieselbe Kurve, nur gedreht.
BookOwl
Die Antwort auf das Logo ist jedoch immer dieselbe Drehung. Mit freundlichen Grüßen ist eine andere Rotation für jede Bestellung, und sie sind nicht alle gleich. Das ist nicht in Ordnung. Schauen Sie sich die Bilder an, die die Frage enthält.
mbomb007
Wo sagt die Herausforderung, dass die Rotationen gleich sein müssen?
BookOwl
1
Jeder Mathematik-Major kann Ihnen sagen, dass ein Limit konvergieren muss. Deiner nicht.
mbomb007
0

Mathematica, 62 Bytes

Graphics@Line@AnglePath[Pi/3Nest[Flatten@{-#,1,#,1,-#}&,0,#]]&
Alephalpha
quelle
Wie funktioniert das?
BookOwl
0

JavaScript (ES6), 180 Byte

f=(n,d=0,r=n=>` `.repeat(n))=>n?f(--n,d=3-d%3).map(s=>r([l=s.length/2,0,1,~n&1][d]+l)+s+r([,1,0,~n&1][d]+l)).concat(f(n,d+1).map(s=>s+r(!(d%3))+a.shift(),a=f(n,d+2))):[`_/\\`[d%3]]
<input type=number min=1 oninput=o.textContent=f(this.value).join`\n`><pre id=o>

Gibt ein Array von Zeichenfolgen zurück. Den richtigen Abstand zu finden, war der schwierigste Teil! Reine Stringversion für 205 Bytes:

f=(n,d=0,r=n=>` `.repeat(n))=>n?f(--n,d=3-d%3).replace(/.+/g,s=>r([l=s.length/2,0,1,~n&1][d]+l)+s+r([,1,0,~n&1][d]+l))+`\n`+f(n,d+1).replace(/.+/g,s=>s+r(!(d%3))+a.shift(),a=f(n,d+2).split`\n`):`_/\\`[d%3]
Neil
quelle