Jarak antara dua titik dalam ruang n-dimensi


22

Ini satu lagi sederhana:

Tantangan

Diberi dua titik dalam ruang n-dimensi, menghasilkan jarak di antara mereka, juga disebut jarak Euclidean.

  • Koordinat akan menjadi bilangan rasional; satu-satunya batasan adalah batasan bahasa Anda.
  • Dimensi terendah adalah 1, tertinggi adalah apa pun yang bisa ditangani oleh bahasa Anda
  • Anda dapat mengasumsikan bahwa kedua titik tersebut memiliki dimensi yang sama dan tidak akan ada input kosong.
  • Jarak harus benar ke setidaknya 3 tempat desimal. Jika bahasa Anda tidak mendukung angka floating point, keluarkan seluruh nomor terdekat.

Aturan

  • Seperti biasa, fungsi atau program lengkap diizinkan.
  • Masukan dapat diambil dari argumen STDIN, baris perintah atau fungsi.
  • Format input terserah Anda, tentukan yang mana yang Anda gunakan dalam jawaban Anda.
  • Output dapat diberikan dengan mencetak ke stdout atau mengembalikan nilai.
  • Ini adalah sehingga byte-count terendah akan menang! Dalam kasus seri, jawaban sebelumnya menang.

Uji kasus

Setiap titik diwakili oleh daftar panjang n.

[1], [3] -> 2
[1,1], [1,1] -> 0
[1,2], [3,4] -> 2.82842712475
[1,2,3,4], [5,6,7,8] -> 8
[1.5,2,-5], [-3.45,-13,145] -> 150.829382085
[13.37,2,6,-7], [1.2,3.4,-5.6,7.89] -> 22.5020221314

Selamat Coding!


16
Saya akan mencoba Brainfuck. Mari kita lihat apa monster mengerikan keluar.
YoYoYonnY

Saya menganggap Anda maksud jarak Euclidean?
flawr

3
@ flawr Yap, tepatnya. Hanya ingin menjaga judul tetap sederhana, karena tidak semua orang mungkin tahu apa itu pada pandangan pertama. Bisa pasti menulis itu di tantangan tho :)
Denker

@ DenkerAffe apakah boleh mengembalikan jarak yang dikuadratkan jika "bahasa pemrograman Anda tidak mendukung floating point"? Ini akan membuat program brainfuck saya jauh lebih akurat (Kalau tidak, saya harus menerapkan semacam algoritma estimasi).
YoYoYonnY

2
@ DenkerAffe Saya pikir aman untuk mengatakan bahwa brainfuck tidak akan pernah memenangkan kode golf. Tapi ini hanya untuk bersenang-senang :)
YoYoYonnY

Jawaban:


26

MATL , 2 byte

ZP

Cobalah online !

The ZPfunction (sesuai dengan MATLAB pdist2) menghitung semua jarak berpasangan antara dua set poin, menggunakan jarak Euclidean secara default. Setiap set poin adalah sebuah matriks, dan setiap titik adalah sebuah baris. Dalam hal ini menghasilkan hasil tunggal, yaitu jarak antara dua titik.


7
Tidak mungkin ini nyata
Martijn

6
Saya dengan sabar menunggu jawaban MATL byte tunggal yang tak terhindarkan;)
Andras Deak

2
Pernah mendengar bahasa-bahasa tersebut sedangkan poin utama dari bahasa ini adalah untuk memecahkan masalah Golf Code yang tidak jelas? Ini terdengar persis seperti itu. Membuat saya bertanya-tanya apakah bahasa esoteris ada untuk ini.
Lawful Lazy

1
Ini jelas menempatkan uang di mana mulut itu berada. Pekerjaan bagus Luis!
rayryeng

1
Fungsi pdist2 benar-benar mengubah hidup saya ketika saya menemukannya ...
Lui

15

MATL, 4.0 3 byte

Terima kasih atas -1 oleh @AndrasDeak!

-Zn

Membaca dua vektor (melalui input implisit yang diminta oleh -) lalu mengurangkannya dan menghitung norma perbedaannya dengan Zn.

Cobalah secara Online!


10
Tolong mulai pemilihan besok, saya sudah naik motor hari ini.
flawr

3
Terlambat ... Kamu harus naik perahu lagi: P
Denker

1
Simpan beberapa upvotes untuk saya :-P
Luis Mendo

1
@DenkerAffe tidak pernah mempercayai pemburu hadiah.
Andras Deak

