ดอกไม้แห่งชีวิตกอล์ฟ


19

ความท้าทายที่นี่คือการพรรณนาถึงดอกไม้แห่งชีวิตอย่างถูกต้อง (ซึ่งเป็นรูปทรงเรขาคณิตศักดิ์สิทธิ์ตามที่ระบุไว้) ในภาษาที่คุณเลือก

ดอกไม้แห่งชีวิต

การออกแบบประกอบด้วยการจัดเรียงของวงกลมและวงกลมบางส่วนของรัศมี 1 ตามที่แสดงซึ่งมีศูนย์จัดบนตารางสามเหลี่ยมของสนาม 1 รวมทั้งวงกลมรัศมีใหญ่ 3 รอบ

การออกแบบสามารถปรับขนาดตามที่คุณต้องการ แต่อนุญาตให้มีข้อผิดพลาดสูงสุด 2% จากความถูกต้องทางคณิตศาสตร์ที่ได้รับอนุญาต หากใช้กราฟิกแรสเตอร์จะเป็นการ จำกัด เส้นผ่าศูนย์กลางของวงกลมขนาดเล็กให้มีอย่างน้อยประมาณ 100 พิกเซล

เนื่องจากนี่คือ code-golf รหัสที่สั้นที่สุด (ไบต์) จะเป็นผู้ชนะ


10
ยินดีต้อนรับสู่เว็บไซต์! เพียงเพื่อให้คุณรู้ว่ามันเป็นเรื่องปกติที่จะรอสักครู่ก่อนที่จะยอมรับคำตอบวิธีการที่ผู้ใช้คนอื่นจะไม่เห็นการแข่งขันว่า "เกิน" และจะมีส่วนร่วมและการแข่งขันมากขึ้น
DJMcMayhem

2
"ภาพที่เป็นที่รู้จักและถูกต้อง" นั้นไม่ชัดเจนหรือไม่มีวัตถุประสงค์ เป็นไปไม่ได้ที่จะตัดสินว่าการส่งนั้นถูกต้องหรือไม่หากไม่มีเกณฑ์ความถูกต้องตามวัตถุประสงค์ เราสนับสนุนให้ใช้Sandboxเพื่อแก้ไขปัญหาที่อาจเกิดขึ้นกับความท้าทายก่อนโพสต์ลงในเว็บไซต์หลัก
Mego

นอกจากกฎนามธรรมเช่น "รู้จัก" จะดีกว่าที่จะระบุขนาดต่ำสุด
จัดการ

เนื่องจากยังไม่มีใครเสียบปลั๊กเราจึงมีกล่องทรายที่เมตาที่ออกแบบมาเพื่อช่วยให้ความท้าทายใหม่ได้รับข้อเสนอแนะ คุณสามารถค้นหาได้ที่นี่: meta.codegolf.stackexchange.com/questions/2140/…
tuskiomi

1
จริง ๆ แล้วมันไม่ใช่แค่ 19 แวดวง มีโค้งวงกลมที่ขอบเช่นกัน (6 ของพวกเขาครอบคลุมมุม2π / 3, 12 ครอบคลุมπ, 18 ครอบคลุมπ / 6)
มาร์ตินเอนเดอร์

คำตอบ:


23

Mathematica, 177 173 128 124 120 ไบต์

