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
Kaplumbağa imlecini şekillerin açısıyla hareket ettiren operatörler ile ilkel bir yorumlayıcı uyguladım . Bir kerede, sadece bir açıyı döndürür. Ben dizeleri (psuedo-subroutines gibi) yeniden kullanarak dizeleri sıkıştırdı, bunun dışında, ben en iyi yolu kullanıp kullanmadığımı kontrol etmedi. Bir postscript dosyasına çıktı verir.
Golf kodunun küçük bir açıklaması:
import turtle as t
Left="fl"
Right="fr"
diamond= Left*3 + Right*3
tetrahedron=(d+R)*3 #used to be b
Yerleşik kaplumbağa modülünü içe aktarır ve dizeleri kısaltan makroları tanımlar. Kaplumbağa modülü, bir 'kaplumbağayı' ekranın etrafında hareket ettirmek için komutları kullanır (yani ileri (100), sola (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
]
Bu liste açıları ve hareket dizilerini tutar. Tetrahedron, oktohedren ile yeniden kullanılmak üzere kurtarıldı.
l=t.left
f=t.forward
b=t.back
r=t.right
Bu benim sevdiğim kısmı, tek karakter yerel fonksiyonları yapar böylece aramalar önceden tanımlanmış dizeleri ile kısaltılabilir ve otomatikleştirilebilir.
input=int(raw_input())*2-2
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
Bu, girdiyi alarak (1 ile 5 arasında) ve bunu netList'teki şekil dizesine işaret eden bir dizine dönüştürerek başlar. Bu kurulum kaplumbağa tüm net göstermek için. Görev sadece onları çizmekse bunlar dışarıda bırakılabilir, ancak bir resim çıktısına ihtiyacımız olduğundan bunlara ihtiyaç vardır.
for command in netList[input]:
exec command+"(netList[input+1])"
t.getscreen().getcanvas().postscript(file="o")
For döngüsü, komut dizisi dizesindeki komutları alır ve yürütür, bu nedenle "fl" gibi bir dize için bu, "ileri (açı); sol (açı);" yeni oluşturulan yerel işlevleri çağırarak. son satır, kaplumbağa işlevini kullanarak postscript formatında olan 'o' adlı bir dosya çıkarır.
Çalıştırmak için :
Bir dosyaya kopyalayın ve oradan çalıştırın. Çalıştırdığınızda, 1 ile 5 arasında bir sayı girişi bekleyecektir (kaplumbağayı kurmadan önce soracak şekilde değiştirdim). Bir sayı girdiğinizde, bir pencere açılır ve ağı çizer. daha hızlı gitmesini istiyorsanız daha t.speed(200)
önce ekleyebilirsiniz setup
.
Yorumlayıcıya kopyalayıp yapıştırabilirsiniz, ancak raw_input()
çağrıldığında "t.setup(.9,.9)"
sayı yerine girdiğiniz bir sonraki dizeyi tüketir . Bunu yaparsanız raw_input()
, geri kalanını kopyalamak yerine bir sayı girin, kadar kopyalayın. Bir bütün olarak çalıştırılması amaçlanmıştır. Ya da bir işleve kopyalayıp çağırabilirsiniz.
İşte çıktıları (postscript'den dönüştürülür):
Not: Bunların penceredeki konumu değişti, ancak genel şekilleri aynı.
Kod golf için küçük bir kaba kuvvet, ama şekiller arasında tutarlı bir desen bulmaya çalışmaktan yoruldum.