1
Pemburu hadiah ... kita tidak membutuhkan sampah itu
Luis Mendo

12

Pyth, 2 byte

.a

.a - L2 norma perbedaan vektor A [0] dan A [1].

Secara harfiah fungsi yang melakukan masalah ini

Coba di sini.


10

Jelly , 4 byte

_²S½

Cobalah online!

Bagaimana itu bekerja

_²S½    Main link. Left input: A (list). Right input: B (list).

_       Subtract B from A, element by element.
 ²      Square all differences.
  S     Add all squares.
   ½    Take the square root of the sum.

1
Astaga. Hanya 4 byte dengan Jelly. Saya tidak bisa melihat bagaimana orang bisa melakukan lebih baik dari itu.
Logic Knight

7
@CarpetPython Rupanya MATL bisa ...
Denker

1
@CarpetPython And Pyth
isaacg

9

Mathematica, 11 byte

Norm[#-#2]&

Input sebagai dua daftar, output sebagai angka. Jika input tepat (bilangan bulat, rasional, dll.) Output akan tepat juga. Jika input berisi angka titik-mengambang, output akan menjadi float juga.


6
EuclideanDistanceakan bekerja dengan baik juga ... jika namanya tidak terlalu lama! Kalau saja ada "MATL for Mathematica" ini akan menjadi byte tunggal =)
2012rcampion

1
Saya sedang mengerjakan bahasa berbasis matematika> :)
Greg Martin

6

Oktaf, 15 byte

@(x,y)norm(x-y)

Contoh:

octave:1> d=@(x,y)norm(x-y);
octave:2> d([13.37,2,6,-7], [1.2,3.4,-5.6,7.89])
ans =  22.502


6

Haskell, 46 byte

d :: Floating c => [c] -> [c] -> c
d a=sqrt.sum.map((^2).uncurry(flip(-))).zip a

Haskell, 35 byte (By @nimi)

d :: Float c => [c] -> [c] -> c
d a=sqrt.sum.zipWith(((^2).).(-))a

Haskell, 31 byte

Seperti jawaban Scala ini , mengambil input sebagai urutan tupel

<hack>

d :: Float c => [(c,c)] -> c
d=sqrt.sum.map$(^2).uncurry(-)

</hack>

Contoh:

Prelude> d [1] [3]
2.0
Prelude> d [1,1] [1,1]
0.0
Prelude> d [1,2,3,4] [5,6,7,8]
8.0
Prelude> d [1.5,2,-5] [-3.45,-13,145]
150.82938208452623
Prelude> d [13.37,2,6,-7] [1.2,3.4,-5.6,7.89]
22.50202213135522

13
uncurry ಠ_ಠ Saat memasak saya terkadang ingin memiliki fungsi unsalt
flawr


2
map+ uncurry+ zipJarang terbayar, penggunaan zipWith: d a=sqrt.sum.zipWith(((^2).).(-))a.
nimi

1
Anda tidak dapat menyimpan beberapa byte lagi dengan pengurangan eta?
jk.

@jk. Tidak yakin ... Saya rasa tidak, karena (.)selalu mengembalikan fungsi yang hanya membutuhkan satu argumen ... Saya pikir Anda dapat melakukan sesuatu seperti (.). (.), Tapi itu tidak terlalu sepadan.
YoYoYonnY

5

APL, 14 11 byte

.5*⍨(+/-×-)

Ini adalah fungsi kereta diad yang membawa vektor di kiri dan kanan dan mengembalikan norma Euclidean dari perbedaan mereka.

Penjelasan:

       -×-)  ⍝ Squared differences
    (+/      ⍝ Sum them
.5*⍨         ⍝ Take the square root

Coba di sini

Disimpan 3 byte berkat Dennis!


.5*⍨(+/-×-)menghemat beberapa byte.
Dennis

3
Bisakah ini benar-benar menjadi yang pertama kalinya saya melihat kode APL berkomentar? Itu simbol! Saya selalu menemukan karakter APL di set aneh, tapi saya tidak pernah menyadari jari zombie terpotong-potong adalah penanda komentar. ;-)
Level River St

@steveverrill Saya <s> mengomentari </s> memasukkan jari zombie ke hampir semua kiriman APL saya di sini. ¯ \ _ (ツ) _ / ¯
Alex A.

