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")
Zaimplementowałem prymitywnego interpretera l r f b
jako operatora, który porusza kursorem żółwia pod kątem kształtów. Za jednym razem obraca tylko jeden kąt. Skompresowałem łańcuchy, ponownie wykorzystując łańcuchy (coś w rodzaju podprogramów psuedo). Poza tym nie sprawdziłem, czy wybrałem najlepszą ścieżkę. Wyprowadza do pliku postscriptowego.
Małe wyjaśnienie kodu bez golfa:
import turtle as t
Left="fl"
Right="fr"
diamond= Left*3 + Right*3
tetrahedron=(d+R)*3 #used to be b
Importuje wbudowany moduł żółwia i definiuje makra, które skracają łańcuchy. Moduł żółwia używa poleceń do przemieszczania „żółwia” po ekranie (tj. Do przodu (100), w lewo (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
]
Ta lista zawiera kąty i sekwencje ruchów. Czworościan został zapisany do ponownego użycia z oktoedrenami.
l=t.left
f=t.forward
b=t.back
r=t.right
Jest to część, która mi się podoba, tworzy lokalne funkcje jednoznakowe, dzięki czemu można skracać i automatyzować wywołania za pomocą wstępnie zdefiniowanych ciągów.
input=int(raw_input())*2-2
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
Zaczyna się to od pobrania danych wejściowych (od 1 do 5) i przekonwertowania ich na indeks wskazujący ciąg kształtu w netList. Te ustawienia żółwia, aby pokazać całą sieć. Można je pominąć, jeśli ich zadaniem jest tylko ich narysowanie, ale ponieważ potrzebujemy wyjścia obrazu, są one potrzebne.
for command in netList[input]:
exec command+"(netList[input+1])"
t.getscreen().getcanvas().postscript(file="o")
Pętla for pobiera polecenia z ciągu sekwencji poleceń i wykonuje je, więc w przypadku ciągu typu „fl” wykonuje to „do przodu (kąt); w lewo (kąt);” wywołując nowo utworzone funkcje lokalne. ostatni wiersz wyświetla plik o nazwie „o”, który jest w formacie PostScript przy użyciu funkcji żółwia.
Aby uruchomić :
Skopiuj go do pliku i uruchom go stamtąd. Kiedy go uruchomisz, będzie czekał na liczbę od 1 do 5 (właśnie go zmieniłem, więc pyta przed ustawieniem żółwia). Po wprowadzeniu liczby pojawia się okno i rysuje siatkę. jeśli chcesz, żeby działało szybciej, możesz dodać t.speed(200)
wcześniej setup
.
Możesz skopiować i wkleić go do interpretera, ale gdy raw_input()
zostanie wywołany, zużyje kolejny wprowadzony ciąg "t.setup(.9,.9)"
zamiast liczby. Jeśli to zrobisz, skopiuj do raw_input()
, wprowadź liczbę, a następnie skopiuj wklej resztę. Jest przeznaczony do działania jako całość. Lub możesz skopiować go do funkcji i wywołać.
Oto jego wyniki (przekonwertowane z PostScript):
Uwaga: ich położenie w oknie uległo zmianie, ale ich ogólny kształt jest taki sam.
To trochę brutalna siła dla golfa kodowego, ale zmęczyło mnie próbowanie znalezienia spójnego wzoru między kształtami.