Patrzę przez okno na poddaszu na podwórze mojego sąsiada. Mają psa przykutego do słupa na środku podwórza. Pies biegnie po podwórku, ale zawsze znajduje się na końcu łańcucha, więc kończy się śladem na ziemi. Zwykle ten tor byłby idealnie okrągły, ale moi sąsiedzi mają na swoim podwórku inne tyczki, na które zaczepia się łańcuch psa. Za każdym razem, gdy łańcuch psa uderza w słup, pies zaczyna obracać się wokół nowego bieguna, niezależnie od długości łańcucha jaka pozostała jego promień. Ponieważ bieguny, pies i łańcuch mają zerową szerokość (moi sąsiedzi są matematykami), łańcuch może owijać się wokół bieguna w nieskończoność bez promienia koła. Pies może również przejść przez łańcuch (ale nie jego obrożę), jeśli łańcuch jest na swojej drodze. Po dłuższej obserwacji tej dziwności postanawiam napisać kod do symulacji psa mojego sąsiada. Kod weźmie lokalizacje środkowego bieguna, do którego jest przykuty pies, lokalizacje innych biegunów na podwórku mojego sąsiada, długość łańcucha i początkową lokalizację psa, i wyświetli diagram wskazujący ścieżka, po której pies zużył trawę. Możesz założyć, że dowolna kombinacja następujących elementów jest stała (a zatem nie bierzesz ich za dane wejściowe):
Lokalizacja słupa, do którego jest przykuty pies
Długość łańcucha
Lokalizacja początkowa psa
Wschodzi słońce, więc przestrzeń na podłodze mojego poddasza oświetlona oknem kurczy się, dając mi coraz mniej miejsca na pisanie kodu. Spróbuj zminimalizować liczbę bajtów kodu, aby mieć miejsce na szkicowanie go na podłodze na poddaszu.
Przypadki testowe
Zakładam, że pies zaczyna 3 jednostki na południe od bieguna, do którego jest przykuty (czerwona kropka), znajdującego się przy 0,0
. Wskazałem, gdzie są bieguny z kropkami dla jasności, nie musisz włączać ich do swojego wyjścia.
Poles at 1,2 -1,2
Poles at 0,.5
Poles at 0,1 1,1 -2,1 -1,-.5
Poles at 0,1 1,1
źródło
{0,-.5}
?{0,.5}
odwrócone pionowo bez największego koła. Pies zasadniczo zaczyna łapać się na drugim słupie.Odpowiedzi:
Python 3 przy użyciu matplotlib, 457 bajtów
Ponieważ twoi sąsiedzi są matematykami, założyłem, że ogród twojego sąsiada zajmuje złożoną domenę, a zatem wszelkie współrzędne obiektów w ogrodzie są liczbami złożonymi. Aby skorzystać z tej funkcji, należy przekazać jej listę liczb zespolonych oznaczających położenie biegunów w ogrodzie sąsiada. Wybrano domyślną reprezentację układu współrzędnych, gdzie po prawej stronie są dodatnie liczby rzeczywiste, a w górę - dodatnie liczby urojone. Oznacza to, że przykłady stają się:
Ponadto program zakłada następujące rzeczy: smycz jest przywiązana do punktu 0, smycz ma 3 jednostki długości, a powierzchnia działki wynosi 10 na 10, a jej środek wynosi 0. Dla tych parametrów wyniki odpowiadają dokładnie przykładom, i tak wygląda wynik (dla końcowego przykładu):
Algorytm jest dość prosty, wymagając tylko jednego warunku do rozróżnienia wyszukiwania w prawo i w lewo. Stan algorytmu jest określony przez bieżący punkt obrotu i orientację / pozostałą długość smyczy, gdy uderzy ona w bieżący punkt obrotu. Działa w następujący sposób:
Algorytm ten jest następnie wykonywany najpierw w kierunku zgodnym z ruchem wskazówek zegara, po czym stan jest resetowany i wykonywany w kierunku przeciwnym do ruchu wskazówek zegara. Prostota algorytmu oznacza, że około połowa programu według liczby bajtów jest przeznaczona na funkcje rysowania. Usunięcie procedur rysowania spowodowałoby usunięcie 218 bajtów z rozmiaru programu.
Poniżej znajduje się wersja bez golfa, która zawiera również kod debugowania, który wyświetla także punkty i kolizje smyczy:
Dane wyjściowe, które produkuje, wyglądają następująco:
źródło
Przetwarzanie 3, 815
833835876879bajtówZaoszczędź dwa bajty dzięki @ZacharyT, usuwając niepotrzebne nawiasy
Uruchom ten program tak:
(funkcja
s
przyjmuje afloat[][]
). Jest to zasadniczo przypadek testowy nr 3, ale pomnożony przez 100 w celu dopasowania do okna.Kilka rzeczy do zapamiętania:
pushMatrix()
ipopMatrix()
operacja mogą pomieścić tylko 32 macierze.Przykładowe dane wyjściowe dla powyższej skrzynki testowej.
Jeśli chcesz zobaczyć upiększone wyjście, dodaj ten wiersz zaraz po
translate(w,w);
funkcji ins
.A to daje nam ten wynik:
Bez golfa
f()
i wyjaśnienia(zawiera również kod debugowania)
Krótko mówiąc, program wysyła dwóch „poszukiwaczy”, jeden idzie w lewo, a drugi w prawo. Każdy z tych poszukiwaczy znajduje najbliższy biegun i rysuje do niego łuk, jeśli łańcuch jest wystarczająco długi, w przeciwnym razie rysuje okrąg. Gdy narysuje łuk, wysyła kolejnego poszukiwacza na ten biegun i proces trwa.
f()
zawiera proces każdego poszukiwacza. Bardziej szczegółowe wyjaśnienie pojawi się, gdy tylko zacznę grać w golfa.źródło
L-d
?LOGO,
305298297293 bajtówWypróbuj kod na FMSLogo.
Zdefiniuj funkcję
draw
(golfed asd
), która podana jako lista współrzędnych biegunowych (na przykładdraw [[0 100] [100 100] [-200 100] [-100 -50][0 0]]
wyświetli wynik na ekranie).Wymagania:
[0 0]
musi znajdować się na liście biegunów. Jeśli włączony jest kod debugowania (bieguny losowania),[0 0]
musi to być ostatni element.x=0, y=-300
(jak w opisie problemu)Możliwe optymalizacje:
>=
go>
Kod do gry w golfa:
Nieskluczony kod (
;
uruchamia wbudowany komentarz (służy do wyjaśnienia) i:
uruchamia nazwę zmiennej):źródło
Python 2 + PIL, 310 bajtów
Skrypt czyta listę punktów ze standardowego wejścia jako listę liczb zespolonych.
źródło