@AlexA. Penjajaran yang buruk (karena karakter APL non-monospace) terjadi untuk memberikan penampilan seperti tangan saat ini. Anda telah menurunkannya dari 4 baris menjadi 3, dan merusak efeknya: -S Jawaban Anda ini memiliki 4 baris, tetapi tidak memiliki codegolf penampilan tangan-seperti.stackexchange.com/a/70595/15599 Lagi pula, Saya suka bahwa Anda masih memiliki satu karakter yang tersenyum dalam kode Anda.
Level River St

4

J, 9 byte

+&.*:/-/>

Ini adalah fungsi yang mengambil satu set koordinat dari yang lain ( -/>), dan kemudian melakukan jumlah di +bawah &.kuadrat *:.

Input harus dalam format di x y z;a b cmana x y zset koordinat pertama Anda dan a b cyang lainnya.


Karena input selalu panjang yang sama, Anda dapat menjatuhkan >dan menentukan input yang harus diberikan x y z,:a b c.
Bolce Bussiere

4

Java, 130 117 114 107 105 byte

Ini adalah solusi yang jelas. Saya biasanya tidak bermain golf di Jawa, tetapi saya ingin tahu apakah Jawa bisa mengalahkan versi Brainfuck. Sepertinya saya tidak melakukan pekerjaan dengan baik .. Mungkin orang bisa menggunakan Map / Reduce baru dari Java 8 untuk menghemat beberapa byte.

Terima kasih kepada @ flawr (13 bytes), @KevinCruijssen (9 bytes) dan @DarrelHoffman (3 bytes)!

Golf:

double d(float[]a,float[]b){float x=0,s;for(int i=0;i<a.length;x+=s*s)s=a[i]-b[i++];return Math.sqrt(x);}

Tidak Disatukan:

double d(float[] a, float[] b) {
  float x=0,s;

  for(int i=0; i<a.length; x+=s*s)
    s = a[i] - b[i++];

  return Math.sqrt(x);
}

2
Anda tentu dapat mempersingkat nama fungsi menjadi satu karakter. The forLoop dikompresi kedouble x=0,s;for(int i=0;++i<a.length;s=a[i]-b[i],x+=s*s);
flawr

1
Ini adalah cara yang besar. Lihat saran flawr untuk loop. Menggunakan Java 8 lambda, ini dapat direduksi menjadi: double[]a,b->{double x=0,s;for(int i=0;++i<a.length;s=a[i]-b[i],x+=s*s);return Math.sqrt(x);}dengan total 93 byte.
Addison Crump

1
Anda dapat menghapus public di depan metode untuk menyimpan 7 byte, dan Anda juga dapat menempatkan di x+=s*sluar for-loop sehingga Anda tidak perlu koma (yaitu for(int i=-1;++i<a.length;s=a[i]-b[i])x+=s*s;) untuk -1 byte.
Kevin Cruijssen

1
@Bruce_Forte Ah, saya mengerti .. Dalam hal ini Anda dapat menggunakan ini: for(int i=0;i<a.length;x+=s*s)s=a[i]-b[i++];(dan saya juga mengubah -1ke 0untuk byte tambahan)
Kevin Cruijssen

1
@KevinCruijssen Benar. Saya suka perubahan 0dengan menggunakan aturan prioritas operator! Terima kasih telah menyelamatkan saya banyak byte.
ბიმო

3

Julia, 16 byte

N(x,y)=norm(x-y)

Ini adalah fungsi yang menerima dua array dan mengembalikan norma Euclidean dari perbedaannya sebagai float.

Anda dapat memverifikasi semua kasus uji sekaligus online di sini .


Anda dapat menyimpan 3 byte dengan menggunakan operator sebagai nama fungsinya: Cobalah online!
sundar - Reinstate Monica

3

golflua , 43 karakter

\d(x,y)s=0~@i,v i(x)s=s+(v-y[i])^2$~M.q(s)$

Bekerja dengan menyebutnya sebagai

> w(d({1,1},{1,1}))
0
> w(d({1,2},{3,4}))
2.82842712475
> w (d({1,2,3,4},{5,6,7,8}))
8


Setara Lua akan

function dist(x, y)
    s = 0
    for index,value in ipairs(x)
       s = s + (value - y[index])^2
    end
    return math.sqrt(s)
end

3

Serius, 12 byte

,iZ`i-ª`MΣ√A

Cobalah online!

Penjelasan:

,iZ`i-ª`MΣ√A
,iZ           get input, flatten, zip
   `   `M     map:
    i-ª         flatten, subtract, square
         Σ√A  sum, sqrt, abs

2

Ruby, 52

->p,q{t=0;p.size.times{|i|t+=(p[i]-q[i])**2}
t**0.5}

