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")
Eu implementei um intérprete primitivo com l r f b
operadores que movem o cursor da tartaruga no ângulo das formas. Ao mesmo tempo, ele gira apenas um ângulo. Compactei as strings reutilizando strings (como psuedo-sub-rotinas); além disso, não verifiquei se estava usando o melhor caminho. Ele gera um arquivo postscript.
Uma pequena explicação do código não golfe:
import turtle as t
Left="fl"
Right="fr"
diamond= Left*3 + Right*3
tetrahedron=(d+R)*3 #used to be b
Importa o módulo embutido tartaruga e define as macros que encurtam as seqüências de caracteres. O módulo tartaruga usa comandos para mover uma 'tartaruga' pela tela (ou seja, para frente (100), esquerda (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
]
Esta lista contém os ângulos e as seqüências de movimento. O tetraedro foi salvo para reutilização com os octohedren.
l=t.left
f=t.forward
b=t.back
r=t.right
Esta é a parte que eu gosto, ela cria funções locais de um único caractere para que as chamadas possam ser encurtadas e automatizadas por meio de strings predefinidas.
input=int(raw_input())*2-2
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
Isso começa pegando a entrada (entre 1 e 5) e convertendo-a em um índice que aponte para a string de forma no netList. Estes configuração tartaruga para mostrar toda a rede. Eles podem ficar de fora se a tarefa for apenas desenhá-los, mas como precisamos de uma imagem, eles são necessários.
for command in netList[input]:
exec command+"(netList[input+1])"
t.getscreen().getcanvas().postscript(file="o")
O loop for pega os comandos na sequência de sequências de comandos e os executa; portanto, para uma sequência como "fl", executa "forward (angle); left (angle);" chamando as funções locais recém-criadas. a última linha gera um arquivo chamado 'o' que está no formato de postscript usando a função turtle.
Para correr :
Copie-o para um arquivo e execute-o a partir daí. Quando você o executa, ele espera uma entrada de número entre 1 e 5 (eu apenas mudei para que ele pergunte antes de configurar a tartaruga). Quando você digita um número, uma janela é exibida e desenha a rede. se você quiser ir mais rápido, você pode adicionar t.speed(200)
antessetup
.
Você pode copiar e colar no intérprete, mas quando raw_input()
é chamado, consome a próxima string que você digita, em "t.setup(.9,.9)"
vez de um número. Então, se você fizer isso, copie atéraw_input()
, digite um número e copie e cole o restante. Destina-se a ser executado como um todo. Ou você pode copiá-lo em uma função e chamá-lo.
Aqui estão as saídas (convertidas do postscript):
Nota: a posição destes na janela mudou, mas sua forma geral é a mesma.
É um pouco de força bruta para o código de golfe, mas me cansei de tentar encontrar um padrão consistente entre as formas.