Jesteś kapitanem pancernika. W tym roku dział inżynierii robi postępy, więc statek, na którym płyniesz, ma kształt prostego trójkąta.
Wychodzisz na pokład i rozkoszujesz się morską bryzą ... choć nie na długo. Wróg strzelił do ciebie! - ale czy strzał trafi?
Wejście
Możesz napisać funkcję lub pełny program dla tego wyzwania.
Twój program przyjmie 11 liczb całkowitych, z których dziesięć jest sparowanych:
Pierwsze trzy pary liczb całkowitych (x 1 , y 1 ), (x 2 , y 2 ), (x 3 , y 3 ) określą wierzchołki twojego statku. Utworzony trójkąt będzie miał niezerowe pole.
Kolejna para liczb całkowitych (e x , e y ) określa lokalizację działa przeciwnika. Działo wroga nigdy nie będzie leżeć ani w granicach twojego statku. *
Para ( x , y ) po tym określa, dokąd skierowany jest wróg. Będzie to różnić się od (e x , e y ).
Ostateczna dodatnia liczba całkowita R określa zasięg strzału wroga
* Byłbyś okropnym kapitanem, gdybyś nawet tego nie zauważył!
Wynik
Musisz wydrukować / zwrócić prawdziwą wartość (np. Prawda, 1), jeśli pancernik zostanie trafiony, w przeciwnym razie wartość fałszu (np. Fałsz, 0).
Co to jest hit?
Strzał wroga to odcinek linii prostej o długości R od (e x , e y ) w kierunku (a x , y y ). Jeśli ten segment linii pokrywa się z dowolną częścią wnętrza twojego trójkątnego pancernika, liczy się to jako trafienie. W przeciwnym razie nie jest to hit.
Strzały, które pasą się lub sięgają tylko do granicy trójkąta, nie liczą się jako trafienie.
Przykłady
0 0 0 1 1 0
1 1
0 0
2
Trafienie: wróg strzelił prosto w środek twojego statku!
2 0 0 2 4 4
0 0
1 1
1
Bez trafienia: zasięg wroga jest zbyt krótki, więc jesteś bezpieczny.
0 0 1 2 3 0
-4 0
0 0
8
Bez trafienia: wróg zranił bok twojego statku, więc nie liczy się to jako trafienie. Szczęściarz!
0 0 -1 3 4 -1
-3 -4
3 4
5
Bez trafienia: Strzał wroga zatrzymuje się tuż przed statkiem, więc jesteś bezpieczny. Gdyby działo przeciwnika miało nawet nieco lepszy zasięg, trafiłbyś w cel! Uff!
-2 -3 -3 6 7 -2
-6 2
1 -4
7
Trafienie: Mimo że strzał nie przeszedł na drugą stronę, nadal jest to trafienie.
-3 2 2 -4 7 -3
-3 -4
-3 0
10
Bez trafienia: Dla przypomnienia jest to kolejny bliski traf .
Dodatkowe przypadki testowe
0 0 6 0 6 8
-6 -8
6 8
20
Bez trafienia: to kolejny pas, ale pod kątem.
0 0 -2 -5 5 3
-3 4
0 0
6
Trafienie: Strzał wszedł przez wierzchołek statku.
Punktacja
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach. Obowiązują standardowe luki .
0 0 -1 3 4 -1 -3 -4 3 4 6
.Odpowiedzi:
Python 3, 252 bajty
To z pewnością najbardziej zmienne, których kiedykolwiek używałem w golfie kodowym. : ^ P
Nieco golfa z komentarzami:
Jak to działa:
Przykładowe przebiegi:
źródło
Python 2.7, 235 bajtów
Oblicza iloczyn krzyżowy
AB x AP
między narożnikami A, B i punktem P. Jeśli wszystkie trzy mają ten sam znak, wówczas punkt znajduje się w trójkącie.Nie golfowany:
Testy:
źródło
C, 247 bajtów
Zdecydowanie jeszcze nie dość golfa.
Obecnie wykorzystuje to podejście podobne do rozwiązania DLosc, tzn. Iteruje wszystkie możliwe współrzędne na segmencie linii, aby ustalić, czy przecina się on z trójkątem. (Więc nie powiedzie się, jeśli zakres jest większy niż 1000). Jednak używa wzoru z http://mathworld.wolfram.com/TriangleInterior.html, aby ustalić, czy punkt znajduje się wewnątrz trójkąta. Pozwala to uniknąć szeregu funkcji trygonometrycznych.
Przykładowa kontrola powinna zostać wydrukowana
1 0 0 0 1 0
.źródło
JavaScript (ES6) 320
448 522 627(Czy można jeszcze grać w golfa?)
Kroki:
Ref:
Przecięcie segmentu
Punkt wewnątrz trójkąta
Punkt w odcinku o określonej odległości
Przetestuj w przeglądarce Firefox
Bez golfa
źródło