Narysuj krzywą Sierpińskiego

14

Wprowadzenie

Sierpiński Arrowhead krzywa jest krzywą, że to ograniczenie jest trójkąt Sierpińskiego.

Najpierw zaczyna się tak:

 _
/ \

Następnie każda linia jest zastępowana obróconą wersją pierwszej:

  _
 / \
 \ /
_/ \_

Kolejny:

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

Ewolucja Sierpińskiego

Twoje zadanie

Biorąc pod uwagę liczbę n , wypisz n-tą iterację krzywej Sierpińskiego.

Możesz wybrać indeks 0 lub 1, ale proszę podać w swojej odpowiedzi.

Możesz wygenerować obraz lub użyć Ascii Art w formacie, który mam powyżej.

Nie możesz używać wbudowanych do generowania tej krzywej.

Pamiętaj, to jest , więc wygrywa kod z najmniejszą liczbą bajtów.

Oliver Ni
źródło

Odpowiedzi:

14

Oktawa, 240 236 221 bajtów

Jest to zrobione przy użyciu tego samego pomysłu, który tutaj wykorzystano, ale musiałem go zmienić, aby pasował do krzywej sierpinsky'ego.

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

wprowadź opis zdjęcia tutaj

wada
źródło
u=.5;v=3^u/2;B=[u,v];C=[-u,v];A=C<0;jest o 16 bajtów krótszy :) Możesz także axis off equalzapisać kolejne 5 bajtów.
Stewie Griffin
3

Haskell + diagramy, 176 bajtów

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

Tworzy plik svg z przezroczystym tłem o nazwie „a”.

g 0wyświetla linię poziomą, g 1jest /¯\.

wprowadź opis zdjęcia tutaj

Angs
źródło
Świetnie, nie wiedziałem o Diagrams!
flawr
@ flawr, to świetnie, ale obowiązują zwykłe zastrzeżenia programu graficznego Haskell. Byłoby wspaniale po prostu wywołać ekwiwalent lub plot() otworzyć okno.
Angs,
2

MSWLogo (wersja 6.5b), 102 bajty

Zajmuje dwie funkcje shapeL, shapeRpodane tutaj i łączy je dodając dodatkowy argument :a, który wywołuje funkcję przeciwną gdy zanegowany.

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

sZdefiniowana jest funkcja , która przyjmuje liczbę iteracji :n(na podstawie 1), kąt :a, długość :l. Jest rekurencyjny, nazywając siebie niższą iteracją z :azanegowanym kątem w dwóch przypadkach, aby uzyskać prawidłową orientację.

  • rt :a, lt :aobróć żółwia (trójkąt, którego ścieżka jest wytyczona) w prawo, w lewo o :astopnie.
  • fd :lprzesuwa żółwia krok po :lkroku.

Funkcja ma być wywołana z wartością :arówną 60.

Groty strzał

Tutaj repeatjest zasadniczo pętli FOR, z wbudowanym licznikiem repcount. pui pdoznaczają „pióro w górę” i „pióro w dół”, które powstrzymują żółwia przed rysowaniem podczas ustawiania jego położenia setxy.

Rysunki każdej iteracji zostały nazwane długością :l równą power 2 (7-repcount), która maleje wykładniczo; dzieje się tak, ponieważ definicja używa tego samego :lw kroku rekurencyjnym, więc przy ustalonym :lcałkowitym rozmiarze wyjściowym wzrośnie wykładniczo o :n.

dla Moniki
źródło
To jest odpowiedni język dla zadania, ale technicznie odpowiedzi nie są dozwolone dla dodatkowych danych, więc najlepiej byłoby zakodować 60 w swojej odpowiedzi.
Neil,
@Neil Więc po prostu podaję 60liczbę bajtów?
dla Moniki
Nie jestem pewien, czy to takie proste, ale sam nie znam tego języka.
Neil,
1

Python 2, 124 bajty

Na podstawie kodu z artykułu z Wikipedii.

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)

Zamówienie 0 jest linią prostą.

BookOwl
źródło
Musisz zmienić kod, aby użyć kąta 60 stopni, w przeciwnym razie nie będzie on zbliżony do trójkąta Sierpińskiego. Ponadto orientacja zmienia się w zależności od kolejności, co nie wydaje mi się prawidłowe. trinket.io/python/a803546939
mbomb007
Odpowiedź logo daje również funkcję, która przyjmuje kąt jako parametr, więc myślę, że jest OK. Jeśli chodzi o orientację, jest to wciąż ta sama krzywa, tylko obrócona.
BookOwl
Jednak logo zawsze ma ten sam obrót. Twoja jest inna rotacja dla każdego zamówienia i nie wszystkie są takie same. To nie jest w porządku. Spójrz na zdjęcia, które zawiera pytanie.
mbomb007,
Gdzie wyzwanie mówi, że obroty muszą być takie same?
BookOwl
1
Każda specjalizacja matematyczna może powiedzieć, że limit musi być zbieżny. Twoja nie.
mbomb007
1

Język Mathematica / Wolfram 73 bajty

s=1;Region@Line@AnglePath[Nest[Join@@({#,s=-s,s}&/@#)&,{#~Mod~2},#]Pi/3]&

Proste wyjaśnienie :
AnglePath [{θ1, θ2, θ3,…}] podaje listę współrzędnych 2D odpowiadających ścieżce rozpoczynającej się od {0,0}, a następnie wykonuje serię kroków długości jednostki przy kolejnych kątach względnych θi.

n = 1

Graphics@Line@AnglePath[60°{1,-1,-1}]

n = 2

Graphics@Line@AnglePath[60°{0,1,1, -1,-1,-1, -1,1,1}]

n = 3

Graphics@Line@AnglePath[60°{1,-1,-1, 1,1,1, 1,-1,-1, -1,1,1, -1,-1,-1, -1,1,1, -1,-1,-1, 1,1,1, 1,-1,-1}]

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

chyanog
źródło
0

Mathematica, 62 bajty

Graphics@Line@AnglePath[Pi/3Nest[Flatten@{-#,1,#,1,-#}&,0,#]]&
alephalpha
źródło
Jak to działa?
BookOwl
0

JavaScript (ES6), 180 bajtów

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>

Zwraca tablicę ciągów. Wyrównanie odległości było najtrudniejsze! Wersja czystego ciągu dla 205 bajtów:

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
źródło