c=Circle;Graphics@{{0,0}~c~3,Rotate[Table[If[-3<x-y<4,c[{√3x,-x+2y}/2,1,Pi/{6,2}]],{x,-3,2},{y,-4,2}],Pi/3#]&~Array~6}

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

แนวคิดหลักคือการเขียนผลลัพธ์จากสิ่งนี้หมุนหกรุ่น:

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

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

####
#####
######
######
 #####
  ####

ขอบเหล่านี้ถูกตัดออกโดยกำหนดเงื่อนไข-3 < x-y < 4ในดัชนี 2D (เนื่องจากค่าของค่าx-yคงที่ตามแนวเส้นทแยงมุม) และการตัดมาจากการคูณเหล่านี้xและyโดยเวกเตอร์พื้นฐานที่ไม่ใช่มุมฉากซึ่งครอบคลุมตารางที่เรากำลังมองหา

การวางแนวที่เฉพาะเจาะจงของส่วนโค้งที่ยังไม่ได้หมุนนี้จะสั้นที่สุดเนื่องจากปลายทั้งสองของส่วนโค้งจะแบ่งเท่า ๆ กันPiเพื่อให้ส่วนโค้งสามารถแสดงเป็นPi/{6,2}(ส่วนโค้งอื่น ๆ ทั้งหมดต้องการและเครื่องหมายลบหรือจำนวนเต็มเพิ่มเติมในตัวเศษ)


ใช้√3เพื่อบันทึก 2 ตัวอักษร & 0 ไบต์ในขณะที่กำจัดแหล่งที่มาของข้อผิดพลาดที่เป็นตัวเลข
Kelly Lowder

@ KellyLowder จุดดีคงที่
Martin Ender

8

OpenSCAD, 228 ไบต์

$fn=99;module o(a=9){difference(){circle(a);circle(a-1);}}function x(n)=9*[sin(n*60),cos(n*60)];module q(g){for(i=[1:6])if(g>0){translate(x(i))union(){o();q(g-1);}}else{intersection(){translate(x(i))o();circle(9);}}}q(2);o(27);

ด้านล่างเป็นรุ่นที่อนุญาตให้บางคนตั้งค่าพารามิเตอร์ r (รัศมี) และ w (ความกว้างของวงแหวน)

r=1;w=.1;$fn=99;module o(n){difference(){circle(n);circle(n-w);}}function x(n)=(r-w/2)*[sin(n*60),cos(n*60)];module q(g){for(i=[1:6])if(g>0){translate(x(i))union(){o(r);q(g-1);}}else{intersection(){translate(x(i))o(r);circle(r);}}}q(2);o(3*r-w);

รุ่นนี้มีความยาว 246 อักขระ
บางรหัสนี้ไม่จำเป็นทางเทคนิค แต่ทำให้ดูคล้ายรูปภาพมากขึ้น


ฉันได้รับข้อผิดพลาดนี้ใน OpenSCAD.net (Firefox 47): Error: Error: Parse error on line 1: ...x(k))o();circle(9);};}}}q(2);o(27); -----------------------^ Expecting 'TOK_ID', '}', 'TOK_IF', '!', '#', '%', '*', got ';'
HyperNeutrino

@AlexL ฉันไม่ได้รับข้อผิดพลาดนั้นเมื่อฉันใช้ไคลเอนต์ OpenSCAD จริงบน mac ของฉัน อย่างไรก็ตามฉันสามารถทำซ้ำข้อผิดพลาดบน OpenSCAD.net โดยใช้ chrome ซึ่งน่าผิดหวัง มันคิดว่ามันเป็นปัญหากับการบริการของพวกเขา คุณลองใช้แอปพลิเคชันเดสก์ท็อปได้หรือไม่
Henry Wildermuth

1
ทำงานสำหรับฉันในรุ่นเดสก์ท็อป (Ubuntu 14.04 LTS)
Benjamin Spector

1
ฉันสังเกตเห็นลวดลาย};} ในรหัสของคุณ ฉันคิดว่าคุณสามารถแทนที่ได้อย่างปลอดภัยด้วย}} ซึ่งจะโกนอักขระสำหรับทั้งสองเวอร์ชัน ทดสอบด้วยตัวเองและดูเหมือนว่าจะทำงาน
Benjamin Spector

6

Mathematica 263 Bytes

ไม่สามารถแข่งขันได้กับผลงานของ @ MartinEnder แต่ฉันก็สนุกไปกับเรื่องนี้ ฉันปล่อยให้กลีบเดินสุ่ม! กลีบดอกเดินด้วยการหมุน 60 องศาโดยการสุ่มประมาณหนึ่งในจุดปลายซึ่งถูกสุ่มเลือก ฉันทดสอบเพื่อดูว่าจุดสิ้นสุดของการหมุนของกลีบตกอยู่นอกดิสก์ขนาดใหญ่หรือไม่และถ้าเป็นเช่นนั้นการหมุนจะไปทางอื่น

