ฉันชอบต้นไม้พีทาโกรัส


17

... นี่คือความท้าทายที่ทำให้ฉันเป็นต้นไม้

สร้างโปรแกรมหรือฟังก์ชั่นที่เรียกว่า tree ซึ่งรับอาร์กิวเมนต์จำนวนเต็มหนึ่งตัว N และดึง Tree Pythagorean Tree N ระดับที่ลึกโดยที่ระดับ 0 เป็นเพียงลำตัว

จุดต่อของต้นไม้แต่ละต้นควรวางจุดยอดของรูปสามเหลี่ยมที่จุดสุ่มบนเส้นรอบวง (จุดนี้ควรกระจายอย่างสม่ำเสมอไปอย่างน้อย 5 จุดที่เว้นระยะเท่ากันหรือสม่ำเสมอในครึ่งวงกลมทั้งหมด)

เลือกต้นไม้ของคุณอาจเป็น 3 มิติมีสีสันหรือสว่างตามเวลาของวัน อย่างไรก็ตามนี่คือ code-golf ดังนั้นไฟล์ที่เล็กที่สุดชนะ

แก้ไข: ฉันจะปิดการแข่งขันและยอมรับคำตอบที่เล็กที่สุดเมื่อถึงเวลาหนึ่งสัปดาห์



เท็จ ฉันหลังจากขั้นตอนวิธีการที่แตกต่างกัน :)
อเล็กซานเด-Brett

ตกลง. ยุติธรรมพอสมควร คุณอาจต้องการพิจารณาการส่งข้อมูลซ้ำของคุณไปที่ "Pythagorean Tree"
DavidC

ฉันชอบรถไฟ? :)
tomsmeding

คำตอบ:


15

Mathematica, 246 234 221 ตัวละคร

