Étant donné la latitude / longitude de deux points sur la Lune (lat1, lon1)
et (lat2, lon2)
, calculez la distance entre les deux points en kilomètres, en utilisant n'importe quelle formule qui donne le même résultat que la formule haversine.
Contribution
- Quatre valeurs entières
lat1, lon1, lat2, lon2
en degrés (angle) ou - quatre valeurs décimales
ϕ1, λ1, ϕ2, λ2
en radians.
Production
Distance en kilomètres entre les deux points (décimale avec n'importe quelle précision ou entier arrondi).
Formule Haversine
où
r
est le rayon de la sphère (supposons que le rayon de la Lune est de 1737 km),ϕ1
latitude du point 1 en radiansϕ2
latitude du point 2 en radiansλ1
longitude du point 1 en radiansλ2
longitude du point 2 en radiansd
est la distance circulaire entre les deux points
(source: https://en.wikipedia.org/wiki/Haversine_formula )
Autres formules possibles
d = r * acos(sin ϕ1 sin ϕ2 + cos ϕ1 cos ϕ2 cos(λ2 - λ1))
Formule de @miles .d = r * acos(cos(ϕ1 - ϕ2) + cos ϕ1 cos ϕ2 (cos(λ2 - λ1) - 1))
La formule de @Neil .
Exemple où les entrées sont des degrés et la sortie sous forme d'entier arrondi
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
Règles
- L'entrée et la sortie peuvent être données dans n'importe quel format pratique .
- Spécifiez dans la réponse si les entrées sont en degrés ou en radians .
- Pas besoin de gérer des valeurs de latitude / longitude invalides
- Un programme complet ou une fonction sont acceptables. S'il s'agit d'une fonction, vous pouvez renvoyer la sortie plutôt que de l'imprimer.
- Si possible, veuillez inclure un lien vers un environnement de test en ligne afin que d'autres personnes puissent essayer votre code!
- Les failles standard sont interdites.
- Il s'agit de code-golf, donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.
code-golf
math
geometry
trigonometry
mdahmoune
la source
la source
d = r * acos( sin ϕ1 sin ϕ2 + cos ϕ1 cos ϕ2 cos(λ2 - λ1) )
oùr = 1737
Réponses:
Wolfram Language (Mathematica) , 48 octets
Essayez-le en ligne!
Utilise la formule
d = r * acos( sin ϕ1 sin ϕ2 + cos ϕ1 cos ϕ2 cos(λ2 - λ1) )
oùr = 1737
la source
Géosphère R + ,
5447 octetsEssayez-le en ligne!
Prend l'entrée en tant que vecteurs à 2 éléments
longitude,latitude
en degrés. TIO n'a pas legeosphere
package mais soyez assuré qu'il renvoie des résultats identiques à la fonction ci-dessous.Merci à Jonathan Allan d'avoir rasé 7 octets.
R , 64 octets
Essayez-le en ligne!
Prend 4 entrées comme dans les cas de test, mais en radians plutôt qu'en degrés.
la source
e3
et/1000
vraiment nécessaire?JavaScript (Node.js) , 65 octets
Essayez-le en ligne!
D'après la réponse de Kevin Cruijssen, les commentaires de Miles et Neil et à la demande d'Arnauld.
la source
JavaScript (ES7), 90 octets
Remarque: voir l'article de @ OlivierGrégoire pour une solution beaucoup plus courte
Un port direct de la réponse de TFeld . Prend l'entrée en radians.
Essayez-le en ligne!
Utilisation de l'infâme
with()
, 85 octetsMerci à @ l4m2 pour avoir économisé 6 octets
Essayez-le en ligne!
la source
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 octets SBCSFonction tacite anonyme. Prend {ϕ₁, λ₁} comme argument de gauche et {ϕ₂, λ₂} comme argument de droite.
Utilise la formule 2 r √ (sin² ( (ϕ₁-ϕ₂) ⁄ 2 ) + cos ϕ₁ cos ϕ₂ sin² ( (λ₁ - λ₂) ⁄ 2 ))
Essayez-le en ligne! (la
r
fonction convertit les degrés en radians),¨
concaténer les éléments correspondants; {{ϕ₁, ϕ₂}, {λ₁, λ₂}}⊃
choisissez le premier; {ϕ₁, ϕ₂}∘
puis2×.○
produit de leurs cosinus; cos ϕ₁ cos ϕ₂lit. point "produit" mais avec sélecteur de fonction trig (2 est cosinus) au lieu de multiplication et fois au lieu de plus
1,
ajouter 1 à cela; {1, cos ϕ₁ cos ϕ₂}(
…)×
Multipliez cela par le résultat de l'application de la fonction suivante à {ϕ₁, λ₁} et {ϕ₂, λ₂}:-
leurs différences; {ϕ₁ - ϕ₂, λ₁ - λ₂}2÷⍨
divisez cela par 2; { (ϕ₁ - ϕ₂) ⁄ 2 , (λ₁ - λ₂) ⁄ 2 }1○
sinus de cela; {sin ( (ϕ₁ - ϕ₂) ⁄ 2 ), sin ( (λ₁ - λ₂) ⁄ 2 )}×⍨
carré qui (lit. auto-multiplié); {sin² ( (ϕ₁ - ϕ₂) ⁄ 2 ), sin² ( (λ₁-λ₂) ⁄ 2 )}Nous avons maintenant {sin² ( (ϕ₁ - ϕ₂) ⁄ 2 ), cos ϕ₁ cos ϕ₂ sin² ( (λ₁ - λ₂) ⁄ 2 )}
1⊥
somme que (lit. évaluer en base-1); sin² ( (ϕ₁-ϕ₂) ⁄ 2 ) + cos ϕ₁ cos ϕ₂ sin² ( (λ₁ - λ₂) ⁄ 2 ).5*⍨
racine carrée de cela (lit. élever cela à la puissance d'un demi)¯1○
arcsinus de cela3474×
multiplier cela par ceLa fonction permettant d'autoriser la saisie en degrés est:
÷180
argument divisé par 180○
multiplier par πla source
Python 2 , 95 octets
Essayez-le en ligne!
Prend l'entrée en radians.
Ancienne version, avant que les E / S ne soient relâchées: prend l'entrée en degrés entiers et renvoie une dist arrondie
Python 2 , 135 octets
Essayez-le en ligne!
la source
int
etround
comme les décimales sont autorisées en sortie, vous pouvez également éviter la conversion en radians car les entrées en radians sont également autoriséesJava 8,
113928882 octetsLes entrées
a,b,c,d
sontϕ1,λ1,ϕ2,λ2
en radians.-21 octets en utilisant la formule plus courte de @miles .
-4 octets grâce à @ OlivierGrégore car je l'ai toujours utilisé
{Math m=null;return ...;}
avec tous lesMath.
asm.
, au lieu de laisser tomber lereturn
et d'utiliserMath
directement.-6 octets en utilisant la formule plus courte de @Neil .
Essayez-le en ligne.
Explication:
la source
(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 octetsPas nécessairement tout à fait aussi précis que les autres réponses, mais garçon, je me suis amusé avec celle-ci. Permettez-moi de développer.
Alors que dans la plupart des langues, ce défi est assez simple, Japt a la malheureuse propriété qu'il n'y a pas intégré pour ni arcsine ni arccosine. Bien sûr, vous pouvez intégrer Javascript dans Japt, mais ce serait toujours le contraire du Feng Shui.
Tout ce que nous avons à faire pour surmonter cette nuisance mineure, c'est l'arc cosinus approximatif et nous sommes prêts à partir!
La première partie est tout ce qui est introduit dans l'arc cosinus.
Le résultat est implicitement stocké
U
pour être utilisé ultérieurement.Après cela, nous devons trouver une bonne approximation pour l'arccosine. Puisque je suis paresseux et pas très bon en mathématiques, nous allons évidemment simplement le forcer brutalement.
Nous aurions pu utiliser un nombre important pour la résolution du générateur, les tests manuels ont montré qu'il
7!
était suffisamment grand tout en étant raisonnablement rapide.Prend l'entrée en radians, sort des nombres non arrondis.
Rasé cinq octets grâce à Oliver .
Essayez-le en ligne!
la source
(
dansMc(X-V
. Étant donné que le code de caractère1737
n'est pas ISO-8859-1, il passe à UTF-8, ce qui coûte plus cher. Vous pouvez à la place utiliser le code char pour173
+7
. ethproductions.github.io/japt/?v=1.4.5&code=I603&input=,
suitToMP
:-)Haskell ,
68 66 5251 octetsEssayez-le en ligne!
-1 octet grâce à BMO
la source
Rubis ,
87 7069 octetsEssayez-le en ligne!
Maintenant en utilisant la méthode de Neil, merci à Kevin Cruijssen.
la source
->a,b,c,d{include Math;1737*acos(cos(a-c)+cos(a)*cos(c)*(cos(d-b)-1))}
Gelée ,
23 2218 octets-4 octets grâce aux miles (utilisation
{
et}
utilisation de leur formule .Une fonction dyadique acceptant
[ϕ1, ϕ2,]
à gauche et[λ1, λ2]
à droite en radians qui renvoie le résultat (en virgule flottante).Essayez-le en ligne!
Le mien ... (a également enregistré un octet ici en utilisant un
{
)Essayez-le en ligne
la source
;I}ÆẠP+ÆSP${ÆA×⁽£ġ
{
et}
ils ne font jamais ce à quoi je m'attendais. Cela ne veut-il pas dire que je peux faire l'inverse en 17?!{
et il}
suffit de créer une dyade à partir d'une monade. Une vue similaire pourrait êtreP{ -> ḷP¥
. Pourrait être bon d'ajouter un composant (à partir de J) rapide pour faire quelque chose commex (P+$) y -> (P x) + (P y)
qui peut enregistrer un octet ou deux dans des situations similaires.MATLAB avec Mapping Toolbox, 26 octets
Fonction anonyme qui prend les quatre entrées comme un tableau de cellules, dans le même ordre que celui décrit dans le défi.
Notez que cela donne des résultats exacts (en supposant que le rayon de la Lune est de 1737 km), car
1737/180
égal9.65
.Exemple exécuté dans Matlab R2017b:
la source
Python 3, 79 octets
TIO n'a pas geopy.py
la source
APL (Dyalog Unicode) , 29 octets SBCS
Programme complet. Demande stdin pour {ϕ₁, ϕ₂} puis pour {λ₁, λ₂}. Imprime à stdout.
Utilise la formule r acos (sin ϕ₁ sin ϕ₂ + cos (λ₂ - λ₁) cos ϕ₁ cos ϕ₂)
Essayez-le en ligne! (la
r
fonction convertit les degrés en radians)⎕
invite pour {ϕ₁, ϕ₂}1 2∘.○
Application de fonction trigonométrique cartésienne; {{sin ϕ₁, sin ϕ₂}, {cos ϕ₁, cos ϕ₂}}×/
produits rangés; {sin ϕ₁ sin ϕ₂, cos ϕ₁ cos ϕ₂}(
…)×@2
Au deuxième élément, multipliez ce qui suit par cela:⎕
invite pour {λ₁, λ₂}-/
différence entre ceux-ci; λ₁ - λ₂2○
cosinus de cela; cos (λ₁ - λ₂)Nous avons maintenant {sin ϕ₁ sin ϕ₂, cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂}
+/
somme; sin ϕ₁ sin ϕ₂ + cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂¯2○
cosinus de cela; cos (sin ϕ₁ sin ϕ₂ + cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂)1737×
multipliez r par cela; 1737 cos (sin ϕ₁ sin ϕ₂ + cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂)La fonction permettant d'autoriser la saisie en degrés est:
÷180
argument divisé par 180○
multiplier par πla source
C (gcc) ,
100886564 octets88 → 65 en utilisant la formule de @miles
65 → 64 en utilisant la formule de @ Neil
Essayez-le en ligne!
la source
-lm
indicateur du compilateur.Excel, 53 octets
Utilisation de la formule de @ Neil. Entrée en radians.
la source
Homard , 66 octets
Utilise la formule des miles, mais la saisie est en degrés. Cela ajoute une étape supplémentaire de conversion en radians avant de multiplier par rayon.
la source
Python 3 ,
119103 octetsCela utilise des degrés.
Essayez-le en ligne!
la source
1737*acos(cos(a-A)+cos(a)*cos(A)*(cos(O-o)-1))
PHP , 88 octets
Port d' Oliver réponse
Essayez-le en ligne!
la source
SmileBASIC, 60 octets
la source