Biorąc pod uwagę uporządkowaną listę 2 lub więcej dwuwymiarowych punktów kartezjańskich, wyprowadzaj prawdziwą wartość, jeśli ścieżka dotyka siebie lub przecina się; w przeciwnym razie wypisz wartość fałszowania, jeśli się nie dotyka ani nie przecina.
Możesz założyć, że kolejne punkty na liście są różne.
Przykłady:
(0,0), (1,0) -> falsey
(0,0), (1,0), (0,0) -> truthy
(0,0), (1,0), (1,1), (0,0) -> truthy
(0,0), (2,0), (1,1), (1,-1) -> truthy
(0,0), (10,0), (0,1), (10,1), (0,2), (10,2) -> falsey
Zwróć uwagę, że wszystkie podane tutaj współrzędne są liczbami całkowitymi. Możesz wspierać wprowadzanie współrzędnych dowolnych wartości z {liczba całkowita, dziesiętna, wymierna, zmiennoprzecinkowa, ...}. Ale twoje obliczenia implementacyjne muszą dać poprawne odpowiedzi na wszelkie podane dane wejściowe.
Odpowiedzi:
Python 2 ,
315309298382380372 bajtówWypróbuj online!
Używa algorytmu stąd , w połączeniu z tą odpowiedzią SO dla segmentów współliniowych.
Edycja: Naprawiono dla odcinków linii kontynuujących w tym samym kierunku (np.
(0,0),(1,0),(2,0)
) Poprzez usunięcie punktu środkowego (w wyniku(0,0),(2,0)
).źródło
*((n*N>0)+(m*M>0)<1)
->*(n*N<=0>=m*M)
.Eukleides ,
154148 bajtówFunkcja o nazwie,
i
że przekazała zestaw punktów, zwraca 0 lub 1. Średniki i podziały linii są wymienne do zakończenia polecenia, po prostu zrzuciłem kilka rzeczy ze względu na utrzymanie krótkiego kodu, ponieważ nie jesteśmy przyzwyczajeni do czytelności i tak kod tutaj.Eukleides to język geometrii płaskiej przede wszystkim do grafiki, ale także z przyzwoitymi zdolnościami programistycznymi. Pomyślałem, że będzie świetnie do tego zadania, ale kilka rzeczy mnie frustrowało. Po pierwsze, warto zauważyć, że zestawy w Eukleidach są w zasadzie tablicami punktów, a gdy ma to zastosowanie, są renderowane jako ścieżki wykonane z połączonych segmentów linii. Eukleides obsługuje iteracyjne generowanie zestawów za pomocą loci, podobnie jak pętla for, która tworzy zestaw w procesie. Gdybym był w stanie użyć locus, wygoliłby bajty, ale najwyraźniej Eukleides nie lubi odwoływać się do częściowo uformowanego locus od siebie.
Inną poważną frustracją było to, że jeśli pozornie dwa identyczne segmenty linii znajdują się jeden nad drugim,
intersection
zwraca tylko jeden punkt obrażenia (co, jak sądzę, ma sens, byłyby nieskończone przecięcia). Moja metoda polega zasadniczo na zbudowaniu ścieżki o krok do tyłu i przetestowaniu następnego segmentu linii pod kątem przecięć ze ścieżką. Z powodu wyżej wspomnianego zachowania na skrzyżowaniu osobno sprawdzam, czy punkt znajduje się na ścieżce.Edycja : Odetnij 1 bajt, zmieniając kolejność
or
instrukcji, aby umożliwić wcześniejsze usunięcie spacjior
; 5 dodatkowych bajtów, zmieniając tenif
blok w operację potrójną.Przypadki testowe:
źródło