पायथन, 456 429 381
import turtle as t
L="fl"
R="fr"
d=L*3+R*3
b=(d+R)*3
a=[b,120,L*3+"fflflffflflfrflflfffl"+R*4+"flf",90,b+"ffrfrflffrffrfrfrflflf",120,(R*5+L*5+R+L)*5+"rrfr"+L*5+R*2+L*2+R*4+"f",72,(d+"f")*5+"rfl"+((d+"b")*5)[:-1],120]
l=t.lt
f=t.fd
b=t.bk
r=t.rt
p=input()*2-2
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
for c in a[p]:exec c+"(a[p+1])"
t.getscreen().getcanvas().postscript(file="o")
मैंने l r f b
ऑपरेटर्स के साथ एक आदिम इंटरप्रेटर लागू किया जो आकृतियों के कोण पर कछुए के कर्सर को घुमाता है। एक समय में, यह केवल एक कोण बनाता है। मैंने स्ट्रिंग्स को पुन: उपयोग करके स्ट्रिंग्स को संकुचित कर दिया (इस तरह के प्यूसीडो-सबरूटीन्स की तरह), इसके अलावा, मैंने यह देखने के लिए जांच नहीं की कि क्या मैं सबसे अच्छा पथ का उपयोग कर रहा हूं। यह एक पोस्टस्क्रिप्ट फ़ाइल के लिए आउटपुट करता है।
अन-गोल्फ कोड की थोड़ी व्याख्या:
import turtle as t
Left="fl"
Right="fr"
diamond= Left*3 + Right*3
tetrahedron=(d+R)*3 #used to be b
अंतर्निहित कछुआ मॉड्यूल को आयात करता है और स्ट्रिंग्स को छोटा करने वाले मैक्रोज़ को परिभाषित करता है। कछुआ मॉड्यूल स्क्रीन के चारों ओर एक 'कछुए' को स्थानांतरित करने के लिए आदेशों का उपयोग करता है (यानी आगे (100), बाएं (90))
netList=[
#tetrahedron
tetrahedron,120,
#cube
Left*3+"fflflffflflfrflflfffl"+Right*4+"flf",90,
#octohedron, builds off the tetrahedron
tetrahedron+"ffrfrflffrffrfrfrflflf",120,
#dodecahedron
(Right*5 + Left*5 + Right + Left)*5
+"rrfr"+
Left*5 + Right*2 + Left*2 + Right*4 + "f",72,
#icosahedron
(diamond+"f")*5 +"rfl"+((diamond+"b")*5)[:-1],120
]
यह सूची कोण और आंदोलन अनुक्रम रखती है। ऑक्टोहेड्रन के साथ पुन: उपयोग करने के लिए टेट्राहेड्रॉन को बचाया गया था।
l=t.left
f=t.forward
b=t.back
r=t.right
यह वह हिस्सा है जो मुझे पसंद है, यह एकल चरित्र स्थानीय फ़ंक्शन बनाता है ताकि कॉल को पूर्व-परिभाषित स्ट्रिंग्स के माध्यम से छोटा और स्वचालित किया जा सके।
input=int(raw_input())*2-2
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
यह इनपुट (1 और 5 के बीच) लेने से शुरू होता है, और इसे एक सूचकांक में परिवर्तित करता है जो नेटलिस्ट में आकृति स्ट्रिंग को इंगित करता है। ये सेटअप पूरे नेट को दिखाने के लिए कछुआ है। यदि कार्य केवल उन्हें आकर्षित करने के लिए किया गया था, तो इन्हें छोड़ा जा सकता है, लेकिन चूंकि हमें एक चित्र आउटपुट की आवश्यकता होती है।
for command in netList[input]:
exec command+"(netList[input+1])"
t.getscreen().getcanvas().postscript(file="o")
लूप के लिए कमांड अनुक्रम स्ट्रिंग में कमांड्स लेता है और उन्हें निष्पादित करता है, इसलिए "fl" जैसी स्ट्रिंग के लिए, यह "फॉरवर्ड (एंगल)" निष्पादित करता है; लेफ्ट (एंगल); " नए बनाए गए स्थानीय कार्यों को कॉल करके। अंतिम पंक्ति 'ओ' नामक एक फ़ाइल को आउटपुट करती है जो कछुए फ़ंक्शन का उपयोग करके पोस्टस्क्रिप्ट प्रारूप प्रारूप में है।
चलाने के लिए :
इसे एक फ़ाइल में कॉपी करें और इसे वहां से चलाएं। जब आप इसे चलाते हैं, तो यह 1 और 5 के बीच एक नंबर इनपुट की प्रतीक्षा करेगा (मैं इसे सिर्फ इसलिए बदल देता हूं ताकि यह कछुए को स्थापित करने से पहले पूछता है)। जब आप एक नंबर इनपुट करते हैं, तो एक विंडो पॉप अप करती है और नेट खींचती है। यदि आप चाहते हैं कि यह तेजी से आगे बढ़े तो आप t.speed(200)
पहले जोड़ सकते हैं setup
।
आप इसे दुभाषिया में कॉपी-पेस्ट कर सकते हैं, लेकिन जब raw_input()
इसे कहा जाता है तो आप "t.setup(.9,.9)"
संख्या के बजाय अगले स्ट्रिंग का उपभोग करते हैं । इसलिए यदि आप ऐसा करते हैं raw_input()
, तो कॉपी पेस्ट करें, बाकी की कॉपी पेस्ट की तुलना में एक नंबर इनपुट करें। इसे संपूर्ण रूप में चलाने का इरादा है। या आप इसे किसी फ़ंक्शन में कॉपी कर सकते हैं और कॉल कर सकते हैं।
यहाँ यह आउटपुट (पोस्टस्क्रिप्ट से परिवर्तित) हैं:
नोट: विंडो में इन की स्थिति बदल गई है, लेकिन उनका समग्र आकार समान है।
यह कोड गोल्फ के लिए थोड़ा क्रूर बल है, लेकिन मैं आकृतियों के बीच एक सुसंगत पैटर्न खोजने की कोशिश कर थक गया।