Dalam program uji

f=->p,q{t=0;p.size.times{|i|t+=(p[i]-q[i])**2}
t**0.5}

p f[[1], [3]] # 2
p f[[1,1], [1,1]] # 0
p f[[1,2], [3,4]] # 2.82842712475
p f[[1,2,3,4], [5,6,7,8]] # 8
p f[[1.5,2,-5], [-3.45,-13,145]] # 150.829382085
p f[[13.37,2,6,-7], [1.2,3.4,-5.6,7.89]] # 22.5020221314

2

AppleScript, 241 239 byte

Ini adalah kode golf, tapi saya sudah memasukkan komentar dalam formulir --.

on a()    -- Calling for getting input
set v to{1}          -- Arbitrary placeholder
repeat until v's item-1=""       -- Repeat until no input is gathered
set v to v&(display dialog""default answer"")'s text returned   -- Add input to list
end      -- End the repeat
end      -- End the method
set x to a()   -- Set the array inputs
set y to a()
set z to 0     -- Sum placeholder
set r to 2     -- 2 is the first significant array index
repeat(count of items in x)-2     -- Loop through all but first and last of the array
set z to z+(x's item r-y's item r)^2    -- Add the square of the difference
end   -- End the repeat
z^.5  -- Return the square root of the sum

Ini menggunakan algoritma yang sama dengan sebagian besar program lain di sini.

jalankan sampel


2

Perl 6, 30 29 26 24 byte

{sqrt [+] ([Z-] $_)»²}

(Terima kasih @ b2gills untuk 2 byte lebih hilang)

pemakaian

my &f = {sqrt [+] (@^a Z-@^b)»²};

say f([1], [3]); # 2
say f([1,1], [1,1]); # 0
say f([1,2], [3,4]); # 2.82842712474619
say f([1,2,3,4], [5,6,7,8]); # 8
say f([1.5,2,-5], [-3.45,-13,145]); # 150.829382084526
say f([13.37,2,6,-7], [1.2,3.4,-5.6,7.89]); # 22.5020221313552

{sqrt [+] ([Z-] $_)»²}
Brad Gilbert b2gills

2

JavaScript ES7, 45 ES6, 37 byte

a=>Math.hypot(...a.map(([b,c])=>b-c))

Mengharapkan array pasangan koordinat, satu dari setiap vektor, misalnya [[1, 5], [2, 6], [3, 7], [4, 8]]. Jika itu tidak dapat diterima, maka untuk 42 byte:

(a,b)=>Math.hypot(...a.map((e,i)=>e-b[i]))

Mengharapkan dua array dengan panjang yang sama dengan dua vektor N-dimensi, mis [1, 2, 3, 4], [5, 6, 7, 8]. Sunting: Disimpan 3 byte berkat @ l4m2. (Juga, apakah tidak ada yang memperhatikan kesalahan ketik saya?)


Silakan tambahkan contoh tentang cara menjalankan fungsi ini termasuk spesifikasi format input, karena ini tidak jelas pada pandangan pertama.
Denker

@ DenkerAffe Maaf, setelah mengabaikan klausa itu, saya baru saja menggunakan format yang sama dengan contoh dan memang semua orang sebelumnya kepada saya pada saat itu.
Neil

a=>b=>Math.hypot(...a.map((t,i)=>t-b[i]))
l4m2

2

Python 2, 47 byte

Solusi lurus ke depan. Fungsi mengharapkan 2 poin sebagai urutan angka, dan mengembalikan jarak di antara mereka.

lambda a,b:sum((d-e)**2for d,e in zip(a,b))**.5

Contoh:

>>> f([13.37, 2, 6, -7], [1.2, 3.4, -5.6, 7.89])
22.50202213135522

Bekerja dalam Python3.6, tetapi mungkin tidak optimal.
SIGSTACKFAULT


1

Scala, 67 62 byte

def e(a:(Int,Int)*)=math.sqrt(a map(x=>x._2-x._1)map(x=>x*x)sum)

Membutuhkan input sebagai urutan / vektor dari var-arg tuple
Contoh:

scala> e((1, 5), (2, 6), (3, 7), (4, 8))
res1: Double = 8.0

1

C #, 72 byte

(float[]i,float[]n)=>System.Math.Sqrt(i.Zip(n,(x,y)=>(x-y)*(x-y)).Sum())

Solusi sederhana menggunakan Linq.


1

Sage, 35 byte