c=Circle;a=√3;v={e=0{,},{0,2}};f=RandomChoice;Graphics@{e~c~6,Table[q=f@{1,2};t=f@{p=Pi/3,-p};r=RotationTransform[#,v[[q]]]&;v=r[If[r[t]@v[[-q]]∈e~Disk~6,t,-t]]@v;Translate[Rotate[{c[{1,a},2,p{4,5}],c[{1,-a},2,p{1,2}]},ArcTan@@(#-#2)&@@v,e],v[[2]]],{5^5}]}

นี่คือรหัสถัดไปที่ฉันใช้สำหรับการเคลื่อนไหว

Export[NotebookDirectory[]<>"flower.gif", Table[Graphics[Join[{c[e,6]},(List@@%)[[1,2,1;;n-1]],{Thick,Red,(List@@%)[[1,2,n]]}]],{n,1,3^4,1}]]

สุ่มกลีบดอกไม้เดิน

ฉันอ่านที่ไหนสักแห่งว่าการเดินแบบสุ่มสองมิติต้องกลับไปสู่จุดเริ่มต้นในที่สุด ดูเหมือนรับประกันสองสามพันขั้นตอนในการเติมดิสก์ขนาดใหญ่


นี่เป็นความคิดที่ดีจริงๆ แต่ด้วยจำนวนการทำซ้ำที่ จำกัด นอกจากนี้ยังมีความน่าจะเป็นที่ไม่เป็นศูนย์ที่ไม่ได้เติมเต็มทั้งดอกไม้ คุณควรเพิ่มเงื่อนไขการเลิกจ้างเมื่อคุณวาด 30 กลีบ (ซึ่งเป็นวิธีที่สั้นที่สุดในการตรวจสอบว่าคุณทำเสร็จแล้ว) จากนั้นคุณจะรู้ว่าการวาดนั้นเสร็จสิ้นเมื่อคุณยุติและความน่าจะเป็นที่จะไม่ยุติจะเป็นศูนย์
Martin Ender

เป็นอิสระจากที่มีจำนวนมากของไบต์คุณสามารถบันทึก: ถูกSqrt[3] 3^.5คุณไม่จำเป็นต้องกำหนดeจนกว่าจะใช้งานครั้งแรกและคุณสามารถใช้เคล็ดลับนี้v={e=0{,},{0,2}}จะบันทึกไบต์ในนั้นดังนั้น นอกจากนี้คุณยังสามารถใช้สัญกรณ์มัดบางอย่างเช่นe~c~6หรือe~Disk~6และควรจะเทียบเท่ากับArcTan@@Subtract@@v ArcTan@@(#-#2)&@@v
Martin Ender

ใช้มัดและตัวดำเนินการ to เพื่อตัด 15 ไบต์ ขอบคุณสำหรับเคล็ดลับ @MartinEnder กำจัด / 2 และ 2 * ซึ่งถูกยกเลิก มี 180 กลีบดังนั้นการวนซ้ำ 4 ^ 4 จึงครอบคลุมครึ่งดิสก์ประมาณครึ่งหนึ่งและ 5 ^ 5 ทำงาน ความน่าจะเป็นที่ 9 ^ 9 ที่ไม่ครอบคลุมดิสก์คือ ~ 1 จาก 10 ^ 400,000 ซึ่งมีข้อผิดพลาดน้อยกว่า 2% ดังนั้นจึงไม่คุ้มค่ากับจำนวนไบต์ที่เสียที่จะตรวจสอบ
Kelly Lowder

3

JavaScript (ES6) / SVG, 299 ไบต์

with(document){write(`<svg height=250 width=250><circle${b=` fill=none stroke=black `}cx=125 cy=125 r=120 />`);for(i=0;i<24;i++)write(`<path${b}d=M5,125${`${a=`a60,60,0,0,1,`}40,0`.repeat(i%4+3)+`${a}-40,0`.repeat(i%4+3)} transform=${`rotate(60,125,125)`.repeat(i>>2)}rotate(-60,${i%4*4}5,125) />`)}

ทำงานโดยการสร้างส่วนโค้งหลายคู่ที่มีความยาวต่าง ๆ แล้วหมุนเข้าที่

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