Biorąc pod uwagę 4 punkty na płaszczyznach 2D A, B, C, D
, obliczyć obszar regionu przecięcia trójkątów OAB
i OCD
, gdzie O
jest środek płaszczyzny, mieć współrzędną (0, 0)
.
Algorytmy działające ze stałą złożonością czasową (pod względem operacji arytmetycznych) są zalecane, ale nie wymuszone.
Zasady
- Każdy punkt jest reprezentowany jako dwie liczby rzeczywiste, oznaczające ich współrzędne X i Y.
- Opcjonalnie, jeśli Twój język programowania (lub pewna biblioteka języka programowania) ma wbudowany
Point
typ lub równoważny, dozwolone jest przyjmowaniePoint
obiektu jako danych wejściowych.
- Opcjonalnie, jeśli Twój język programowania (lub pewna biblioteka języka programowania) ma wbudowany
- Dane wejściowe podano jako 4 punkty, w formatach, w tym między innymi:
- Lista 8 współrzędnych.
- Lista 4 punktów, każdy punkt może być reprezentowany w dowolnym dogodnym formacie.
- Dwie listy po 2 punkty.
- itp.
- Nie można zakładać określonej kolejności punktów (kolejność w lewo lub w prawo)
- Nie można zakładać, że punkt
O
jest przekazywany jako dane wejściowe. Innymi słowy, program nie może pobierać i wykorzystywać obcych danych wejściowych. - Nie możesz założyć, że wszystkie punkty są różne. Innymi słowy, trójkąty mogą być zdegenerowane. Musisz także obsłużyć tę sprawę (patrz przypadki testowe poniżej)
- Różnica bezwzględna lub względna musi być mniejsza niż dla przykładowych przypadków testowych poniżej.
10-3
Kryteria wygranej
To jest golf golfowy , najkrótsza odpowiedź w bajtach wygrywa!
Przykładowe przypadki testowe
Ax Ay Bx By Cx Cy Dx Dy area
5 1 1 3 -1 0 0 -1 0
5 1 1 3 -1 0 0 0 0
5 1 1 3 0 0 0 0 0
5 1 1 3 3 4 4 -3 4.50418
5 1 1 3 1 2 2 1 1.5
5 1 1 3 -2 5 4 -2 1.74829
5 1 1 3 -2 5 5 4 2.96154
5 1 1 3 3 5 5 4 1.88462
5 1 1 3 3 5 3 1 3.92308
5 1 1 3 3 5 4 -1 5.26619
5 1 1 3 5 1 4 -1 0
5 1 1 3 5 1 1 3 7
1 3 1 3 5 1 1 3 0
1 3 1 3 1 3 1 3 0
4 8 4 -1 -2 6 -2 -3 0
1.2 3.4 -0.3 4.2 5 7.6 -1.1 2.4 2.6210759326188535
3.1 0.6 0.1 7.2 5.2 0.7 0.9 8 9.018496993987977
Jeśli ktoś chce, oto wyniki dla pierwszej grupy przypadków testowych w dokładnej formie:
0
0
0
46375/10296
3/2
1792/1025
77/26
49/26
51/13
23345/4433
0
7
0
0
0
Zdjęcie ilustracyjne dla przypadku testowego 5 1 1 3 3 4 4 -3
(obszar zielonego czworoboku jest oczekiwanym wynikiem):
[ ]
Odpowiedzi:
Wolfram Language (Mathematica) , 55 bajtów
Wypróbuj online!
Ogoliłem kilka bajtów z banalnej odpowiedzi.
Wymiana
Area
zDiscretizeRegion
pokaże skrzyżowanie.Nawiasem mówiąc, będzie to działać z dowolnymi simpleksami, nie tylko trójkątami.
-1 bajt dzięki JungHwan Min
Sugestia @ user202729 dodała 4 bajty, ale daje 0 dla zdegenerowanych trójkątów
źródło
{{0,0}}
do{0{,}}
(to działa, ponieważ wyrażenie ocenia na{Times[0, {Null, Null}]}
)Python 2 + PIL,
341318313284270 bajtówSpecjalne podziękowania dla Dennisa, który szybko dodał PIL na bajtach TIO
-23 dzięki Panu Xcoderowi
Wypróbuj online! lub Wypróbuj wszystkie przypadki testowe
Aby obliczyć różnicę, należy dosłownie narysować trójkąty i sprawdzić liczbę pikseli namalowanych na obu obrazach.
Ta metoda wstawiła błąd zaokrąglenia, który jest łagodzony przez zwiększenie rozmiaru obrazu.
Wyjaśnienie
źródło