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")
Ho implementato un interprete primitivo con l r f b
come operatori che muovono il cursore della tartaruga all'angolo delle forme. Una volta, gira solo un angolo. Ho compresso le stringhe riutilizzando le stringhe (un po 'come psuedo-subroutine), a parte questo, non ho controllato per vedere se stavo usando il percorso migliore. Emette in un file PostScript.
Una piccola spiegazione del codice non golfato:
import turtle as t
Left="fl"
Right="fr"
diamond= Left*3 + Right*3
tetrahedron=(d+R)*3 #used to be b
Importa il modulo tartaruga incorporato e definisce le macro che accorciano le stringhe. Il modulo tartaruga utilizza i comandi per spostare una "tartaruga" sullo schermo (ovvero avanti (100), sinistra (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
]
Questo elenco contiene gli angoli e le sequenze di movimento. Il tetraedro è stato salvato per essere riutilizzato con gli ottedri.
l=t.left
f=t.forward
b=t.back
r=t.right
Questa è la parte che mi piace, rende le funzioni locali a carattere singolo in modo che le chiamate possano essere abbreviate e automatizzate attraverso stringhe predefinite.
input=int(raw_input())*2-2
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
Questo inizia prendendo l'input (tra 1 e 5) e convertendolo in un indice che punta alla stringa di forma in netList. Queste tartarughe di installazione per mostrare l'intera rete. Questi potrebbero essere esclusi se il compito era solo quello di disegnarli, ma poiché abbiamo bisogno di un output dell'immagine sono necessari.
for command in netList[input]:
exec command+"(netList[input+1])"
t.getscreen().getcanvas().postscript(file="o")
Il ciclo for accetta i comandi nella stringa della sequenza di comandi e li esegue, quindi per una stringa come "fl", esegue "forward (angle); left (angle);" chiamando le funzioni locali appena create. l'ultima riga genera un file chiamato 'o' che è in formato Postscript usando la funzione tartaruga.
Per eseguire :
Copialo in un file ed eseguilo da lì. Quando lo esegui, attenderà un numero compreso tra 1 e 5 (l'ho appena cambiato in modo che lo chieda prima di impostare la tartaruga). Quando si inserisce un numero, viene visualizzata una finestra che disegna la rete. se vuoi che vada più veloce puoi aggiungere t.speed(200)
prima setup
.
Puoi copiarlo e incollarlo nell'interprete, ma quando raw_input()
viene chiamato consuma la stringa successiva che inserisci "t.setup(.9,.9)"
invece di un numero. Quindi, se lo fai, copia fino a raw_input()
, inserisci un numero, quindi copia incolla il resto. È inteso per essere eseguito nel suo complesso. Oppure potresti copiarlo in una funzione e chiamarlo.
Ecco i suoi output (convertiti da Postscript):
Nota: la posizione di questi nella finestra è cambiata, ma la loro forma generale è la stessa.
È una piccola forza bruta per il golf del codice, ma mi sono stancato di cercare di trovare un modello coerente tra le forme.