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.
d
jest ciągiem, który robi dwa trójkąty, więc jest(d+'f')*5+setupPosition+(d+'b')*5
setup
sprawia, że okno żółwia jest wystarczająco duże, aby utrzymać siatkę. To samo dotyczygoto
, przesuwa „żółwia” do -200, 150.clear
czyści utworzoną linięgoto
. Ich po prostu komendy do konfigurowania rysunku.p=(ord(raw_input())-49)*2
przyjmuje liczbę od 1 do 5, odpowiadającą żądanemu kształtowi.Matematyka
Poza konkursem, nie jest to darmowy język (chyba że bezpłatny okres próbny liczy się jako bezpłatny)
Stosowanie:
źródło
Python 2 (z Cairo) - 239
Wyniki:
źródło
Logo, 199 bajtów
Czytając to wstecz, widzę, że moja oryginalna wersja nie była zgodna ze specyfikacją, jak napisano (weź argument liczbowy i narysuj jeden kształt), ale raczej zgodnie z interpretacją niektórych innych odpowiedzi (narysuj wszystkie kształty). Nowa wersja to naprawia. Oczekuje, że zostanie wywołany jak na przykład
q 5
.cs
należy to zrobić wcześniej, aby wyczyścić ekran i skierować żółwia na północ.q
wywołuje główną funkcjęp
z 3 argumentami. Składnia tego jest dość rozdęta, więc aby pobić mój poprzedni wynik, musiałem zgolić bajty gdzie indziej.nowa wersja
p
pobiera 3 argumenty. Nie ma potrzeby,x
ay
ponieważ wykreślamy tylko jedną sieć, aled
odstęp między podjednostkami pozostaje.s
jest wciąż liczbą boków na wielokąt, an
teraz koduje dwie różne rzeczy>n/8
to liczba podjednostek do wykreślenia in*45
jest to kąt, o który żółw musi zostać obrócony przed rozpoczęciem (wykorzystując naturalny mod 360 do obrotu. )Ulepszone zapętlenie umożliwia rysowanie
s
linii z obrotem w prawo is+2
linii z obrotem w lewo i w lewo w jednej pętli.interpreter calormen wydaje się być teraz mniej tolerancyjny wobec braku białych znaków niż w momencie mojego pierwszego postu, ale kod działa dobrze na http://turtleacademy.com/playground/en
Logo, 200 bajtów
Tłumacz na http://www.calormen.com/jslogo/# Zakłada się, że żółw wskazuje północ przed uruchomieniem programu. Użyj
cs
polecenia, aby wyczyścić ekran, skieruj żółwia na północ i umieść go na początku na środku ekranu.Podstawową jednostką wszystkich powyższych sieci jest para wielokątów. Są one ułożone w 2 schodkowych rzędach, tworząc podjednostkę 4 wielokątów, które można przełożyć w pionie, aby utworzyć wszystkie sieci (z wyjątkiem ośmiościanu, który zaczepia o rysunek dwudziestościanu i czworościanu). Podjednostka tworzy 1 siatkę czworościanu, 1/5 siatki dwudziestościanu, 1/3 siatki dwunastościanu i 2/3 siatki sześcianu (narysowane są dwie podjednostki, a środkowe dwa kwadraty zachodzą na siebie.)
Nieskluczony kod
źródło
ht
aby ukryć to dla obrazu. Cieszę się, że nie!