Dada a latitude / longitude de dois pontos na Lua (lat1, lon1)
e (lat2, lon2)
, calcule a distância entre os dois pontos em quilômetros, usando qualquer fórmula que dê o mesmo resultado que a fórmula de haversine.
Entrada
- Quatro valores inteiros
lat1, lon1, lat2, lon2
em graus (ângulo) ou - quatro valores decimais
ϕ1, λ1, ϕ2, λ2
em radianos.
Resultado
Distância em quilômetros entre os dois pontos (decimal com precisão ou número inteiro arredondado).
Fórmula de Haversine
Onde
r
é o raio da esfera (suponha que o raio da Lua seja 1737 km),ϕ1
latitude do ponto 1 em radianosϕ2
latitude do ponto 2 em radianosλ1
longitude do ponto 1 em radianosλ2
longitude do ponto 2 em radianosd
é a distância circular entre os dois pontos
(fonte: https://en.wikipedia.org/wiki/Haversine_formula )
Outras fórmulas possíveis
d = r * acos(sin ϕ1 sin ϕ2 + cos ϕ1 cos ϕ2 cos(λ2 - λ1))
@miles 'formula .d = r * acos(cos(ϕ1 - ϕ2) + cos ϕ1 cos ϕ2 (cos(λ2 - λ1) - 1))
A fórmula de @Neil .
Exemplo onde entradas são graus e saída como número inteiro arredondado
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
Regras
- A entrada e saída podem ser fornecidas em qualquer formato conveniente .
- Especifique na resposta se as entradas estão em graus ou radianos .
- Não há necessidade de lidar com valores inválidos de latitude / longitude
- Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
- Se possível, inclua um link para um ambiente de teste on-line para que outras pessoas possam experimentar seu código!
- As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
code-golf
math
geometry
trigonometry
mdahmoune
fonte
fonte
d = r * acos( sin ϕ1 sin ϕ2 + cos ϕ1 cos ϕ2 cos(λ2 - λ1) )
onder = 1737
Respostas:
Wolfram Language (Mathematica) , 48 bytes
Experimente online!
Usa a fórmula
d = r * acos( sin ϕ1 sin ϕ2 + cos ϕ1 cos ϕ2 cos(λ2 - λ1) )
em quer = 1737
fonte
Geosfera R + ,
5447 bytesExperimente online!
Recebe entrada como vetores de 2 elementos
longitude,latitude
em graus. O TIO não possui ogeosphere
pacote, mas tenha certeza de que ele retorna resultados idênticos à função abaixo.Agradecimentos a Jonathan Allan por remover 7 bytes.
R , 64 bytes
Experimente online!
Toma 4 entradas como nos casos de teste, mas em radianos, em vez de graus.
fonte
e3
e são/1000
realmente necessários?JavaScript (Node.js) , 65 bytes
Experimente online!
Baseado na resposta de Kevin Cruijssen, nos comentários de Miles e Neil e mediante solicitação de Arnauld.
fonte
JavaScript (ES7), 90 bytes
Nota: veja a publicação de @ OlivierGrégoire para uma solução muito mais curta
Uma porta direta da resposta do TFeld . Recebe entrada em radianos.
Experimente online!
Usando os infames
with()
85 bytesObrigado a @ l4m2 por salvar 6 bytes
Experimente online!
fonte
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 bytes SBCSFunção tácita anônima. Aceita {ϕ₁, λ₁} como argumento à esquerda e {ϕ₂, λ₂} como argumento à direita.
Usa a fórmula 2 r √ (sin² ( (ϕ₁-ϕ₂) ⁄ 2 ) + cos ϕ₁ cos ϕ₂ sin² ( (λ₁ - λ₂) ⁄ 2 ))
Experimente online! (a
r
função converte graus em radianos),¨
concatenar elementos correspondentes; {{ϕ₁, ϕ₂}, {λ₁, λ₂}}⊃
escolha o primeiro; {ϕ₁, ϕ₂}∘
então2×.○
produto de seus cossenos; cos ϕ₁ cos ϕ₂aceso. ponto "produto", mas com seletor de função trigonométrica (2 é cosseno) em vez de multiplicação e tempos em vez de mais
1,
acrescente 1 a isso; {1, cos ϕ₁ cos ϕ₂}(
…)×
Multiplique isso pelo resultado da aplicação da seguinte função em {ϕ₁, λ₁} e {ϕ₂, λ₂}:-
suas diferenças; {ϕ₁ - ϕ₂, λ₁ - λ₂}2÷⍨
divida isso por 2; { (ϕ₁ - ϕ₂) ⁄ 2 , (λ₁ - λ₂) ⁄ 2 }1○
seno disso; {sin ( (ϕ₁ - ϕ₂) ⁄ 2 ), sin ( (λ₁ - λ₂) ⁄ 2 )}×⍨
quadrado que (lit. se multiplica); {sin² ( (ϕ₁ - ϕ₂) ⁄ 2 ), sin² ( (λ₁-λ₂) ⁄ 2 )}Agora temos {sin² ( (ϕ₁ - ϕ₂) ⁄ 2 ), cos ϕ₁ cos ϕ₂ sin² ( (λ₁ - λ₂) ⁄ 2 )}
1⊥
soma isso (lit. avaliar na base-1); sin² ( (ϕ₁-ϕ₂) ⁄ 2 ) + cos ϕ₁ cos ϕ₂ sin² ( (λ₁ - λ₂) ⁄ 2 ).5*⍨
raiz quadrada disso (lit. elevar isso ao poder da metade)¯1○
arco disso3474×
multiplicar isso por esteA função para permitir entrada em graus é:
÷180
argumento dividido por 180○
multiplicar por πfonte
Python 2 , 95 bytes
Experimente online!
Recebe entrada em radianos.
Versão antiga, antes da liberação da E / S: recebe entrada como graus inteiros e retorna dist arredondado
Python 2 , 135 bytes
Experimente online!
fonte
int
eround
porque decimais são permitidos como saída, você também pode evitar a conversão para radianos porque insumos como radianos também são permitidosJava 8,
113928882 bytesAs entradas
a,b,c,d
estãoϕ1,λ1,ϕ2,λ2
em radianos.-21 bytes usando a fórmula mais curta de @miles .
-4 bytes graças a @ OlivierGrégore porque eu ainda usei
{Math m=null;return ...;}
com everyMath.
asm.
, em vez de largar oreturn
e usarMath
diretamente.-6 bytes usando a fórmula mais curta de @Neil .
Experimente online.
Explicação:
fonte
(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 bytesNão necessariamente tão preciso quanto as outras respostas, mas garoto, eu me diverti com essa. Permita-me elaborar.
Enquanto na maioria dos idiomas, esse desafio é bastante direto, Japt tem a propriedade lamentável de que não há embutido nem arcsine nem arccosine. Claro, você pode incorporar Javascript no Japt, mas isso seria o que sempre é o oposto do Feng Shui.
Tudo o que temos a fazer para superar esse pequeno incômodo é a arccosina aproximada e estamos prontos!
A primeira parte é tudo o que é introduzido na arccosina.
O resultado é armazenado implicitamente
U
para ser usado posteriormente.Depois disso, precisamos encontrar uma boa aproximação para a arccosina. Desde que eu sou preguiçoso e não tão bom com matemática, obviamente vamos forçá-lo à força bruta.
Poderíamos ter usado qualquer número grande para a resolução do gerador, o teste manual mostrou que
7!
é suficientemente grande e, ao mesmo tempo, razoavelmente rápido.Recebe a entrada como radianos, gera números não arredondados.
Raspou cinco bytes graças a Oliver .
Experimente online!
fonte
(
noMc(X-V
. Como o código de char para1737
não é ISO-8859-1, ele muda para UTF-8, que custa mais. Você pode usar o código de char para173
+7
. ethproductions.github.io/japt/?v=1.4.5&code=I603&input=,
seguinteToMP
:-)Haskell ,
68 66 5251 bytesExperimente online!
-1 byte graças ao BMO
fonte
Ruby ,
87 7069 bytesExperimente online!
Agora, usando o método de Neil, graças a Kevin Cruijssen.
fonte
->a,b,c,d{include Math;1737*acos(cos(a-c)+cos(a)*cos(c)*(cos(d-b)-1))}
Geléia ,
23 2218 bytes-4 bytes graças a milhas (use
{
e}
ao usar sua fórmula .Função diádica que aceita
[ϕ1, ϕ2,]
à esquerda e[λ1, λ2]
à direita em radianos que retorna o resultado (como ponto flutuante).Experimente online!
Meu ... (também salvou um byte aqui usando a
{
)Experimente online
fonte
;I}ÆẠP+ÆSP${ÆA×⁽£ġ
{
e}
eles nunca fazem o que eu esperava. Isso não significa que eu posso fazer o contrário em 17 ?!{
e}
apenas crie uma díade a partir de uma mônada. Uma visão semelhante pode serP{ -> ḷP¥
. Pode ser bom adicionar uma composição (de J) rapidamente para fazer algo como ox (P+$) y -> (P x) + (P y)
que pode salvar um ou dois bytes em situações semelhantes.MATLAB com caixa de ferramentas de mapeamento, 26 bytes
Função anônima que aceita as quatro entradas como uma matriz de células, na mesma ordem descrita no desafio.
Observe que isso fornece resultados exatos (supondo que o raio da Lua seja 1737 km), porque
1737/180
é igual9.65
.Exemplo de execução no Matlab R2017b:
fonte
Python 3, 79 bytes
O TIO não tem geopy.py
fonte
APL (Dyalog Unicode) , SBCS de 29 bytes
Programa completo. Solicita stdin para {ϕ₁, ϕ₂} e, em seguida, para {λ₁, λ₂}. Imprime em stdout.
Usa a fórmula r acos (sin ϕ₁ sin ϕ₂ + cos (λ₂ - λ₁) cos ϕ₁ cos ϕ₂)
Experimente online! (a
r
função converte graus em radianos)⎕
prompt para {ϕ₁, ϕ₂}1 2∘.○
Aplicação de função trigonométrica cartesiana; {{sin ϕ₁, sin ϕ₂}, {cos ϕ₁, cos ϕ₂}}×/
produtos em linha; {sin ϕ₁ sin ϕ₂, cos ϕ₁ cos ϕ₂}(
…)×@2
No segundo elemento, multiplique o seguinte por isso:⎕
prompt para {λ₁, λ₂}-/
diferença entre aqueles; λ₁ - λ₂2○
cosseno disso; cos (λ₁ - λ₂)Agora temos {sin ϕ₁ sin ϕ₂, cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂}
+/
soma; sen ϕ₁ sin ϕ₂ + cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂¯2○
cosseno disso; cos (sin ϕ₁ sin ϕ₂ + cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂)1737×
multiplique r por isso; 1737 cos (sin ϕ₁ sin ϕ₂ + cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂)A função para permitir entrada em graus é:
÷180
argumento dividido por 180○
multiplicar por πfonte
C (gcc) ,
100886564 bytes88 → 65 usando a fórmula de @miles
65 → 64 usando a fórmula de @ Neil
Experimente online!
fonte
-lm
sinalizador do compilador.Excel, 53 bytes
Usando a fórmula de @ Neil. Entrada em radianos.
fonte
Lagosta , 66 bytes
Usa a fórmula de milhas, mas a entrada é em graus. Isso adiciona uma etapa extra da conversão em radianos antes da multiplicação por raio.
fonte
Python 3 ,
119103 bytesIsso usa graus.
Experimente online!
fonte
1737*acos(cos(a-A)+cos(a)*cos(A)*(cos(O-o)-1))
PHP , 88 bytes
Resposta de Port of Oliver
Experimente online!
fonte
SmileBASIC, 60 bytes
fonte