g[n_,s_:1]:={p=RandomReal[q=Pi/2],r=##~Rotate~(o={0,0})&,t=Translate}~With~If[n<0,{},Join[#~t~{0,s}&/@(#~r~p&)/@g[n-1,s*Cos@p],t[#,s{Cos@p^2,1+Sin[2p]/2}]&/@(r[#,p-q]&)/@g[n-1,s*Sin@p],{Rectangle[o,o+s]}]]
f=Graphics@g@#&

นี่ไม่ใช่วิธีที่ดีที่สุด / สั้นที่สุดในการทำสิ่งนี้

การใช้งาน: f[8]

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

และนี่คือตัวอย่างผลลัพธ์สำหรับf[6]และf[10]ตามลำดับ

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

ค่อนข้าง ungolfed:

g[n_, s_:1] := With[{p},
  r = Rotate;
  t = Translate;
  p = RandomReal[q = Pi/2];
  If[n < 0, {},
   Join[
    (t[#, {0, s}] &) /@ (r[#, p, {0, 0}] &) /@ g[n - 1, s*Cos[p]],
    (t[#, s {Cos[p]^2, 1 + Sin[2 p]/2}] &) /@ (r[#, p - q, {0, 0}] &) /@
       g[n - 1, s*Sin[p]],
    {Rectangle[{0, 0}, {s, s}]}
    ]
   ]
  ]
f = Graphics@g[#] &

มันค่อนข้างน่าประทับใจ ความอัปยศฉันไม่มี mathematica เพื่อทดสอบ - คุณช่วยเพิ่มตัวอย่างอีกสองตัวอย่างได้หรือไม่?
alexander-brett

@ ali0sha ดูการแก้ไข
Martin Ender

คุณไม่จำเป็นต้องShowอยู่ในนั้นและModuleก็ไม่จำเป็น
หวด

@swish ขอบคุณสำหรับShowคำใบ้ แต่ฉันจะกำจัดได้Moduleอย่างไร ถ้าฉันไม่ประกาศpในท้องที่มันจะถูกเขียนทับในการโทรซ้ำดังนั้นฉันจึงไม่สามารถทำการโทรทั้งสองแบบได้ด้วยpใช่ไหม?
Martin Ender

@ m.buettner บางทีคุณอาจจะสามารถใช้ซึ่งสั้นกว่าBlock Module
alephalpha

20

CFDG, 134 อักขระ

อันนี้ไม่ถูกต้องเพราะคุณไม่สามารถ จำกัด ความลึกของการเรียกซ้ำได้ แต่ปัญหาเพียงแค่เรียกร้องให้มีการแก้ปัญหาในนี้ :)

startshape t
c(q)=cos(q/2)^2
d(q)=1+sin(q)/2
p=acos(-1)
shape t{w=rand(p)
SQUARE[x .5 .5]t[trans 0 1 c(w) d(w)]t[trans c(w) d(w) 1 1]}

ผลลัพธ์มีลักษณะเช่นนี้

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

สำหรับอีก 46 ตัวอักษร (รวม180 ตัวอักษร ) คุณยังสามารถระบายสีได้ใน:

startshape t
c(q)=cos(q/2)^2
d(q)=1+sin(q)/2
p=acos(-1)
shape t{w=rand(p)
SQUARE[x .5 .5 h 25 sat 1 b .2]t[trans 0 1 c(w) d(w) b .08 .8 h 2.2]t[trans c(w) d(w) 1 1 b .08 .8 h 2.2]}

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


ฉันรู้ว่ามันไม่ได้เป็น ontopic อย่างสมบูรณ์ แต่รุ่นจะดูอย่างไรแทนที่จะเป็น "เสียงสีขาว" คุณใช้ "เสียงสีน้ำตาล" เป็นมุม?
ɐɔıʇǝɥʇuʎs

@Synthetica คุณหมายถึงมุมที่มากขึ้นประมาณ 90 °และน้อยกว่าที่ 0 และ 180 ใช่ไหม
Martin Ender

@Synthetica ที่คล้ายกันนี้ ฉันไม่สามารถใช้เสียงสุ่มเดินจริงได้เนื่องจากต้องใช้พารามิเตอร์อินพุต (ค่าสุ่มสุดท้าย) ปรับและส่งต่อ สิ่งนี้จะทำให้ไวยากรณ์ไวต่อบริบทดังนั้น CFDG จึงไม่รองรับ ฉันแกล้งมันเล็กน้อยโดยเพียงแค่กดค่าสุ่มไปทาง towards / 2 อีกเล็กน้อยโดยใช้ฟังก์ชันลูกบาศก์อย่างง่ายของตัวอย่างแบบสุ่ม
Martin Ender

ฉันคิดว่าลิงค์ imgur ของคุณใช้งานไม่ได้และถึงแม้ว่าฉันจะสนุกกับสีและรูปร่างฉันคิดว่าฉันต้องตัดสิทธิ์สำหรับสิ่งนี้เนื่องจากเหตุผลที่คุณพูดถึง
alexander-brett

@ ali0sha คุณสิทธิกำลัง, นี่คือการเชื่อมโยงถาวร การตัดสิทธิ์รายการนี้ยุติธรรมอย่างแน่นอนฉันแค่ต้องการแบ่งปัน Context Free Art กับบางคนและดูเหมือนจะเป็นวิธีที่เรียบร้อยสำหรับปัญหา ;) ... ฉันยังได้คำตอบจาก Mathematica ^^
Martin Ender

4

Postscript, 322 270

แก้ไข:ดูเหมือนว่าrealtimeไม่สามารถใช้เป็นเมล็ดพันธุ์ของตัวสร้างแบบสุ่มที่เหมาะสม ดังนั้นเราจะใช้ตัวแปรสภาพแวดล้อมเพื่อวัตถุประสงค์นี้และเรียกใช้โปรแกรมดังนี้:

gs -c 20 $RANDOM -f tree.ps

หรือ

gswin32c -c 20 %RANDOM% -f tree.ps

ตอนนี้ต้นไม้ของเราคาดเดาได้น้อย 14 ไบต์ถูกเพิ่มในการนับทั้งหมด การเปลี่ยนแปลงอื่น ๆ : 1) อาร์กิวเมนต์ของโปรแกรมจะถูกส่งผ่านทางบรรทัดคำสั่ง 2) ไม่มีการนับซ้ำอย่างชัดเจน - ขนาดสแต็คทำหน้าที่เพื่อจุดประสงค์นี้ (มุมการหมุนสาขาซ้ายถูกเก็บไว้ในสแต็กเพื่อวาดกิ่งขวาในภายหลัง) 3) ไม่มีตัวแปรที่ระบุชื่อสำหรับความลึกที่ต้องการ - ขนาดสแต็กคือออฟเซ็ตของสแต็ก มันอยู่ที่นั่นเมื่อออกคือไม่ได้ใช้

srand
250 99 translate
50 50 scale
/f{
    count
    dup index div dup 1 le{
        0 exch 0 setrgbcolor
        0 0 1 1 rectfill
        0 1 translate
        rand 5 mod 1 add 15 mul
        gsave
        dup rotate
        dup cos dup scale
        f
        grestore
        dup cos dup dup mul
        exch 2 index sin mul translate
        dup 90 sub rotate
        sin dup scale 1
        f
        pop
    }{pop}ifelse
}def
f

ฉันคิดว่ามันชัดเจนมาก - สถานะกราฟิกถูกเตรียมและ fเรียกขั้นตอนนี้ซ้ำสำหรับความลึกแต่ละระดับติดต่อกันสองครั้ง - สำหรับสาขา 'ซ้าย' และ 'ขวา' การทำงานกับสี่เหลี่ยม1x1ขนาด (ดูมาตราส่วนดั้งเดิม) ช่วยลดปัญหาการคูณด้วยความยาวด้าน มุมของการหมุนของกิ่งซ้ายถูกสุ่ม - หนึ่งใน 5 ของการแบ่งระยะห่างเท่า ๆ กันถูกใช้ - ฉันคิดว่ามันป้องกันกรณีที่น่าเกลียดสำหรับการสุ่มแบบสม่ำเสมอ

อาจช้าสำหรับความลึกที่ต้องการมากกว่า 20 หรือมากกว่านั้น

ถัดไปเป็นรุ่นที่ตีกอล์ฟโดยใช้โทเค็นไบนารีเข้ารหัส ASCII (ดูคำตอบของ luser droog จากหัวข้อที่ลิงก์) หมายเหตุcos, sin, randไม่สามารถใช้เครื่องหมายนี้

/${{<920>dup 1 4 3 roll put cvx exec}forall}def srand 250 99<AD>$ 50 50<8B>$/f{count(8X68)$ 1 le{0(>)$ 0<9D>$ 0 0 1 1<80>$ 0 1<AD>$ rand 5 mod 1 add 15<~CecsG2u~>$ cos<388B>$ f(M8)$ cos(88l>)$ 2(X)$ sin<6CAD38>$ 90<A988>$ sin<388B>$ 1 f pop}{pop}(U)$}def f

.

/${{<920>dup 1 4 3 roll put cvx exec}forall}def
srand
250 99<AD>$
50 50<8B>$
/f{
count(8X68)$
1 le{
0(>)$ 0<9D>$
0 0 1 1<80>$
0 1<AD>$
rand 5 mod 1 add 15 
<~CecsG2u~>$
cos<388B>$ 
f
(M8)$
cos(88l>)$
2(X)$ sin<6CAD38>$
90<A988>$ sin<388B>$
1
f
pop
}{pop}(U)$
}def
f

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


ฉันคิดว่าสไตล์ที่นี่คืออาร์กิวเมนต์บรรทัดคำสั่งที่จะต้องเพิ่มดังนั้นคะแนน 344 ... ฉันต้องบอกว่าแม้ตามมาตรฐาน codegolf นี่มันดูน่าประทับใจ ไกลแค่ไหนที่คุณจะได้รับมันด้วยสัญญาณโทเค็น? คุณอยู่ไม่ไกลจาก Mathematica แน่นอน
alexander-brett

@ ali0sha -dGraphicsAlphaBitsเป็นแฟล็กสำหรับเอาต์พุตต่อต้านนามแฝงเพื่อป้องกันไม่ให้ขอบหยักของสี่เหลี่ยมขนาดใหญ่สามารถละเว้นได้ (หรือ 'ซ่อน' ในตัวแปรสภาพแวดล้อมเช่น) บางคนอาจจะชอบมากกว่านี้หากไม่มีธงนี้ (ใบไม้ต้นไม้จะได้รับ 'ปริมาณ' มากขึ้น) ขนาด 20 ไบต์นั้นไม่ค่อยสำคัญเท่าไหร่ ฉันจะบอกว่าลด 20-25% โดยใช้โทเค็นไบนารีเข้ารหัส ASCII (ตัดสินโดยคำตอบหัวข้อที่เชื่อมโยง) อาจลด 50% โดยไม่ต้องเข้ารหัส ASCII, 2 ไบต์ไบท์ต่อโทเค็นชื่อระบบ จะดูเหมือนว่าบางภาษาที่ชนะมักจะ;)
2846289

