Geben Sie bei gegebener Breite / Länge von zwei Punkten auf dem Mond (lat1, lon1)
und (lat2, lon2)
der Entfernung zwischen den beiden Punkten in Kilometern eine beliebige Formel an , die das gleiche Ergebnis wie die Haversine-Formel liefert.
Eingang
- Vier ganzzahlige Werte
lat1, lon1, lat2, lon2
in Grad (Winkel) oder - vier Dezimalwerte
ϕ1, λ1, ϕ2, λ2
im Bogenmaß.
Ausgabe
Abstand in Kilometern zwischen den beiden Punkten (Dezimalzahl mit beliebiger Genauigkeit oder gerundeter Ganzzahl).
Haversine Formel
wo
r
ist der Radius der Kugel (angenommen, der Radius des Mondes beträgt 1737 km),ϕ1
Breitengrad von Punkt 1 im Bogenmaßϕ2
Breitengrad von Punkt 2 im Bogenmaßλ1
Länge von Punkt 1 im Bogenmaßλ2
Länge von Punkt 2 im Bogenmaßd
ist der kreisförmige Abstand zwischen den beiden Punkten
(Quelle: https://en.wikipedia.org/wiki/Haversine_formula )
Andere mögliche Formeln
d = r * acos(sin ϕ1 sin ϕ2 + cos ϕ1 cos ϕ2 cos(λ2 - λ1))
@ Meilen 'Formel .d = r * acos(cos(ϕ1 - ϕ2) + cos ϕ1 cos ϕ2 (cos(λ2 - λ1) - 1))
@Neils Formel .
Beispiel, bei dem Eingaben Grad sind und Ausgaben als gerundete Ganzzahl ausgegeben werden
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
Regeln
- Die Eingabe und Ausgabe kann in jedem geeigneten Format erfolgen .
- Geben Sie in der Antwort an, ob die Eingaben in Grad oder Bogenmaß erfolgen .
- Keine Notwendigkeit, ungültige Breiten- / Längengrade zu verarbeiten
- Entweder ein vollständiges Programm oder eine Funktion sind akzeptabel. Wenn es sich um eine Funktion handelt, können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
- Wenn möglich, fügen Sie bitte einen Link zu einer Online-Testumgebung hinzu, damit andere Personen Ihren Code ausprobieren können!
- Standardlücken sind verboten.
- Dies ist Code-Golf, daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Bytes) gewinnt.
code-golf
math
geometry
trigonometry
mdahmoune
quelle
quelle
d = r * acos( sin ϕ1 sin ϕ2 + cos ϕ1 cos ϕ2 cos(λ2 - λ1) )
wor = 1737
Antworten:
Wolfram Language (Mathematica) , 48 Bytes
Probieren Sie es online aus!
Verwendet die Formel
d = r * acos( sin ϕ1 sin ϕ2 + cos ϕ1 cos ϕ2 cos(λ2 - λ1) )
wor = 1737
quelle
R + Geosphäre ,
5447 BytesProbieren Sie es online aus!
Nimmt die Eingabe als 2-Element-Vektoren
longitude,latitude
in Grad auf. TIO hat dasgeosphere
Paket nicht, aber Sie können sicher sein, dass es identische Ergebnisse für die folgende Funktion zurückgibt.Vielen Dank an Jonathan Allan für das Rasieren von 7 Bytes.
R , 64 Bytes
Probieren Sie es online aus!
Nimmt 4 Eingaben wie in den Testfällen vor, jedoch eher im Bogenmaß als in Grad.
quelle
e3
und/1000
wirklich notwendig?JavaScript (Node.js) , 65 Byte
Probieren Sie es online aus!
Basierend auf Kevin Cruijssens Antwort, Miles 'und Neils Kommentaren und auf Anfrage von Arnauld.
quelle
JavaScript (ES7), 90 Byte
Hinweis: Eine viel kürzere Lösung finden Sie im Beitrag von @ OlivierGrégoire
Ein direkter Hafen von TFelds Antwort . Nimmt Eingaben im Bogenmaß vor.
Probieren Sie es online aus!
Mit dem berüchtigten
with()
85 BytesVielen Dank an @ l4m2 für die Einsparung von 6 Bytes
Probieren Sie es online aus!
quelle
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 Byte SBCSAnonyme stillschweigende Funktion. Nimmt {ϕ₁, λ₁} als linkes Argument und {ϕ₂, λ₂} als rechtes Argument.
Verwendet die Formel 2 r √ (sin² ( (ϕ₁-ϕ₂) ⁄ 2 ) + cos ϕ₁ cos ϕ₂ sin² ( (λ₁ - λ₂) ⁄ 2 ))
Probieren Sie es online aus! (Die
r
Funktion konvertiert Grad in Bogenmaß),¨
entsprechende Elemente verketten; {{ϕ₁, ϕ₂}, {λ₁, λ₂}}⊃
wähle den ersten aus; {ϕ₁, ϕ₂}∘
dann2×.○
Produkt ihrer Kosinusse; cos ϕ₁ cos ϕ₂lit. Punkt "Produkt", aber mit Triggerfunktionswähler (2 ist Cosinus) anstelle von Multiplikation und Zeiten anstelle von Plus
1,
1 voranstellen; {1, cos ϕ₁ cos ϕ₂}(
…)×
Multiplizieren Sie dies mit dem Ergebnis der Anwendung der folgenden Funktion auf {ϕ₁, λ₁} und {ϕ₂, λ₂}:-
ihre Unterschiede; {ϕ₁ - ϕ₂, λ₁ - λ₂}2÷⍨
dividiere das durch 2; { (ϕ₁ - ϕ₂) ⁄ 2 , (λ₁ - λ₂) ⁄ 2 }1○
Sinus davon; {sin ( (ϕ₁ - ϕ₂) ⁄ 2 ), sin ( (λ₁ - λ₂) ⁄ 2 )}×⍨
Quadrat das (lit. selbst multiplizieren); {sin² ( (ϕ₁ - ϕ₂) ⁄ 2 ), sin² ( (λ₁-λ₂) ⁄ 2 )}Jetzt haben wir {sin² ( (ϕ₁ - ϕ₂) ⁄ 2 ), cos ϕ₁ cos ϕ₂ sin² ( (λ₁ - λ₂) ⁄ 2 )}
1⊥
Summe, die (lit. in Basis-1 auswerten); sin² ( (ϕ₁-ϕ₂) ⁄ 2 ) + cos ϕ₁ cos ϕ₂ sin² ( (λ₁ - λ₂) ⁄ 2 ).5*⍨
Quadratwurzel davon (wörtlich: Erhöhen Sie das auf die Potenz einer halben)¯1○
Arkussinus davon3474×
multiplizieren Sie das damitDie Funktion zum Zulassen der Eingabe in Grad ist:
÷180
Argument geteilt durch 180○
mit π multiplizierenquelle
Python 2 , 95 Bytes
Probieren Sie es online aus!
Nimmt Eingaben im Bogenmaß vor.
Alte Version, bevor die E / A nachgelassen hat: Nimmt die Eingabe als ganzzahlige Grade und gibt gerundete Dist zurück
Python 2 , 135 Bytes
Probieren Sie es online aus!
quelle
int
undround
weil Dezimalstellen als Ausgabe zulässig sind, können Sie auch die Konvertierung in Bogenmaß vermeiden, da Eingaben als Bogenmaß ebenfalls zulässig sindJava 8,
113928882 BytesDie Eingänge
a,b,c,d
sindϕ1,λ1,ϕ2,λ2
in Radiant.-21 Bytes mit der kürzeren Formel von @miles .
-4 Bytes danke an @ OlivierGrégore, weil ich immer noch
{Math m=null;return ...;}
mit jedemMath.
as verwendet habem.
, anstatt das zu löschenreturn
undMath
direkt zu verwenden.-6 Bytes mit der kürzeren Formel von @Neil .
Probieren Sie es online aus.
Erläuterung:
quelle
(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 BytesNicht unbedingt ganz so präzise wie die anderen Antworten, aber Junge, hatte ich Spaß mit dieser. Lassen Sie mich näher darauf eingehen.
Während diese Herausforderung in den meisten Sprachen recht einfach ist, hat Japt die unglückliche Eigenschaft, dass weder für Arkussinus noch für Arccosin ein integrierter Bestandteil vorhanden ist. Sicher, Sie können Javascript in Japt einbetten, aber das ist das Gegenteil von Feng Shui.
Alles, was wir tun müssen, um dieses kleine Ärgernis zu überwinden, ist ungefähres Arccosin und wir können loslegen!
Der erste Teil ist alles, was in das Arccosin eingespeist wird.
Das Ergebnis wird implizit gespeichert
U
, um später verwendet zu werden.Danach müssen wir eine gute Annäherung für Arccosin finden. Da ich faul bin und nicht so gut mit Mathe umgehen kann, werden wir es offensichtlich nur brutal erzwingen.
Wir hätten jede große Zahl für die Generatorauflösung verwenden können. Manuelle Tests haben gezeigt, dass sie
7!
ausreichend groß und relativ schnell sind.Nimmt die Eingabe als Bogenmaß und gibt ungerundete Zahlen aus.
Dank Oliver fünf Bytes rasiert .
Probieren Sie es online aus!
quelle
(
in entfernenMc(X-V
. Da der Zeichencode für1737
nicht ISO-8859-1 ist, wechselt er zu UTF-8, was mehr kostet. Sie können stattdessen den Zeichencode für173
+ verwenden7
. ethproductions.github.io/japt/?v=1.4.5&code=I603&input=,
nach entfernenToMP
:-)Haskell ,
68 66 5251 BytesProbieren Sie es online aus!
-1 Byte dank BMO
quelle
Ruby ,
87 7069 BytesProbieren Sie es online aus!
Jetzt mit Neils Methode, dank Kevin Cruijssen.
quelle
->a,b,c,d{include Math;1737*acos(cos(a-c)+cos(a)*cos(c)*(cos(d-b)-1))}
Gelee ,
23 2218 Bytes-4 Bytes dank Meilen (Verwendung
{
und}
Verwendung ihrer Formel .Eine dyadische Funktion,
[ϕ1, ϕ2,]
die links und[λ1, λ2]
rechts im Bogenmaß akzeptiert und das Ergebnis zurückgibt (als Gleitkomma).Probieren Sie es online aus!
Meins ... (hat hier auch ein Byte mit a gespeichert
{
)Probieren Sie es online aus
quelle
;I}ÆẠP+ÆSP${ÆA×⁽£ġ
{
und}
sie machen nie das, was ich erwarten würde. Bedeutet das nicht, dass ich in 17 den anderen Weg gehen kann?!{
und}
erstelle einfach eine Dyade aus einer Monade. Eine ähnliche Ansicht könnte seinP{ -> ḷP¥
. Könnte gut sein, schnell eine Komposition (aus J) hinzuzufügen , um so etwas zu tun,x (P+$) y -> (P x) + (P y)
das in ähnlichen Situationen ein oder zwei Bytes sparen kann.MATLAB mit Mapping Toolbox, 26 Bytes
Anonyme Funktion, die die vier Eingaben als Zellenarray in derselben Reihenfolge wie in der Herausforderung beschrieben verwendet.
Beachten Sie, dass dies genaue Ergebnisse liefert (vorausgesetzt, der Mondradius beträgt 1737 km), da
1737/180
gleich ist9.65
.Beispiellauf in Matlab R2017b:
quelle
Python 3, 79 Bytes
TIO hat keine geopy.py
quelle
APL (Dyalog Unicode) , 29 Byte SBCS
Komplettes Programm. Fordert stdin zu {ϕ₁, ϕ₂} und dann zu {λ₁, λ₂} auf. Druckt nach Standard.
Verwendet die Formel r acos (sin ϕ₁ sin ϕ₂ + cos (λ₂ - λ₁) cos ϕ₁ cos ϕ₂)
Probieren Sie es online aus! (Die
r
Funktion konvertiert Grad in Bogenmaß)⎕
Eingabeaufforderung für {ϕ₁, ϕ₂}1 2∘.○
Kartesische Triggerfunktionsanwendung; {{sin ϕ₁, sin ϕ₂}, {cos ϕ₁, cos ϕ₂}}×/
zeilenweise Produkte; {sin ϕ₁ sin ϕ₂, cos ϕ₁ cos ϕ₂}(
…)×@2
Multiplizieren Sie im zweiten Element Folgendes damit:⎕
Eingabeaufforderung für {λ₁, λ₂}-/
Unterschied zwischen diesen; λ₁ - λ₂2○
Kosinus davon; cos (λ₁ - λ₂)Jetzt haben wir {sin ϕ₁ sin ϕ₂, cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂}
+/
Summe; sin ϕ₁ sin ϕ₂ + cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂¯2○
Kosinus davon; cos (sin ϕ₁ sin ϕ₂ + cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂)1737×
multipliziere r damit; 1737 cos (sin ϕ₁ sin ϕ₂ + cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂)Die Funktion zum Zulassen der Eingabe in Grad ist:
÷180
Argument geteilt durch 180○
mit π multiplizierenquelle
C (gcc) ,
100886564 Bytes88 → 65 mit der Formel von @miles
65 → 64 mit der Formel von @ Neil
Probieren Sie es online aus!
quelle
-lm
Compiler-Flag hinzufügen .Excel, 53 Bytes
Verwenden Sie die Formel von @ Neil. Eingabe im Bogenmaß.
quelle
Hummer , 66 Bytes
Verwendet die Meilenformel, aber die Eingabe erfolgt in Grad. Dies fügt einen zusätzlichen Schritt der Umrechnung in Bogenmaß hinzu, bevor mit dem Radius multipliziert wird.
quelle
Python 3 ,
119103 BytesDies verwendet Grade.
Probieren Sie es online aus!
quelle
1737*acos(cos(a-A)+cos(a)*cos(A)*(cos(O-o)-1))
PHP , 88 Bytes
Port of Oliver Antwort
Probieren Sie es online aus!
quelle
SmileBASIC, 60 Bytes
quelle