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.
d
ist die Zeichenfolge, die die beiden Dreiecke tut, so ist es(d+'f')*5+setupPosition+(d+'b')*5
setup
macht das Schildkrötenfenster groß genug, um das Netz zu halten. Gleiches giltgoto
, es bewegt die 'Schildkröte' auf -200, 150.clear
löscht die Linie vongoto
. Ihre gerechten Befehle zum Einrichten des Zeichnens.p=(ord(raw_input())-49)*2
nimmt eine Zahl zwischen 1 und 5 an, die der gewünschten Form entspricht.Mathematica
Außerhalb des Wettbewerbs, keine freie Sprache (es sei denn, eine kostenlose Testversion gilt als kostenlos)
Verwendung:
quelle
Python 2 (mit Kairo) - 239
Ergebnisse:
quelle
Logo, 199 Bytes
Als ich das zurücklese, sehe ich, dass meine ursprüngliche Version nicht der Spezifikation entsprach (nimm ein numerisches Argument und zeichne eine Form), sondern wie von einigen der anderen Antworten interpretiert (zeichne alle Formen). Die neue Version behebt dies. Es erwartet, wie zum Beispiel genannt zu werden
q 5
.cs
sollte vorher gemacht werden, um den Bildschirm zu löschen und die Schildkröte nach Norden zu richten.q
ruft die Hauptfunktionp
mit 3 Argumenten auf. Die Syntax dafür ist ziemlich aufgebläht. Um meine vorherige Punktzahl zu übertreffen, musste ich Bytes an anderer Stelle entfernen.Die neue Version von
p
benötigt 3 Argumente. Es ist nicht nötigx
undy
weil wir nur ein Netz zeichnen, aberd
der Abstand zwischen den Untereinheiten bleibt bestehen.s
ist immer noch die Anzahl der Seiten pro Polygon undn
kodiert nun für zwei verschiedene Dinge>n/8
ist die Anzahl der zu zeichnenden Untereinheiten undn*45
ist ein Winkel, um den die Schildkröte vor dem Start gedreht werden muss (unter Ausnutzung des natürlichen Mods 360 für Rotationen. )Verbessertes Looping ermöglicht das Zeichnen von
s
Linien mit Rechtsdrehung unds+2
Linien mit Linksdrehung in einer einzigen Schleife.Der Calormen-Interpreter scheint weniger tolerant gegenüber fehlenden Leerzeichen zu sein als zum Zeitpunkt meines ersten Posts, aber der Code unter http://turtleacademy.com/playground/en läuft einwandfrei
Logo, 200 Bytes
Dolmetscher unter http://www.calormen.com/jslogo/# Es wird davon ausgegangen, dass die Schildkröte nach Norden zeigt, bevor das Programm ausgeführt wird. Verwenden Sie den
cs
Befehl, um den Bildschirm zu löschen, richten Sie die Schildkröte nach Norden und platzieren Sie sie am Ursprung in der Mitte des Bildschirms.Die Grundeinheit aller oben genannten Netze ist ein Paar von Rücken-an-Rücken-Polygonen. Diese sind in 2 versetzten Reihen angeordnet und bilden eine Untereinheit von 4 Polygonen, die vertikal verschoben werden können, um alle Netze zu bilden (mit Ausnahme des Oktaeders, das auf der Zeichnung des Ikosaeders und des Tetraeders reitet). Die Untereinheit bildet 1 Tetraedernetz, 1/5 des Ikosaedernetzes, 1/3 des Dodekaedernetzes und 2/3 des Würfelnetzes (zwei Untereinheiten mit überlappenden mittleren zwei Quadraten).
Ungolfed Code
quelle
ht
, es für das Bild zu verstecken. Ich bin froh, dass ich es nicht getan habe!