ฉันคิดว่าคุณควรจะทำมัน - ให้มันบิตการแข่งขันมากขึ้นในที่นี่ :)
อเล็กซานเด-Brett

3

กาแฟ377B 352B

ฉันรู้สึกสกปรกในการเขียน coffeescript แต่ฉันไม่สามารถหาแพ็คเกจการวาดที่เหมาะสมสำหรับ python3: - /

Q=(n)->X=(D=document).body.appendChild(C=D.createElement('Canvas')).getContext('2d');C.width=C.height=400;M=Math;T=[[175,400,50,i=0]];S=M.sin;C=M.cos;while [x,y,l,a]=T[i++]
 X.save();X.translate x,y;X.rotate -a;X.fillRect 0,-l,l,l;X.restore();T.push [e=x-l*S(a),f=y-l*C(a),g=l*C(b=M.random()*M.PI/2),d=a+b],[e+g*C(d),f-g*S(d),l*S(b),d-M.PI/2] if i<2**n

Javascript 393B 385B

สวยกว่าเล็กน้อยใน javascript และฉันมีความสุขมากกับ for-loop แต่ไม่มี [x, y, z] = ไวยากรณ์ฉันไม่สามารถทำให้มันสั้นพอที่จะเอาชนะ coffeescript

function Q(n){X=(D=document).body.appendChild(C=D.createElement('Canvas')).getContext('2d');C.width=C.height=600;M=Math;T=[[275,400,50,i=0]];while(A=T[i++]){X.save();X.translate(x=A[0],y=A[1]);X.rotate(-(a=A[3]));X.fillRect(0,-(l=A[2]),l,l);X.restore();S=M.sin;C=M.cos;i<M.pow(2,n)&&T.push([e=x-l*S(a),f=y-l*C(a),g=l*C(b=M.random()*M.PI/2),d=a+b],[e+g*C(d),f-g*S(d),l*S(b),d-M.PI/2])}}

