Spirograf to zabawka, która rysuje hypotrochoidy i epitrochoidy. W tym wyzwaniu skupimy się na hypotrochoidach.
Z Wikipedii :
Hipotrochoid jest ruletką wyznaczoną przez punkt przymocowany do koła o promieniu r toczącym się wokół wnętrza stałego okręgu o promieniu R , gdzie punkt jest odległością d od środka wewnętrznego koła.
Równania parametryczne dla nich można zdefiniować jako:
Gdzie θ to kąt utworzony przez poziome i środek tocznego koła.
Twoim zadaniem jest napisanie programu, który narysuje ścieżkę wyznaczoną przez punkt zdefiniowany powyżej. Jako dane wejściowe otrzymasz R , r i d , wszystkie liczby całkowite od 1 do 200 włącznie.
Możesz otrzymać te dane wejściowe ze standardowego wejścia, argumentów lub danych wejściowych od użytkownika, ale nie można go zakodować na stałe w programie. Możesz zaakceptować to w dowolnej formie, która jest dla ciebie najwygodniejsza; jako ciągi, liczby całkowite itp.
Założyć:
- Jednostki wejściowe podano w pikselach.
- R > = r
Wyjście powinno być graficzną reprezentacją hypotrochoidu zdefiniowanego przez dane wejściowe. Wyjście ASCII lub inne dane tekstowe nie są dozwolone. Ten obraz można zapisać do pliku lub wyświetlić na ekranie. Dołącz zrzut ekranu lub obraz wyjścia dla wybranego wejścia.
Możesz wybrać dowolne kolory dla ścieżki / tła, z zastrzeżeniem ograniczenia kontrastu. Te dwa kolory muszą mieć składnik „Wartość” HSV co najmniej w połowie skali. Na przykład, jeśli mierzysz HSV [0...1]
, powinna istnieć przynajmniej 0.5
różnica. Pomiędzy [0...255]
powinna być minimalna 128
różnica.
To jest golfowy kod, wygrywa minimalna wielkość kodu źródłowego w bajtach.
źródło
R > r
lubR ≥ r
? (To samo dotyczyr
id
.)R>=r
, aled
nie jest do tego ograniczonyr
i może znajdować się w dowolnym miejscu w zakresie 1-200.R=200, r=1, d=200
. Możesz zmienić rozmiar obrazu na wejście, jeśli chcesz, lub utrzymać go w stałym rozmiarze, o ile wszystko jest widoczne.Odpowiedzi:
Mathematica, 120 bajtów
Nieskluczony kod i przykładowe dane wyjściowe:
Jeśli mogę dołączyć osie do fabuły, mogę zapisać kolejne 9 znaków.
źródło
JavaScript (ECMAScript 6) -
312314 znakówJSFIDDLE
Przykładowy wynik
r = 1, R = 200, d = 30
źródło
Python: 579
streszczenie
Nie jest to wcale konkurencyjne, biorąc pod uwagę odpowiedź Mathematica, ale i tak zdecydowałem się opublikować, ponieważ zdjęcia są ładne i mogą kogoś zainspirować lub być przydatne dla kogoś. Ponieważ jest o wiele większy, zostawiłem go w zasadzie bez golfa. Program oczekuje wprowadzenia z wiersza poleceń R, r, d.
Zrzut ekranu
Oto dwa przykłady, jeden dla (5,3,5) i jeden dla (10,1,7)
Kod
źródło
Perl / Tk -
239227R = 120, r = 20, d = 40:
R = 128, r = 90, d = 128:
R = 179, r = 86, d = 98:
źródło
Przetwarzanie, 270
Wprowadzanie danych odbywa się za pomocą konsoli, po jednym numerze w wierszu.
Zrzut ekranu dla R = 65, r = 15, d = 24:
źródło
GeoGebra, 87
To znaczy, jeśli uważasz GeoGebra za prawidłowy język.
Akceptuje dane wejściowe z paska wprowadzania GeoGebra, w formacie
<variable>=<value>
npR=1000
.Pamiętaj, że może być konieczna ręczna zmiana wielkości powiększenia, aby wyświetlić cały obraz.
(Rzecz na dole okna to pasek wprowadzania, o którym mówiłem)
Wypróbuj online tutaj .
źródło
HTML + JavaScript 256
286 303Edytować Usunięto 1. połączenie z moveTo, i tak działa. Mógłby zaoszczędzić więcej cięcia beginPath, ale wtedy działa tylko za pierwszym razem
Edytuj2 30 bajtów zapisanych thx @ ӍѲꝆΛҐӍΛПҒЦꝆ
Test
Wprowadź dane w polu tekstowym (oddzielone przecinkami), a następnie naciśnij klawisz Tab
źródło
R, 80 bajtów
Jeśli jednak chcemy „czystych” cyfr (bez osi, bez etykiet itp.), Kod będzie musiał być nieco dłuższy (88 znaków):
Jeden przykład kodu wykorzystujący dłuższą wersję f:
Niektóre przykładowe dane wyjściowe:
źródło
,
??C # 813 wynosił 999
Potrzebuje trochę pracy, aby zmniejszyć liczbę bajtów. Udało mi się to trochę zmniejszyć. Akceptuje trzy rozdzielone spacjami liczby całkowite z konsoli.
Próbka wyjściowa:
źródło
skrypt powłoki + gnuplot (153)
Większość wysiłku polega na usunięciu osi i tików, ustawieniu rozmiaru i zakresu oraz zwiększeniu precyzji. Na szczęście gnuplot jest naturalny do gry w golfa, więc większość poleceń można skrócić. Aby zapisać znaki, dane wyjściowe należy ręcznie przekierować do pliku obrazu.
Wywołanie skryptu za pomocą
spiro.sh 175 35 25>i.png
dajeźródło
R, 169 znaków
Zębaty:
Przykłady:
źródło
SmileBASIC, 96 bajtów
Dane wejściowe: 50,30,50:
źródło
Befunge-98, 113 bajtów
W przypadku niektórych obliczeń trygonometrycznych ten kod opiera się na odcisku palca z matematyki stałej punktu (FIXP) oraz grafice żółwia (TURT) odcisku palca do rysowania ścieżki spirografu.
Grafika Turtle w Befunge jest bardzo podobna w zachowaniu do grafiki w języku programowania Logo . Rysujesz za pomocą „żółwia” (służącego jako długopis), którym kierujesz po powierzchni wyjściowej. Wymaga to skierowania żółwia w określonym kierunku, a następnie instruowania go, aby ruszył do przodu na określoną odległość.
Aby pracować z tym systemem, musiałem dostosować oryginalne równania spirografu do czegoś bardziej przyjaznego żółwiom. Nie jestem pewien, czy jest to najlepsze podejście, ale algorytm, który wymyśliłem, działa mniej więcej tak:
Zauważ, że to w rzeczywistości rysuje ścieżkę z rodzajem zygzakowatego wzoru, ale tak naprawdę nie zauważasz, dopóki nie powiększysz dokładnie obrazu.
Oto przykład wykorzystujący parametry R = 73, r = 51, d = 45.
Przetestowałem kod za pomocą CCBI i cfunge , z których oba generują dane wyjściowe w postaci obrazu SVG. Ponieważ jest to skalowalny format wektorowy, powstały obraz nie ma rozmiaru piksela jako takiego - po prostu skaluje się w celu dopasowania do rozmiaru ekranu (przynajmniej podczas przeglądania w przeglądarce). Powyższy przykład to zrzut ekranu, który został ręcznie przycięty i skalowany.
Teoretycznie kod może również działać na Rc / Funge , ale w takim przypadku będziesz musiał uruchomić system z XWindows, ponieważ spróbuje wyrenderować dane wyjściowe w oknie.
źródło
wxMaxima : 110
Jest to wywoływane w sesji interaktywnej przez
f(#,#,#)
. Jako przykład rozważf(3,2,1)
:źródło
Rakieta
Wynik:
źródło