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")
J'ai implémenté un interprète primitif avec l r f b
comme opérateurs qui déplacent le curseur de la tortue à l'angle des formes. À un moment donné, il ne tourne que d'un angle. J'ai compressé les chaînes en réutilisant des chaînes (un peu comme des pseudo-sous-programmes), à part ça, je n'ai pas vérifié si j'utilisais le meilleur chemin. Il sort dans un fichier postscript.
Une petite explication du code non golfé:
import turtle as t
Left="fl"
Right="fr"
diamond= Left*3 + Right*3
tetrahedron=(d+R)*3 #used to be b
Importe le module de tortue intégré et définit les macros qui raccourcissent les chaînes. Le module tortue utilise des commandes pour déplacer une «tortue» autour de l'écran (c'est-à-dire vers l'avant (100), gauche (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
]
Cette liste contient les angles et les séquences de mouvement. Le tétraèdre a été conservé pour être réutilisé avec les octoèdres.
l=t.left
f=t.forward
b=t.back
r=t.right
C'est la partie que j'aime, elle fait des fonctions locales à un seul caractère afin que les appels puissent être raccourcis et automatisés via des chaînes prédéfinies.
input=int(raw_input())*2-2
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
Cela commence par prendre l'entrée (entre 1 et 5) et la convertir en un index qui pointe vers la chaîne de forme dans la netList. Ces tortues d'installation pour montrer l'ensemble du net. Ceux-ci pourraient être omis si la tâche consistait simplement à les dessiner, mais comme nous avons besoin d'une sortie d'image, ils sont nécessaires.
for command in netList[input]:
exec command+"(netList[input+1])"
t.getscreen().getcanvas().postscript(file="o")
La boucle for prend les commandes dans la chaîne de séquence de commandes et les exécute, donc pour une chaîne comme "fl", cela exécute "avant (angle); gauche (angle);" en appelant les fonctions locales nouvellement créées. la dernière ligne génère un fichier appelé «o» au format postscript utilisant la fonction tortue.
Pour exécuter :
Copiez-le dans un fichier et exécutez-le à partir de là. Lorsque vous l'exécutez, il attendra une entrée de nombre entre 1 et 5 (je viens de le changer pour qu'il demande avant de configurer la tortue). Lorsque vous entrez un nombre, une fenêtre apparaît et dessine le filet. si vous voulez que ça aille plus vite, vous pouvez ajouter t.speed(200)
avantsetup
.
Vous pouvez le copier-coller dans l'interpréteur, mais lorsqu'il raw_input()
est appelé, il consomme la chaîne suivante que vous saisissez "t.setup(.9,.9)"
au lieu d'un nombre. Donc, si vous faites cela, copiez jusqu'à raw_input()
, entrez un nombre, puis copiez-collez le reste. Il est destiné à être exécuté dans son ensemble. Ou vous pouvez le copier dans une fonction et l'appeler.
Voici ses sorties (converties à partir de postscript):
Remarque: la position de ceux-ci dans la fenêtre a changé, mais leur forme générale est la même.
C'est une petite force brute pour le golf de code, mais je me suis fatigué d'essayer de trouver un motif cohérent entre les formes.