ต้องบอกว่าฉันได้รับการรวบรวมนิดหน่อยนี่เป็นเวลาเกือบสองเท่าของการแก้ปัญหาทางคณิตศาสตร์: - / เห็นมันทำงาน: http://jsfiddle.net/FK2NX/3/


คำแนะนำเล็กน้อย: คุณสามารถบันทึกอย่างน้อย 16 ตัวอักษรโดยใช้เครื่องหมายอัฒภาคแทนการขึ้นบรรทัดใหม่ใน CoffeeScript ในทั้งสองกรณีหากวิธีใดXตอบแทนกลับXคุณสามารถโยงพวกเขา และคุณสามารถบันทึกตัวละครดีๆได้อีกหลายตัวโดยการบันทึกM.sinและM.cosในตัวแปรตัวเดียว
Martin Ender

น่าเสียดายที่การดำเนินงานตามบริบทไม่ส่งคืนบริบทซึ่งฉันรู้สึกเสียใจ นอกจากนี้คุณสามารถเปลี่ยนชื่อ M.sin เป็น Ms ได้ แต่บรรทัด Ms = M.sin ใช้ตัวอักษรมากกว่าที่บันทึกไว้ ... ฉันจะดูการแยกช่องว่างออก
alexander-brett

s=M.sinไม่มีคุณก็สามารถทำได้
Martin Ender

ฉันจะทำ S = M.sin ได้อย่างไร แต่ไม่ใช่ R = X.rotate
alexander-brett

ฉันคิดว่าrotateใช้thisและsinไม่ คุณต้องทำอะไรซักอย่างR=X.rotate.bind(X)แต่นั่นอาจจะไม่คุ้มค่าอีกต่อไป
Martin Ender
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.