Sierpinski Ok Ucu Eğrisini Çiz


14

Giriş

Sierpinski Arrowhead Eğri sınırı Sierpinski en üçgen olan bir eğridir.

İlk önce şöyle başlar:

 _
/ \

Ardından, her satır ilk satırın döndürülmüş bir sürümüyle değiştirilir:

  _
 / \
 \ /
_/ \_

Sonraki:

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

Sierpinski Ok Ucu Eğrisi Evrimi

Senin görevin

Bir numara Verilen n , çıkış n Sierpinski Arrowhead Curve -th yineleme.

0- veya 1-endeksini seçebilirsiniz, ancak lütfen cevabınızı belirtiniz.

Bir görüntü oluşturabilir veya Ascii Art'ı yukarıda gördüğüm formatta kullanabilirsiniz.

Bu eğriyi oluşturmak için yerleşik bileşenleri kullanamazsınız.

Unutmayın, bu , bu yüzden en az baytlık kod kazanır.

Yanıtlar:


14

Octave, 240 236 221 bayt

Bu, burada kullanılan aynı fikirle yapılır, ancak bunu sierpinsky ok ucu eğrisine uyacak şekilde değiştirmek zorunda kaldım.

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

resim açıklamasını buraya girin


u=.5;v=3^u/2;B=[u,v];C=[-u,v];A=C<0;16 bayt daha kısadır :) axis off equalBaşka bir 5 bayt kaydetmek için de yapabilirsiniz .
Stewie Griffin

3

Haskell + diyagramları, 176 bayt

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

Saydam arka planı "a" olarak adlandırılan bir svg dosyası oluşturur.

g 0çıktılar yatay bir çizgi, g 1olur /¯\.

resim açıklamasını buraya girin


Harika, bilmiyordum Diagrams!
Kusur

@flawr, bu harika ama her zamanki Haskell grafik program uyarıları geçerli. Sadece plot() bir pencere açmak için ' nin eşdeğerini aramak harika olurdu .
Angs

2

MSWLogo (Sürüm 6.5b), 102 bayt

İki işlevi Alır shapeL, shapeRverilen burada ve ekstra argüman ekleyerek bunları birleştirir :aetkisiz zaman ters işlevini çağırır.

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

sYineleme sayısı :n(1 tabanlı), açı :a, uzunluk alan bir işlev tanımlanır :l. Özyinelemeyi :asağlamak için iki durumda negatif açı ile daha düşük bir yinelemeyi çağırmak özyinelemelidir .

  • rt :a, lt :akaplumbağayı (yolu izlenen üçgen şey) sağa, sola doğru :adöndürün.
  • fd :lkaplumbağayı :ladım adım ileri taşır .

Fonksiyon :a60'a eşit olarak çağrılmalıdır .

Ok uçları

Burada, repeattemelde yerleşik sayacı olan bir FOR döngüsü vardır repcount. puve pdkonumu kullanılarak ayarlanırken kaplumbağanın çizimini durduran "kalem yukarı" ve "kalem aşağı" anlamına gelir setxy.

Her bir yinelemenin çizimleri, katlanarak azalan :leşit uzunlukta çağrıldı power 2 (7-repcount); bunun nedeni, tanımın :lözyinelemeli adımda aynı şeyi kullanmasıdır , bu nedenle sabitlendiğinde :lçıktının genel boyutu katlanarak artar :n.


Bu iş için doğru dildir, ancak teknik olarak cevapların fazladan veriye izin verilmez, bu nedenle ideal olarak 60'ı yanıtınızda kodlarsınız.
Neil

@Neil Öyleyse sadece 60bayt sayısına dahil mi?
Monica

Bunun o kadar basit olduğundan emin değilim, ama dili kendim bilmiyorum.
Neil

1

Python 2, 124 bayt

Wikipedia makalesindeki kod temel alınmıştır.

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)

Sipariş 0 düz bir çizgidir.


Kodunuzu 60 derecelik bir açı kullanmak için değiştirmeniz gerekir, aksi takdirde Sierpinsky üçgenine yaklaşmaz. Ayrıca, yön doğru olduğunu düşünmediğim sıraya göre değişir. trinket.io/python/a803546939
mbomb007

Logo yanıtı da bir parametre olarak açıyı alan bir işlev verir, bu yüzden iyi olduğunu düşünüyorum. Oryantasyon ilerledikçe, hala aynı eğri, sadece döndürülmüş.
BookOwl

Logo yanıtı her zaman aynı dönüştür. Seninki her sipariş için farklı bir rotasyon ve hepsi aynı değil. Bu doğru değil. Sorunun içerdiği resimlere bakın.
mbomb007

Meydan okuma, rotasyonların aynı olması gerektiğini nerede söylüyor?
BookOwl

1
Herhangi bir matematik bölümü size bir sınırın yakınsama gerektiğini söyleyebilir. Seninki değil.
mbomb007

1

Mathematica / Wolfram Dili 73 bayt

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

Basit açıklama :
AnglePath [{θ1, θ2, θ3,…}], {0,0} 'da başlayan bir yola karşılık gelen 2B koordinatların listesini verir, ardından birbirini izleyen açılardan bir dizi adım alır.

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}]

resim açıklamasını buraya girin resim açıklamasını buraya girin


0

Mathematica, 62 bayt

Graphics@Line@AnglePath[Pi/3Nest[Flatten@{-#,1,#,1,-#}&,0,#]]&

Bu nasıl çalışıyor?
BookOwl

0

JavaScript (ES6), 180 bayt

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>

Bir dizgi dizisi döndürür. Boşluğu düzeltmek en zor kısımdı! 205 bayt için saf dize sürümü:

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]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.