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
as运算符,可将龟形光标以形状的角度四处移动。一次只能旋转一个角度。我通过重用字符串(类似于psuedo子例程)来压缩字符串,除此之外,我没有检查是否使用了最佳路径。输出到后记文件。
取消编码的一些解释:
import turtle as t
Left="fl"
Right="fr"
diamond= Left*3 + Right*3
tetrahedron=(d+R)*3 #used to be b
导入内置的turtle模块并定义缩短字符串的宏。乌龟模块使用命令在屏幕上移动“乌龟”(即,向前(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之间)并将其转换为指向netList中形状字符串的索引开始。这些设置乌龟显示整个网络。如果仅是绘制任务,则可以将其忽略,但是由于我们需要图片输出,因此需要它们。
for command in netList[input]:
exec command+"(netList[input+1])"
t.getscreen().getcanvas().postscript(file="o")
for循环采用命令序列字符串中的命令并执行它们,因此对于像“ fl”这样的字符串,它将执行“ forward(angle); left(angle);” 通过调用新创建的本地函数。最后一行使用乌龟函数输出名为“ o”的文件,其格式为Postscript格式。
运行:
将其复制到文件中并从那里运行。当您运行它时,它将等待1到5之间的数字输入(我只是更改了它,以便在设置乌龟之前询问)。输入数字时,将弹出一个窗口并绘制网络。如果您希望它运行得更快,可以在t.speed(200)
之前添加setup
。
您可以将其复制粘贴到解释器中,但是在raw_input()
调用它时,它将消耗您输入的下一个字符串"t.setup(.9,.9)"
而不是数字。因此,如果执行此操作,请复制直到raw_input()
,输入一个数字,然后复制并粘贴其余部分。它旨在作为一个整体运行。或者,您可以将其复制到函数中并调用它。
这是它的输出(从后记转换):
注意:这些控件在窗口中的位置已更改,但它们的整体形状相同。
对于代码高尔夫来说,这有点蛮力,但是我厌倦了试图在形状之间找到一致的图案。