Biorąc pod uwagę szerokość / długość geograficzną dwóch punktów na Księżycu (lat1, lon1)
i (lat2, lon2)
oblicz odległość między dwoma punktami w kilometrach, używając dowolnej formuły, która daje taki sam wynik jak formuła haverine.
Wejście
- Cztery wartości całkowite
lat1, lon1, lat2, lon2
w stopniach (kąt) lub - cztery wartości dziesiętne
ϕ1, λ1, ϕ2, λ2
w radianach.
Wynik
Odległość w kilometrach między dwoma punktami (dziesiętna z dowolną precyzją lub zaokrąglona liczba całkowita).
Formuła Haversine
gdzie
r
jest promieniem kuli (załóżmy, że promień Księżyca wynosi 1737 km),ϕ1
szerokość geograficzna punktu 1 w radianachϕ2
szerokość geograficzna punktu 2 w radianachλ1
długość punktu 1 w radianachλ2
długość punktu 2 w radianachd
jest kołową odległością między dwoma punktami
(źródło: https://en.wikipedia.org/wiki/Haversine_formula )
Inne możliwe formuły
d = r * acos(sin ϕ1 sin ϕ2 + cos ϕ1 cos ϕ2 cos(λ2 - λ1))
@miles wzór " .d = r * acos(cos(ϕ1 - ϕ2) + cos ϕ1 cos ϕ2 (cos(λ2 - λ1) - 1))
@Neil wzór jest .
Przykład, w którym dane wejściowe to stopnie, a dane wyjściowe jako zaokrąglona liczba całkowita
42, 9, 50, 2 --> 284
50, 2, 42, 9 --> 284
4, -2, -2, 1 --> 203
77, 8, 77, 8 --> 0
10, 2, 88, 9 --> 2365
Zasady
- Dane wejściowe i wyjściowe można podawać w dowolnym dogodnym formacie .
- W odpowiedzi określ, czy dane wejściowe są w stopniach, czy radianach .
- Nie ma potrzeby obsługi niepoprawnych wartości szerokości i długości geograficznej
- Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
- Jeśli to możliwe, dołącz link do internetowego środowiska testowego, aby inni mogli wypróbować Twój kod!
- Standardowe luki są zabronione.
- To jest golf golfowy, więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
code-golf
math
geometry
trigonometry
mdahmoune
źródło
źródło
d = r * acos( sin ϕ1 sin ϕ2 + cos ϕ1 cos ϕ2 cos(λ2 - λ1) )
tamr = 1737
Odpowiedzi:
Wolfram Language (Mathematica) , 48 bajtów
Wypróbuj online!
Korzysta ze wzoru
d = r * acos( sin ϕ1 sin ϕ2 + cos ϕ1 cos ϕ2 cos(λ2 - λ1) )
gdzier = 1737
źródło
R + geosfera ,
5447 bajtówWypróbuj online!
Pobiera dane wejściowe jako 2-elementowe wektory
longitude,latitude
w stopniach. TIO nie mageosphere
pakietu, ale zapewniamy, że zwraca identyczne wyniki do funkcji poniżej.Podziękowania dla Jonathana Allana za zgolenie 7 bajtów.
R , 64 bajty
Wypróbuj online!
Przyjmuje 4 dane wejściowe jak w przypadkach testowych, ale raczej w radianach niż stopniach.
źródło
e3
i/1000
to naprawdę konieczne?JavaScript (Node.js) , 65 bajtów
Wypróbuj online!
Na podstawie odpowiedzi Kevina Cruijssena, komentarzy Milesa i Neila oraz na prośbę Arnaulda.
źródło
JavaScript (ES7), 90 bajtów
Uwaga: patrz post na @ OlivierGrégoire, aby uzyskać znacznie krótsze rozwiązanie
Bezpośredni port odpowiedzi TFeld . Pobiera dane w radianach.
Wypróbuj online!
Korzystanie z niesławnego
with()
, 85 bajtówDzięki @ l4m2 za oszczędność 6 bajtów
Wypróbuj online!
źródło
with(Math)f=(a,b,c,d)=>3474*asin((sin((c-a)/2)**2+cos(c)*cos(a)*sin((d-b)/2)**2)**.5)
(a,b,c,d,M=Math)=>1737*M.acos(M.sin(a)*M.sin(c)+M.cos(a)*M.cos(c)*M.cos(d-b))
(a,b,c,d,M=Math)=>1737*M.acos(M.cos(a-c)+M.cos(a)*M.cos(c)*(M.cos(d-b)-1))
(a,b,c,d,C=Math.cos)=>1737*Math.acos(C(a-c)+C(a)*C(c)*(C(d-b)-1))
APL (Dyalog Unicode) ,
4035 bajtów SBCSAnonimowa funkcja ukryta. Bierze {ϕ₁, λ₁} jako lewy argument i {ϕ₂, λ₂} jako prawy argument.
Używa wzoru 2 r √ (sin² ( (ϕ₁-ϕ₂) ⁄ 2 ) + cos ϕ₁ cos ϕ₂ sin² ( (λ₁ - λ₂) ⁄ 2 ))
Wypróbuj online! (
r
funkcja przekształca stopnie w radiany),¨
łączyć odpowiednie elementy; {{ϕ₁, ϕ₂}, {λ₁, λ₂}}⊃
wybierz pierwszy; {ϕ₁, ϕ₂}∘
następnie2×.○
produkt ich cosinusów; cos ϕ₁ cos ϕ₂świeci kropka „iloczyn”, ale z selektorem funkcji trig (2 to cosinus) zamiast mnożenia i czasów zamiast plus
1,
dodaj 1 do tego; {1, cos ϕ₁ cos ϕ₂}(
…)×
Pomnóż to przez wynik zastosowania następującej funkcji do {ϕ₁, λ₁} i {ϕ₂, λ₂}:-
ich różnice; {ϕ₁ - ϕ₂, λ₁ - λ₂}2÷⍨
podziel to przez 2; { (ϕ₁ - ϕ₂) ⁄ 2 , (λ₁ - λ₂) ⁄ 2 }1○
sinus tego; {sin ( (ϕ₁ - ϕ₂) ⁄ 2 ), sin ( (λ₁ - λ₂) ⁄ 2 )}×⍨
kwadrat, który (świeci samo-mnożenie); {sin² ( (ϕ₁ - ϕ₂) ⁄ 2 ), sin² ( (λ₁-λ₂) ⁄ 2 )}Teraz mamy {sin² ( (ϕ₁ - ϕ₂) ⁄ 2 ), cos ϕ₁ cos ϕ₂ sin² ( (λ₁ - λ₂) ⁄ 2 )}
1⊥
suma, która (lit. ocena w podstawie 1); sin² ( (ϕ₁-ϕ₂) ⁄ 2 ) + cos ϕ₁ cos ϕ₂ sin² ( (λ₁ - λ₂) ⁄ 2 ).5*⍨
pierwiastek kwadratowy z tego (lit. podnieść to do potęgi połowy)¯1○
Arcsine tego3474×
pomnóż to przez toFunkcja pozwalająca na wprowadzanie danych w stopniach to:
÷180
argument podzielony przez 180○
pomnóż przez πźródło
Python 2 , 95 bajtów
Wypróbuj online!
Pobiera dane w radianach.
Stara wersja, przed zwolnieniem wejścia / wyjścia: Pobiera dane wejściowe jako liczby całkowite i zwraca zaokrągloną liczbę dist
Python 2 , 135 bajtów
Wypróbuj online!
źródło
int
around
ponieważ dziesiętne są dozwolone jako dane wyjściowe, możesz także uniknąć konwersji na radiany, ponieważ dozwolone są również dane wejściowe jako radianyJava 8,
113928882 bajtówDane wejściowe
a,b,c,d
sąϕ1,λ1,ϕ2,λ2
w radianach.-21 bajtów przy użyciu krótszej formuły @miles .
-4 bajty dzięki @ OlivierGrégore, ponieważ wciąż używałem
{Math m=null;return ...;}
z każdymMath.
asm.
, zamiast upuszczaćreturn
i używaćMath
bezpośrednio.-6 bajtów przy użyciu krótszej formuły @Neil .
Wypróbuj online.
Wyjaśnienie:
źródło
(a,b,c,d)->1737*Math.acos(Math.sin(a)*Math.sin(c)+Math.cos(a)*Math.cos(c)*Math.cos(d-b))
(a,b,c,d)->1737*Math.acos(Math.cos(a-c)+Math.cos(a)*Math.cos(c)*(Math.cos(d-b)-1))
Japt ,
5550 bajtówNiekoniecznie tak precyzyjne jak inne odpowiedzi, ale chłopcze dobrze się z tym bawiłem. Pozwól mi rozwinąć.
Podczas gdy w większości języków to wyzwanie jest dość proste, Japt ma niefortunną właściwość, że nie ma wbudowanej ani dla arcsine, ani arccosine. Jasne, możesz osadzić Javascript w Japt, ale byłoby to przeciwieństwo Feng Shui.
Jedyne, co musimy zrobić, aby przezwyciężyć tę niewielką uciążliwość, to przybliżona arkozyna i jesteśmy gotowi!
Pierwsza część to wszystko, co dostaje się do arccosine.
Wynik jest domyślnie przechowywany w
U
celu późniejszego wykorzystania.Następnie musimy znaleźć dobre przybliżenie dla arccosine. Ponieważ jestem leniwy i nie jestem zbyt dobry w matematyce, najwyraźniej po prostu go wykorzystamy.
Mogliśmy użyć dowolnej dużej liczby do rozdzielczości generatora, testy ręczne wykazały, że
7!
jest wystarczająco duży, a jednocześnie dość szybki.Pobiera dane wejściowe jako radiany, generuje liczby nie zaokrąglone.
Ogolił pięć bajtów dzięki Oliverowi .
Wypróbuj online!
źródło
(
wMc(X-V
. Ponieważ kod char1737
nie dla ISO-8859-1, przełącza się na UTF-8, co kosztuje więcej. Zamiast tego możesz użyć kodu char dla173
+7
. ethproductions.github.io/japt/?v=1.4.5&code=I603&input=,
poToMP
:-)Haskell ,
68 66 5251 bajtówWypróbuj online!
-1 bajt dzięki BMO
źródło
Rubin ,
87 7069 bajtówWypróbuj online!
Teraz przy użyciu metody Neila, dzięki Kevin Cruijssen.
źródło
->a,b,c,d{include Math;1737*acos(cos(a-c)+cos(a)*cos(c)*(cos(d-b)-1))}
Galaretka ,
23 2218 bajtów-4 bajty dzięki milom (użycie
{
i}
używanie ich formuły .Funkcja dynamiczna akceptująca
[ϕ1, ϕ2,]
po lewej i[λ1, λ2]
po prawej stronie w radianach, która zwraca wynik (jako zmiennoprzecinkowy).Wypróbuj online!
Mój ... (tutaj również zapisałem bajt za pomocą a
{
)Wypróbuj online
źródło
;I}ÆẠP+ÆSP${ÆA×⁽£ġ
{
i}
nigdy nie robią tego, czego bym się spodziewał. Czy to nie znaczy, że mogę zrobić inaczej w 17 roku ?!{
i}
po prostu stwórz diadę z monady. Podobny pogląd może byćP{ -> ḷP¥
. Może warto dodać szybkie komponowanie (od J), aby zrobić coś takiego,x (P+$) y -> (P x) + (P y)
co może zaoszczędzić bajt lub dwa w podobnych sytuacjach.MATLAB z Przybornikiem mapowania, 26 bajtów
Anonimowa funkcja, która przyjmuje cztery dane wejściowe jako macierz komórki, w takiej samej kolejności, jak opisano w wyzwaniu.
Zauważ, że daje to dokładne wyniki (zakładając, że promień Księżyca wynosi 1737 km), ponieważ
1737/180
jest równe9.65
.Przykład uruchomienia w Matlab R2017b:
źródło
Python 3, 79 bajtów
TIO nie ma geopy.py
źródło
APL (Dyalog Unicode) , 29 bajtów SBCS
Kompletny program Monituje stdin dla {ϕ₁, ϕ₂}, a następnie dla {λ₁, λ₂}. Drukuje na standardowe wyjście.
Używa wzoru r acos (sin ϕ₁ sin ϕ₂ + cos (λ₂ - λ₁) cos ϕ₁ cos ϕ₂)
Wypróbuj online! (
r
funkcja przekształca stopnie w radiany)⎕
monit o {ϕ₁, ϕ₂}1 2∘.○
Kartezjańska aplikacja z funkcją trig; {{sin ϕ₁, sin ϕ₂}, {cos ϕ₁, cos ϕ₂}}×/
produkty rzędowe; {sin ϕ₁ sin ϕ₂, cos ϕ₁ cos ϕ₂}(
…)×@2
W drugim elemencie pomnóż przez to:⎕
monit o {λ₁, λ₂}-/
różnica między nimi; λ₁ - λ₂2○
cosinus tego; cos (λ₁ - λ₂)Teraz mamy {sin ϕ₁ sin ϕ₂, cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂}
+/
suma; sin ϕ₁ sin ϕ₂ + cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂¯2○
cosinus tego; cos (sin ϕ₁ sin ϕ₂ + cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂)1737×
pomnóż przez to; 1737 cos (sin ϕ₁ sin ϕ₂ + cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂)Funkcja pozwalająca na wprowadzanie danych w stopniach to:
÷180
argument podzielony przez 180○
pomnóż przez πźródło
C (gcc) ,
100886564 bajtów88 → 65 za pomocą formuły @milesa
65 → 64 za pomocą formuły @ Neila
Wypróbuj online!
źródło
-lm
flagi kompilatora.Excel, 53 bajty
Korzystanie ze wzoru @ Neila. Wejście w radianach.
źródło
Homar , 66 bajtów
Używa wzoru mil, ale dane wejściowe są w stopniach. Dodaje to dodatkowy krok konwersji na radiany przed pomnożeniem przez promień.
źródło
Python 3 ,
119103 bajtówTo używa stopni.
Wypróbuj online!
źródło
1737*acos(cos(a-A)+cos(a)*cos(A)*(cos(O-o)-1))
PHP , 88 bajtów
Port Oliver odpowiedź
Wypróbuj online!
źródło
SmileBASIC, 60 bajtów
źródło