Krótkie wyjaśnienie problemu
Napisz program, aby znaleźć minimalną odległość między dwoma punktami podróżującymi tylko na promieniach pochodzących od początku i okręgami wyśrodkowanymi na początku.
Wyjaśnienie lokalu
Teraz wyobraźmy sobie, że jesteśmy w samolocie, a na tym samolocie możemy podróżować tylko w specjalny sposób. Możemy podróżować na dowolnym promieniu pochodzącym z miejsca pochodzenia.
Możemy również podróżować po dowolnym kole na środku koła
Teraz naszym celem jest podróżowanie z jednego punktu na tym samolocie do drugiego. Jednak nie możemy po prostu podróżować prostą ścieżką euklidesową, możemy to zrobić tylko wtedy, gdy punkty spadną na promień emanujący z centrum.
Możemy podróżować na tym, ponieważ pada na jedno z naszych promieni.
Możemy również podróżować po okręgach wyśrodkowanych na początku.
Przykłady
Oto wyzwanie:
Musimy dotrzeć z jednego punktu do drugiego najkrótszą ścieżką; często jest to kombinacja podróżowania na kółkach i promieniach.
Może to jednak podróżować na dwóch promieniach.
Czasami istnieją dwie ścieżki, które pokonują minimalną odległość.
Problem
Twoim wyzwaniem jest napisanie programu, który po otrzymaniu dwóch punktów da nam minimalną odległość między nimi, jeśli będziemy przestrzegać tych zasad. Dane wejściowe mogą być podawane w postaci prostokątnej lub biegunowej, a wynik powinien wynosić jedną liczbę, odległość między nimi.
Przypadki testowe
(z prostokątnym wejściem)
(1,1) (1,-1) -> ~ 2.22144
(0,0) (1, 1) -> ~ 1.41421
(1,0) (-0.4161 , 0.90929) -> ~ 2
(1,1) (1, 0) -> ~ 1.19961
(1,2) (3, 4) -> ~ 3.16609
źródło
Odpowiedzi:
Haskell,
4948 bajtówStosowanie:
Dzięki @Zgarb za uratowanie bajtu
źródło
(a!q)c r
zamiastd a q c r
.JavaScript (ES6), 65 bajtów
Przyjmuje współrzędne biegunowe. Wykorzystuje sztuczkę @Angsa do zmniejszenia kąta od 0 do π. W przypadku współrzędnych prostokątnych działa coś takiego:
źródło
MATL , 22 bajty
Dane wejściowe to tablica dwóch liczb zespolonych.
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
Rubinowy, 64 bajty
Po pierwsze, moje poddanie. Funkcja lambda z argumentami
distance 1, angle 1, distance 2, angle2
.Teraz są dwa różne rozwiązania o wielkości 66 bajtów (z wyłączeniem przypisania
f=
), a następnie moje faktyczne przesłanie ponownie po 64 bajtach.Zgłoszenie opiera się na rozwiązaniu 2, ale używa identyczności
(s-r).abs
=,s+r-[s,r].min*2
aby skrócić kod o 2 bajty, stąd-2
wewnątrz nawiasów.Inną godną uwagi cechą jest wyrażenie
?i.to_c.arg*4
= 2 * PI bez użyciainclude Math
. Jeśli dopuszczalna jest niższa precyzja, można ją zastąpić literałem.Rozwiązanie 2 skomentowane w programie testowym
Wydajność
źródło
Mathematica 66 bajtów
Wymaga to prostokątnych współrzędnych i może wygenerować dokładne symboliczne rozwiązanie
Stosowanie:
daje:
Wydajność N @%:
{2.221441469, 1.414213562, 1.999934259, 1.199611726, 3.166096674}
źródło
Python 2,
164126125132 bajtów:Jednak obecnie zastanawiam się nad tym. Akceptuje współrzędne biegunowe. Powinny być wywoływane w formacie
A(r1,θ1,r2,θ2)
. Wysyła wartość zmiennoprzecinkową z dokładnością do12
znaczących liczb.Wypróbuj online! (Ideone)
Prosta, prosta implementacja, która oblicza i wysyła do STDOUT minimalną wartość z tablicy co najwyżej 3 wartości zawierających:
r1+r2
) lub długości łuku łączącego dwa punkty iffr1==r2
;abs(r1-r2)
) wtedy i tylko wtedyθ1==θ2
(czyli dwa punkty są współliniowe);''
), jak widać w Pythonie, ciąg jest większy niż jakakolwiek liczba całkowita;źródło
math.pi
?Wolfram Language (Mathematica) , 47 bajtów
Wypróbuj online!
(bije obecną 66-bajtową odpowiedź)
Weź dane jako 2 liczby zespolone.
Mogą występować pewne problemy, jeśli dane wejściowe są symboliczne. (np.
Cos@2 + I Sin@2
)źródło