lambda a,b,v=vector:norm(v(a)-v(b))

Fungsi ini mengambil 2 daftar sebagai input dan mengembalikan ekspresi simbolik. Jarak dihitung dengan melakukan pengurangan vektor pada daftar dan menghitung norma Euclidean dari vektor yang dihasilkan.

Cobalah online


1

TI-Basic (TI-84 Plus CE), 15 byte

Prompt A,B
√(sum((LA-LB)2

TI-Basic adalah bahasa tokenized .

Meminta input sebagai dua daftar, dan mengembalikan jarak Euclidian di antara mereka Ans

Penjelasan:

Prompt A,B    # 5 bytes, Prompts for two inputs; if the user inputs lists:
           # they are stored in LA and LB
√(sum((LA-LB)2 # 10 bytes, Euclidian distance between points
           #(square root of (sum of (squares of (differences of coordinates))))

1

R, 4 byte

dist

Ini adalah fungsi bawaan untuk menghitung matriks jarak dari setiap matriks masukan. Default untuk jarak euclidean.

Contoh penggunaan:

> x=matrix(c(1.5,-3.45,2,-13,-5,145),2)
> x
      [,1] [,2] [,3]
[1,]  1.50    2   -5
[2,] -3.45  -13  145
> dist(x)
         1
2 150.8294

Jika Anda merasa kecewa karena ini built-in, maka ini versi non-built-in (atau setidaknya, ini kurang built-in ...) untuk 22 byte (dengan terima kasih kepada Giuseppe ):

pryr::f(norm(x-y,"F"))

Ini adalah fungsi anonim yang mengambil dua vektor sebagai input.


function(x,y)norm(x-y,"F")lebih pendek dari versi kedua Anda.
Giuseppe

1

Haskell, 32 byte

((sqrt.sum.map(^2)).).zipWith(-)

λ> let d = ((sqrt.sum.map(^2)).).zipWith(-)
λ> d [1] [3]
2.0
λ> d [1,1] [1,1]
0.0
λ> d [1,2] [3,4]
2.8284271247461903
λ> d [1..4] [5..8]
8.0
λ> d [1.5,2,-5] [-3.45,-13,145]
150.82938208452623
λ> d [13.37,2,6,-7] [1.2,3.4,-5.6,7.89]
22.50202213135522


@ Terima kasih atas perbaikannya. Setelah bermain-main, saya menemukan cara untuk menghapus 6 byte lagi (dengan menghapus mapdan tanda kurung).
Rodrigo de Azevedo

Saya minta maaf untuk campur tangan lagi, tetapi sqrt$sum$(^2)<$>zipWith(-)bukan fungsi anonim yang valid. Aturan yang mendasarinya sebenarnya cukup sederhana: Jika Anda dapat menulis f = <mycode>dan fsetelah itu melakukan tugas yang diperlukan, maka <mycode>adalah fungsi anonim yang valid. Dalam kasus Anda, Anda perlu menambahkan f p q = <mycode> p q, jadi <mycode>itu sendiri tidak valid.
Laikoni

1
@Laikoni Kamu benar. Saya mengedit jawaban saya dan menggunakan saran Angs. Jika Anda menemukan cara untuk mempersingkatnya, beri tahu saya.
Rodrigo de Azevedo

0

Python 3, 70 Karakter

Loop melalui, menemukan kuadrat dari perbedaan dan kemudian akar dari penjumlahan:

a=input()
b=input()
x=sum([(a[i]-b[i])**2 for i in range(len(a))])**.5

2
Jatuhkan beberapa lagi:sum([(x-y)**2 for x,y in zip(a,b)])**.5
Benjamin

0

Mathcad, byte

masukkan deskripsi gambar di sini

Menggunakan operator besaran vektor (nilai absolut) bawaan untuk menghitung ukuran perbedaan antara dua titik (dinyatakan sebagai vektor).


Ukuran golf Mathcad ditahan sampai saya mendapatkan (atau orang lain) untuk membuka diskusi tentang meta. Namun, cara terpendek (dengan asumsi bahwa input vektor titik tidak berkontribusi pada skor) adalah 3 "byte", dengan 14 byte untuk versi fungsional.



0

Ruby, 50 byte

Zip, lalu petakan / kurangi. Hampir tidak memunculkan jawaban Ruby lainnya dari @LevelRiverSt dengan 2 byte ...

->p,q{p.zip(q).map{|a,b|(a-b)**2}.reduce(:+)**0.5}

Cobalah online

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.