Gambarkan Kurva Sierpinski Arrowhead

14

pengantar

The Sierpinski Arrowhead Curve adalah kurva yang batas adalah Segitiga Sierpinski.

Ini pertama kali dimulai seperti ini:

 _
/ \

Kemudian, setiap baris diganti dengan versi yang diputar dari yang pertama:

  _
 / \
 \ /
_/ \_

Lanjut:

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

Evolusi Kurva Sierpinski Arrowhead

Tugas Anda

Diberi angka n , keluaran n it- iterate Kurva Sierpinski Arrowhead.

Anda dapat memilih untuk indeks 0 atau 1, tetapi harap tentukan dalam jawaban Anda.

Anda dapat menghasilkan gambar, atau menggunakan Seni Ascii dalam format yang saya miliki di atas.

Anda tidak boleh menggunakan bawaan untuk menghasilkan kurva ini.

Ingat, ini adalah , jadi kode dengan byte paling sedikit menang.

Oliver Ni
sumber

Jawaban:

14

Oktaf, 240 236 221 byte

Ini dibuat dengan ide yang sama dengan yang digunakan di sini, tetapi saya harus mengubahnya agar sesuai dengan kurva panah sierpinsky.

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

masukkan deskripsi gambar di sini

cacat
sumber
u=.5;v=3^u/2;B=[u,v];C=[-u,v];A=C<0;lebih pendek 16 byte :) Anda juga dapat melakukan axis off equaluntuk menyimpan 5 byte lainnya.
Stewie Griffin
3

Diagram Haskell +, 176 byte

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

Membuat file svg dengan latar belakang transparan yang disebut "a".

g 0menghasilkan garis horizontal, g 1adalah /¯\.

masukkan deskripsi gambar di sini

Angs
sumber
Hebat, saya tidak tahu Diagrams!
flawr
@ flawr, itu hebat tapi peringatan grafis Haskell yang biasa berlaku. Akan lebih baik untuk hanya memanggil setara plot() dengan membuka jendela.
Angs
2

MSWLogo (Versi 6.5b), 102 byte

Mengambil dua fungsi shapeL, yang shapeRdiberikan di sini dan menggabungkannya dengan menambahkan argumen tambahan :a, yang memanggil fungsi yang berlawanan saat dinegasikan.

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

Suatu fungsi sdidefinisikan, yang mengambil jumlah iterasi :n(berbasis 1), sudut :a, panjang :l. Itu rekursif, memanggil iterasi yang lebih rendah dari dirinya sendiri dengan sudut :adinegasikan dalam dua contoh untuk mendapatkan orientasi yang benar.

  • rt :a, lt :aputar kura-kura (benda segitiga yang jalurnya dilacak) ke kanan, sedikit demi sedikit :a.
  • fd :lmenggerakkan penyu dengan :llangkah-langkah.

Fungsi ini dipanggil dengan :asama dengan 60.

Panah

Di sini, repeatpada dasarnya adalah loop UNTUK, dengan penghitung bawaan repcount. pudan pdberarti "pena ke atas" dan "pena ke bawah", yang menghentikan kura-kura dari menggambar ketika posisinya sedang diatur menggunakansetxy .

Gambar dari setiap iterasi telah dipanggil dengan panjang :lsama dengan power 2 (7-repcount), yang berkurang secara eksponensial; ini karena definisi menggunakan hal yang sama :lpada langkah rekursif, jadi dengan memperbaiki :lukuran keseluruhan output akan meningkat secara eksponensial :n.

u54112
sumber
Ini adalah bahasa yang tepat untuk pekerjaan itu, tetapi secara teknis jawaban tidak diizinkan data tambahan, jadi idealnya Anda akan menyandikan angka 60 dalam jawaban Anda.
Neil
@ Neil Jadi saya hanya memasukkan 60dalam hitungan byte?
u54112
Saya tidak yakin sesederhana itu, tapi saya sendiri tidak tahu bahasanya.
Neil
1

Python 2, 124 byte

Didasarkan pada kode dalam artikel Wikipedia.

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)

Pesanan 0 adalah garis lurus.

BookOwl
sumber
Anda harus mengubah kode Anda untuk menggunakan sudut 60 derajat, jika tidak maka tidak akan mendekati segitiga Sierpinsky. Juga, orientasi berubah tergantung pada urutannya, yang menurut saya tidak benar. trinket.io/python/a803546939
mbomb007
Jawaban logo juga memberikan fungsi yang mengambil sudut sebagai parameter, jadi saya pikir tidak apa-apa. Sejauh orientasi berjalan, itu masih kurva yang sama, hanya diputar.
BookOwl
Namun, logo selalu memiliki rotasi yang sama. Milik Anda adalah rotasi yang berbeda untuk setiap pesanan, dan semuanya tidak sama. Ini tidak baik Lihatlah gambar-gambar yang berisi pertanyaan itu.
mbomb007
Di mana tantangannya mengatakan bahwa rotasi harus sama?
BookOwl
1
Setiap jurusan matematika dapat memberi tahu Anda bahwa batas harus bertemu. Milikmu tidak.
mbomb007
1

Mathematica / Wolfram Language 73 byte

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

Penjelasan sederhana :
AnglePath [{θ1, θ2, θ3, ...}] memberikan daftar koordinat 2D yang sesuai dengan jalur yang dimulai pada {0,0}, kemudian mengambil serangkaian langkah panjang unit pada sudut relatif berturut-turut θ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}]

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

chyanog
sumber
0

Mathematica, 62 byte

Graphics@Line@AnglePath[Pi/3Nest[Flatten@{-#,1,#,1,-#}&,0,#]]&
alephalpha
sumber
Bagaimana cara kerjanya?
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>

Mengembalikan array string. Mendapatkan jarak yang tepat adalah bagian tersulit! Versi string murni untuk 205 byte:

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
sumber