Diberikan lintang / bujur dua titik di Bulan (lat1, lon1)
dan (lat2, lon2)
, hitung jarak antara dua titik dalam kilometer, dengan menggunakan rumus apa pun yang memberikan hasil yang sama dengan rumus haversine.
Memasukkan
- Empat nilai integer
lat1, lon1, lat2, lon2
dalam derajat (sudut) atau - empat nilai desimal
ϕ1, λ1, ϕ2, λ2
dalam radian.
Keluaran
Jarak dalam kilometer antara dua titik (desimal dengan presisi atau bilangan bulat bulat).
Formula Haversine
dimana
r
adalah jari-jari bola (anggap jari-jari Bulan adalah 1.737 km),ϕ1
lintang titik 1 dalam radianϕ2
lintang titik 2 dalam radianλ1
bujur titik 1 dalam radianλ2
bujur titik 2 dalam radiand
adalah jarak melingkar antara dua titik
(sumber: https://en.wikipedia.org/wiki/Haversine_formula )
Formula lain yang mungkin
d = r * acos(sin ϕ1 sin ϕ2 + cos ϕ1 cos ϕ2 cos(λ2 - λ1))
@miles rumus ' .d = r * acos(cos(ϕ1 - ϕ2) + cos ϕ1 cos ϕ2 (cos(λ2 - λ1) - 1))
@Neil formula .
Contoh di mana input adalah derajat dan output sebagai integer bulat
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
Aturan
- Input dan output dapat diberikan dalam format apa pun yang nyaman .
- Tentukan dalam jawaban apakah input dalam derajat atau radian .
- Tidak perlu menangani nilai lintang / bujur yang tidak valid
- Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
- Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online sehingga orang lain dapat mencoba kode Anda!
- Celah standar dilarang.
- Ini adalah kode-golf sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
code-golf
math
geometry
trigonometry
mdahmoune
sumber
sumber
d = r * acos( sin ϕ1 sin ϕ2 + cos ϕ1 cos ϕ2 cos(λ2 - λ1) )
manar = 1737
Jawaban:
Bahasa Wolfram (Mathematica) , 48 byte
Cobalah online!
Gunakan rumus di
d = r * acos( sin ϕ1 sin ϕ2 + cos ϕ1 cos ϕ2 cos(λ2 - λ1) )
manar = 1737
sumber
R + geosphere ,
5447 bytesCobalah online!
Mengambil input sebagai vektor 2-elemen
longitude,latitude
dalam derajat. TIO tidak memilikigeosphere
paket tetapi yakinlah bahwa ia mengembalikan hasil yang identik dengan fungsi di bawah ini.Terima kasih kepada Jonathan Allan karena telah memangkas 7 byte.
R , 64 byte
Cobalah online!
Mengambil 4 input seperti dalam kasus uji, tetapi dalam radian bukan derajat.
sumber
e3
dan/1000
benar-benar diperlukan?JavaScript (Node.js) , 65 byte
Cobalah online!
Berdasarkan jawaban Kevin Cruijssen, komentar Miles dan Neil, dan atas permintaan Arnauld.
sumber
JavaScript (ES7), 90 byte
Catatan: lihat posting @ OlivierGrégoire untuk solusi yang jauh lebih pendek
Port langsung dari jawaban TFeld . Mengambil input dalam radian.
Cobalah online!
Menggunakan yang terkenal
with()
, 85 byteTerima kasih kepada @ l4m2 untuk menghemat 6 byte
Cobalah online!
sumber
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 SBCSFungsi diam-diam anonim. Membawa {ϕ₁, λ₁} sebagai argumen kiri dan {ϕ₂, λ₂} sebagai argumen benar.
Menggunakan rumus 2 r √ (sin² ( (ϕ₁-ϕ₂) ⁄ 2 ) + cos ϕ₁ cos ϕ₂ sin² ( (λ₁ - λ₂) ⁄ 2 ))
Cobalah online! (
r
fungsi mengubah derajat ke radian),¨
menggabungkan elemen yang sesuai; {{ϕ₁, ϕ₂}, {λ₁, λ₂}}⊃
pilih yang pertama; {ϕ₁, ϕ₂}∘
kemudian2×.○
produk dari cosinus mereka; cos ϕ₁ cos ϕ₂menyala dot "produk" tetapi dengan selektor fungsi trigonometri (2 adalah cosinus) alih-alih perkalian dan kali bukan plus
1,
tambahkan 1 untuk itu; {1, cos ϕ₁ cos ϕ₂}(
...)×
kalikan itu dengan hasil menerapkan fungsi berikut ke {ϕ₁, λ₁} dan {ϕ₂, λ₂}:-
perbedaan mereka; {ϕ₁ - ϕ₂, λ₁ - λ₂}2÷⍨
bagi dengan 2; { (ϕ₁ - ϕ₂) ⁄ 2 , (λ₁ - λ₂) ⁄ 2 }1○
sinus itu; {sin ( (ϕ₁ - ϕ₂) ⁄ 2 ), sin ( (λ₁ - λ₂) ⁄ 2 )}×⍨
kuadrat itu (lit. memperbanyak diri); {sin² ( (ϕ₁ - ϕ₂) ⁄ 2 ), sin² ( (λ₁-λ₂) ⁄ 2 )}Sekarang kita memiliki {sin² ( (ϕ₁ - ϕ₂) ⁄ 2 ), cos ϕ₁ cos ϕ₂ sin² ( (λ₁ - λ₂) ⁄ 2 )}
1⊥
jumlah itu (lit. evaluasi dalam basis-1); sin² ( (ϕ₁-ϕ₂) ⁄ 2 ) + cos ϕ₁ cos ϕ₂ sin² ( (λ₁ - λ₂) ⁄ 2 ).5*⍨
akar kuadrat itu (lit. naikkan itu ke kekuatan setengah)¯1○
arcsine itu3474×
kalikan dengan iniFungsi untuk memungkinkan input dalam derajat adalah:
÷180
argumen dibagi 180○
kalikan dengan πsumber
Python 2 , 95 byte
Cobalah online!
Mengambil input dalam radian.
Versi lama, sebelum i / o kendor: Mengambil input sebagai derajat bilangan bulat, dan mengembalikan dist bulat
Python 2 , 135 byte
Cobalah online!
sumber
int
danround
karena desimal diizinkan sebagai output, Anda juga dapat menghindari konversi ke radian karena input sebagai radian juga diperbolehkanJava 8,
113928882 byteInput
a,b,c,d
yangϕ1,λ1,ϕ2,λ2
dalam radian.-21 byte menggunakan formula pendek @miles .
-4 byte berkat @ OlivierGrégore karena saya masih digunakan
{Math m=null;return ...;}
dengan setiapMath.
sebagaim.
, bukan menjatuhkanreturn
dan menggunakanMath
langsung.-6 byte menggunakan @ Neil rumus 's lebih pendek .
Cobalah online.
Penjelasan:
sumber
(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 byteTidak harus setepat jawaban yang lain, tetapi anak laki-laki saya bersenang-senang dengan yang satu ini. Izinkan saya untuk menjelaskan.
Sementara di sebagian besar bahasa, tantangan ini cukup mudah, Japt memiliki properti yang disayangkan bahwa tidak ada built-in untuk arcsine maupun arccosine. Tentu, Anda dapat menanamkan Javascript di Japt, tapi itu akan menjadi kebalikan dari Feng Shui.
Yang harus kita lakukan untuk mengatasi gangguan kecil ini hanyalah perkiraan arccosine dan kita baik-baik saja!
Bagian pertama adalah segala sesuatu yang dimasukkan ke dalam arccosine.
Hasilnya secara implisit disimpan
U
untuk digunakan nanti.Setelah itu, kita perlu menemukan perkiraan yang bagus untuk arccosine. Karena saya malas dan tidak pandai matematika, kami jelas hanya akan memaksakannya.
Kami dapat menggunakan sejumlah besar untuk resolusi generator, pengujian manual menunjukkan
7!
cukup besar sementara cukup cepat.Mengambil input sebagai radian, menghasilkan angka yang tidak dikelilingi.
Dicukur lima byte berkat Oliver .
Cobalah online!
sumber
(
diMc(X-V
. Karena char-code untuk1737
bukan ISO-8859-1, ia beralih ke UTF-8, yang harganya lebih mahal. Anda bisa menggunakan char-code untuk173
+7
. ethproductions.github.io/japt/?v=1.4.5&code=I603&input=,
setelahToMP
:-)Haskell ,
68 66 5251 byteCobalah online!
-1 byte terima kasih kepada BMO
sumber
Ruby ,
87 7069 byteCobalah online!
Sekarang menggunakan metode Neil, terima kasih kepada Kevin Cruijssen.
sumber
->a,b,c,d{include Math;1737*acos(cos(a-c)+cos(a)*cos(c)*(cos(d-b)-1))}
Jelly ,
23 2218 byte-4 byte berkat mil (menggunakan
{
dan}
saat menggunakan formula mereka .Fungsi diadik yang menerima
[ϕ1, ϕ2,]
di sebelah kiri dan[λ1, λ2]
di kanan dalam radian yang mengembalikan hasilnya (sebagai titik mengambang).Cobalah online!
Milik saya ... (juga menyimpan satu byte di sini dengan menggunakan a
{
)Cobalah online
sumber
;I}ÆẠP+ÆSP${ÆA×⁽£ġ
{
dan}
mereka tidak pernah melakukan apa yang saya harapkan. Bukankah itu berarti saya bisa melakukan sebaliknya di 17 ?!{
dan}
hanya membuat angka dua dari monad. Pandangan serupa mungkinP{ -> ḷP¥
. Mungkin baik untuk menambahkan menulis (dari J) cepat untuk melakukan sesuatu sepertix (P+$) y -> (P x) + (P y)
yang dapat menyimpan satu atau dua byte dalam situasi yang sama.MATLAB dengan Mapping Toolbox, 26 byte
Fungsi anonim yang mengambil empat input sebagai array sel, dalam urutan yang sama seperti yang dijelaskan dalam tantangan.
Perhatikan bahwa ini memberikan hasil yang tepat (dengan asumsi bahwa jari-jari Bulan adalah 1.737 km), karena
1737/180
sama dengan9.65
.Contoh dijalankan di Matlab R2017b:
sumber
Python 3, 79 byte
TIO tidak memiliki geopy.py
sumber
APL (Dyalog Unicode) , 29 byte SBCS
Program lengkap. Anjurkan stdin untuk {ϕ₁, ϕ₂} dan kemudian untuk {λ₁, λ₂}. Mencetak ke stdout.
Menggunakan rumus r acos (sin ϕ₁ sin ϕ₂ + cos (λ₂ - λ₁) cos ϕ₁ cos ϕ₂)
Cobalah online! (
r
fungsi mengubah derajat ke radian)⎕
prompt untuk {ϕ₁, ϕ₂}1 2∘.○
Aplikasi fungsi trigonometri Cartesian; {{sin ϕ₁, sin ϕ₂}, {cos ϕ₁, cos ϕ₂}}×/
produk bijaksana; {sin ϕ₁ sin ϕ₂, cos ϕ₁ cos ϕ₂}(
...)×@2
pada elemen kedua, gandakan yang berikut dengan itu:⎕
prompt untuk {λ₁, λ₂}-/
perbedaan antara mereka; λ₁ - λ₂2○
cosinus itu; cos (λ₁ - λ₂)Sekarang kita memiliki {sin ϕ₁ sin ϕ₂, cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂}
+/
jumlah; sin ϕ₁ sin ϕ₂ + cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂¯2○
cosinus itu; cos (sin ϕ₁ sin ϕ₂ + cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂)1737×
kalikan r dengan itu; 1737 cos (sin ϕ₁ sin ϕ₂ + cos (λ₁ - λ₂) cos ϕ₁ cos ϕ₂)Fungsi untuk memungkinkan input dalam derajat adalah:
÷180
argumen dibagi 180○
kalikan dengan πsumber
C (gcc) ,
100886564 byte88 → 65 menggunakan formula @miles '65
→ 64 menggunakan formula @ Neil
Cobalah online!
sumber
-lm
flag compiler.Excel, 53 byte
Menggunakan rumus @ Neil. Masukan dalam radian.
sumber
Lobster , 66 byte
Menggunakan rumus miles, tetapi input dalam derajat. Ini menambahkan langkah ekstra konversi ke radian sebelum dikalikan dengan jari-jari.
sumber
Python 3 ,
119103 byteIni menggunakan derajat.
Cobalah online!
sumber
1737*acos(cos(a-A)+cos(a)*cos(A)*(cos(O-o)-1))
PHP , 88 byte
Port of Oliver menjawab
Cobalah online!
sumber
SmileBASIC, 60 byte
sumber