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")
Ich habe einen primitiven Interpreter mit l r f b
Operatoren implementiert , die den Turtle-Cursor im Winkel der Formen bewegen. Auf einmal dreht es sich nur um einen Winkel. Ich habe die Zeichenfolgen komprimiert, indem ich Zeichenfolgen wiederverwendete (ähnlich wie bei Pseudo-Subroutinen). Ansonsten habe ich nicht überprüft, ob ich den besten Pfad verwendet habe. Es wird in eine Postscript-Datei ausgegeben.
Eine kleine Erklärung des Codes ohne Golfspiel:
import turtle as t
Left="fl"
Right="fr"
diamond= Left*3 + Right*3
tetrahedron=(d+R)*3 #used to be b
Importiert das integrierte Turtle-Modul und definiert die Makros, die die Zeichenfolgen verkürzen. Das Schildkrötenmodul verwendet Befehle, um eine 'Schildkröte' über den Bildschirm zu bewegen (dh vorwärts (100), links (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
]
Diese Liste enthält die Winkel und Bewegungsabläufe. Das Tetraeder wurde für die Wiederverwendung mit den Oktoedern aufbewahrt.
l=t.left
f=t.forward
b=t.back
r=t.right
Dies ist der Teil, den ich mag, es macht einzelne Zeichen lokale Funktionen, so dass die Aufrufe durch vordefinierte Zeichenfolgen verkürzt und automatisiert werden können.
input=int(raw_input())*2-2
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
Dies beginnt damit, dass die Eingabe (zwischen 1 und 5) in einen Index konvertiert wird, der auf die Formzeichenfolge in der Netzliste zeigt. Diese Setup-Schildkröte zeigt das ganze Netz. Diese könnten weggelassen werden, wenn die Aufgabe nur darin bestand, sie zu zeichnen, aber da wir eine Bildausgabe benötigen, werden sie benötigt.
for command in netList[input]:
exec command+"(netList[input+1])"
t.getscreen().getcanvas().postscript(file="o")
Die for-Schleife nimmt die Befehle in der Befehlssequenzzeichenfolge und führt sie aus. Bei einer Zeichenfolge wie "fl" wird also "forward (angle); left (angle);" durch Aufrufen der neu erstellten lokalen Funktionen. Die letzte Zeile gibt eine Datei mit dem Namen 'o' im Postscript-Format mit der Turtle-Funktion aus.
Um zu rennen :
Kopieren Sie es in eine Datei und führen Sie es von dort aus. Wenn Sie es ausführen, wartet es auf eine Zahleneingabe zwischen 1 und 5 (ich habe es nur so geändert, dass es fragt, bevor Sie Turtle einrichten). Wenn Sie eine Zahl eingeben, wird ein Fenster geöffnet und das Netz gezeichnet. Wenn Sie möchten, dass es schneller geht, können Sie es t.speed(200)
vorher hinzufügen setup
.
Sie können es kopieren und in den Interpreter einfügen, aber wenn raw_input()
es aufgerufen wird, wird der nächste eingegebene String "t.setup(.9,.9)"
anstelle einer Zahl verwendet. Wenn Sie dies tun, kopieren Sie bis raw_input()
, geben Sie eine Zahl ein, und kopieren Sie dann den Rest. Es soll als Ganzes ausgeführt werden. Oder Sie kopieren es in eine Funktion und rufen es auf.
Hier sind die Ausgaben (konvertiert von Postscript):
Hinweis: Die Position dieser Elemente im Fenster hat sich geändert, aber ihre Gesamtform ist dieselbe.
Es ist ein bisschen brachial für Code-Golf, aber ich habe es satt, ein konsistentes Muster zwischen den Formen zu finden.