วาดเส้นโค้งหัวลูกศร Sierpinski


14

บทนำ

Sierpinski Arrowhead โค้งเป็นโค้งที่ จำกัด เป็นสามเหลี่ยม Sierpinski ของ

มันเริ่มต้นเช่นนี้ก่อน:

 _
/ \

จากนั้นแต่ละบรรทัดจะถูกแทนที่ด้วยเวอร์ชันที่หมุนของบรรทัดแรก:

  _
 / \
 \ /
_/ \_

ต่อไป:

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

Sierpinski Arrowhead Curve Evolution

งานของคุณ

รับตัวเลขnให้ทำซ้ำรอบที่nของลูกศร Sierpinski Curve

คุณอาจเลือก 0- หรือ 1 ดัชนี แต่โปรดระบุในคำตอบของคุณ

คุณสามารถสร้างรูปภาพหรือใช้ Ascii Art ในรูปแบบที่ฉันมีด้านบน

คุณไม่สามารถใช้บิวด์อินเพื่อสร้างเส้นโค้งนี้

จำไว้ว่านี่คือดังนั้นโค้ดที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ

คำตอบ:


14

อ็อกเทฟ240 240 236 221 ไบต์

สิ่งนี้ทำด้วยความคิดเดียวกันกับที่นี่แต่ฉันต้องเปลี่ยนให้พอดีกับส่วนโค้งของหัวลูกศร 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

ป้อนคำอธิบายรูปภาพที่นี่


u=.5;v=3^u/2;B=[u,v];C=[-u,v];A=C<0;สั้นลง 16 ไบต์ :) คุณยังสามารถaxis off equalบันทึกอีก 5 ไบต์ได้เช่นกัน
Stewie Griffin

3

Haskell + ไดอะแกรม 176 ไบต์

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

สร้างไฟล์ svg ที่มีพื้นหลังโปร่งใสเรียกว่า "a"

g 0เอาท์พุทเป็นเส้นแนวนอนคือg 1/¯\

ป้อนคำอธิบายรูปภาพที่นี่


เยี่ยมมากฉันไม่รู้Diagrams!
ข้อบกพร่อง

@ flawr มันยอดเยี่ยม แต่มีข้อแม้โปรแกรมกราฟิก Haskell ตามปกติ มันเป็นการดีมากที่จะโทรplot() ไปที่หน้าต่าง
อัง

2

MSWLogo (รุ่น 6.5b), 102 ไบต์

ใช้เวลาทั้งสองฟังก์ชั่นshapeL, shapeRรับที่นี่และผสานพวกเขาโดยการเพิ่มการโต้แย้งพิเศษ:aซึ่งเรียกฟังก์ชั่นที่ตรงข้ามเมื่อเมื่อตะกี้

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

ฟังก์ชั่นsที่มีการกำหนดซึ่งจะมีจำนวนซ้ำ:n(1-based) มุมความยาว:a :lเป็นการเรียกซ้ำเรียกซ้ำตัวเองต่ำกว่าโดยมีมุมเป็น:aลบในสองกรณีเพื่อให้ได้แนวที่ถูกต้อง

  • rt :a, lt :aหมุนเต่า (thingy สามเหลี่ยมที่มีเส้นทางเป็น traced) ขวา, ซ้ายโดย:aองศา
  • fd :lย้ายเต่าไปข้างหน้าทีละ:lขั้นตอน

ฟังก์ชันจะถูกเรียกด้วย:aเท่ากับ 60

หัวลูกศร

ที่นี่repeatเป็นหลักสำหรับการวนรอบกับเคาน์เตอร์ในrepcountตัว puและpdหมายถึง "ปากกาขึ้น" และ "ปากกาลง" setxyซึ่งหยุดเต่าจากการวาดภาพในขณะที่ตำแหน่งจะถูกตั้งค่าการใช้

ภาพวาดของการวนซ้ำแต่ละครั้งถูกเรียกด้วยความยาว:lเท่ากับpower 2 (7-repcount)ซึ่งจะลดลงแบบทวีคูณ นี้เป็นเพราะความหมายที่ใช้เหมือนกัน:lในขั้นตอน recursive จึงมีการแก้ไขขนาดโดยรวมของการส่งออกจะเพิ่มขึ้นชี้แจงกับ:l:n


นี่เป็นภาษาที่เหมาะสมสำหรับงาน แต่คำตอบทางเทคนิคไม่อนุญาตให้มีข้อมูลเพิ่มเติมดังนั้นคุณควรเข้ารหัส 60 คำตอบของคุณ
Neil

@ Neil ดังนั้นฉันแค่รวม 60ไว้ในจำนวนไบต์?
สำหรับโมนิก้า

ฉันไม่แน่ใจว่ามันง่าย แต่ฉันไม่รู้ภาษาของตัวเอง
Neil

1

Python 2, 124 ไบต์

อ้างอิงจากรหัสในบทความ 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)

คำสั่ง 0 เป็นเส้นตรง


คุณต้องเปลี่ยนรหัสของคุณเพื่อใช้มุม 60 องศามิฉะนั้นจะไม่ประมาณสามเหลี่ยม Sierpinsky นอกจากนี้การวางแนวก็เปลี่ยนไปตามลำดับซึ่งฉันคิดว่าไม่ถูกต้อง trinket.io/python/a803546939
mbomb007

คำตอบโลโก้ยังให้ฟังก์ชั่นที่ใช้มุมเป็นพารามิเตอร์ดังนั้นฉันคิดว่ามันก็โอเค เท่าที่การปฐมนิเทศดำเนินไปมันก็ยังคงเป็นเส้นโค้งเดียวกัน
BookOwl

คำตอบโลโก้คือการหมุนแบบเดียวกันเสมอ ของคุณคือการหมุนที่แตกต่างกันสำหรับแต่ละคำสั่งซื้อและพวกเขาจะไม่เหมือนกันทั้งหมด ไม่เป็นไร ดูภาพที่คำถามมีอยู่
mbomb007

ความท้าทายบอกว่าการหมุนจะต้องเหมือนกันที่ไหน
BookOwl

1
วิชาคณิตศาสตร์ใด ๆ สามารถบอกคุณได้ว่าขีด จำกัด ต้องมาบรรจบกัน ของคุณไม่ได้
mbomb007

1

Mathematica / Wolfram Language 73 ไบต์

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

คำอธิบายง่ายๆ:
AnglePath [{ θ1 , θ2, θ3, …}] แสดงรายการพิกัด 2D ที่สอดคล้องกับเส้นทางที่เริ่มต้นที่ {0,0} จากนั้นใช้ชุดของขั้นตอนของความยาวของหน่วยที่มุมญาติต่อเนื่องθ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}]

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่



0

JavaScript (ES6), 180 ไบต์

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>

ส่งคืนอาร์เรย์ของสตริง การเว้นวรรคให้ถูกต้องเป็นส่วนที่ยากที่สุด! รุ่นสตริงเพียวสำหรับ 205 ไบต์:

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]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.