Con trăn, 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")
Tôi đã triển khai một trình thông dịch nguyên thủy với các l r f b
toán tử di chuyển con trỏ rùa xung quanh theo góc của các hình. Tại một thời điểm, nó chỉ quay một góc. Tôi đã nén các chuỗi bằng cách sử dụng lại các chuỗi (giống như các chương trình con psuedo), ngoài ra, tôi không kiểm tra xem liệu tôi có đang sử dụng đường dẫn tốt nhất không. Nó xuất ra một tập tin postcript.
Một lời giải thích nhỏ về mã không chơi gôn:
import turtle as t
Left="fl"
Right="fr"
diamond= Left*3 + Right*3
tetrahedron=(d+R)*3 #used to be b
Nhập mô-đun rùa tích hợp và xác định các macro rút ngắn chuỗi. Mô-đun rùa sử dụng các lệnh để di chuyển một 'rùa' xung quanh màn hình (tức là chuyển tiếp (100), trái (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
]
Danh sách này giữ các góc và trình tự chuyển động. Các tứ diện đã được lưu để tái sử dụng với các bát diện.
l=t.left
f=t.forward
b=t.back
r=t.right
Đây là phần mà tôi thích, nó tạo ra các hàm cục bộ ký tự đơn để các cuộc gọi có thể được rút ngắn và tự động thông qua các chuỗi được xác định trước.
input=int(raw_input())*2-2
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
Điều này bắt đầu bằng cách lấy đầu vào (từ 1 đến 5) và chuyển đổi nó thành một chỉ mục trỏ đến chuỗi hình dạng trong netList. Những thiết lập rùa để hiển thị toàn bộ mạng. Chúng có thể bị bỏ đi nếu nhiệm vụ chỉ là vẽ chúng, nhưng vì chúng ta cần một đầu ra hình ảnh nên chúng cần thiết.
for command in netList[input]:
exec command+"(netList[input+1])"
t.getscreen().getcanvas().postscript(file="o")
Vòng lặp for nhận các lệnh trong chuỗi chuỗi lệnh và thực thi chúng, vì vậy đối với một chuỗi như "fl", điều này thực thi "về phía trước (góc); trái (góc);" bằng cách gọi các hàm cục bộ mới được tạo. dòng cuối cùng xuất ra một tệp có tên 'o' ở định dạng mô tả bằng cách sử dụng chức năng rùa.
Để chạy :
Sao chép nó vào một tập tin và chạy nó từ đó. Khi bạn chạy nó, nó sẽ đợi một đầu vào số từ 1 đến 5 (tôi chỉ thay đổi nó để nó hỏi trước khi thiết lập rùa). Khi bạn nhập một số, một cửa sổ bật lên và vẽ lưới. nếu bạn muốn nó đi nhanh hơn bạn có thể thêm t.speed(200)
trước đó setup
.
Bạn có thể sao chép-dán nó vào trình thông dịch, nhưng khi raw_input()
được gọi, nó sẽ tiêu thụ chuỗi tiếp theo bạn nhập "t.setup(.9,.9)"
thay vì số. Vì vậy, nếu bạn làm điều này, sao chép cho đến khi raw_input()
, nhập một số, hơn là sao chép dán phần còn lại. Nó được dự định để được chạy như một toàn thể. Hoặc bạn có thể sao chép nó vào một chức năng và gọi nó.
Đây là kết quả đầu ra (được chuyển đổi từ postcript):
Lưu ý: vị trí của những thứ này trong cửa sổ đã thay đổi, nhưng hình dạng tổng thể của chúng là như nhau.
Đó là một chút sức mạnh cho golf mã, nhưng tôi đã mệt mỏi khi cố gắng tìm một mô hình nhất quán giữa các hình dạng.