Python, 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
ตัวดำเนินการที่เลื่อนเคอร์เซอร์เต่าไปรอบ ๆ ที่มุมของรูปร่าง ในคราวเดียวมันจะเปลี่ยนเพียงมุมเดียว ฉันบีบอัดสตริงโดยใช้สตริงซ้ำ (เช่นรูทีนย่อย psuedo) นอกจากนั้นฉันไม่ได้ตรวจสอบว่าฉันใช้เส้นทางที่ดีที่สุดหรือไม่ มันส่งออกไปยังไฟล์ Postscript
คำอธิบายเล็ก ๆ ของรหัสที่ไม่ตีกอล์ฟ:
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
]
รายการนี้เก็บมุมและลำดับการเคลื่อนไหว จัตุรมุขถูกบันทึกไว้เพื่อนำมาใช้ใหม่ด้วย octohedren
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) และแปลงเป็นดัชนีที่ชี้ไปที่สตริงรูปร่างใน netList เต่าตั้งค่าเหล่านี้จะแสดงสุทธิทั้งหมด สิ่งเหล่านี้อาจถูกทิ้งไว้หากงานเพียงเพื่อวาดพวกเขา แต่เนื่องจากเราต้องการเอาท์พุทรูปภาพที่ต้องการ
for command in netList[input]:
exec command+"(netList[input+1])"
t.getscreen().getcanvas().postscript(file="o")
ห่วงสำหรับใช้คำสั่งในสตริงคำสั่งและดำเนินการพวกเขาดังนั้นสำหรับสตริงเช่น "fl" นี้จะดำเนินการ "ไปข้างหน้า (มุม); ซ้าย (มุม);" โดยการเรียกฟังก์ชั่นท้องถิ่นที่สร้างขึ้นใหม่ บรรทัดสุดท้ายจะส่งไฟล์ที่เรียกว่า 'o' ซึ่งอยู่ในรูปแบบ postscript โดยใช้ฟังก์ชันเต่า
วิธีเรียกใช้ :
คัดลอกลงในไฟล์และเรียกใช้จากที่นั่น เมื่อคุณเรียกใช้มันจะรอการป้อนตัวเลขระหว่าง 1 ถึง 5 (ฉันเพิ่งเปลี่ยนเพื่อให้ถามก่อนตั้งค่าเต่า) เมื่อคุณป้อนตัวเลขหน้าต่างจะปรากฏขึ้นและดึงตาข่าย ถ้าคุณอยากให้มันเป็นไปได้เร็วขึ้นคุณสามารถเพิ่มก่อนt.speed(200)
setup
คุณสามารถคัดลอกวางลงในล่าม แต่เมื่อraw_input()
ถูกเรียกมันจะใช้สตริงถัดไปที่คุณป้อน"t.setup(.9,.9)"
แทนตัวเลข ดังนั้นหากคุณทำสิ่งนี้ให้คัดลอกจนกระทั่งraw_input()
ใส่หมายเลขแล้วคัดลอกวางที่เหลือ มันตั้งใจที่จะทำงานโดยรวม หรือคุณสามารถคัดลอกลงในฟังก์ชั่นและเรียกมัน
นี่คือผลลัพธ์ (แปลงจาก postscript):
หมายเหตุ: ตำแหน่งของสิ่งเหล่านี้ในหน้าต่างมีการเปลี่ยนแปลง แต่รูปร่างโดยรวมจะเหมือนกัน
มันเป็นแรงเดรัจฉานเล็กน้อยสำหรับรหัสกอล์ฟ แต่ฉันเบื่อที่จะพยายามหารูปแบบที่สอดคล้องกันระหว่างรูปร่าง