N boyutlu uzayda iki nokta arasındaki mesafe


22

İşte basit bir tane daha:

Meydan okuma

N boyutlu bir uzayda iki nokta verildiğinde, aralarındaki mesafeyi, Öklid mesafesi olarak da adlandırılır.

  • Koordinatlar rasyonel sayılar olacaktır; tek sınırlar dilinizin kısıtlamalarıdır.
  • En düşük boyut 1, en yüksek dil ne kaldırabilirse
  • İki noktanın aynı boyutta olduğunu ve boş girdi olmayacağını varsayabilirsiniz.
  • Mesafe en az 3 ondalık basamağa kadar doğru olmalıdır. Diliniz kayan nokta sayılarını desteklemiyorsa, en yakın tam sayıyı verin.

kurallar

  • Her zamanki gibi, işlev veya tam programa izin verilir.
  • Giriş, STDIN, komut satırı veya işlev argümanlarından alınabilir.
  • Giriş biçimi size bağlıdır, cevabınızda hangisini kullandığınızı belirtin.
  • Çıktı stdout'a veya geri dönüş değerine yazdırılarak sağlanabilir.
  • Bu yani en düşük bayt sayma kazanır! Beraberlik durumunda, önceki cevap kazanır.

Test durumları

Her nokta, bir uzunluk listesi ile temsil edilir.

[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

Mutlu Kodlama!


16
Beynine bir şans vereceğim. Bakalım hangi korkunç canavar ortaya çıkıyor.
YoYoYonnY

Sanırım Öklid mesafesini mi kastediyorsunuz?
kusur

3
@flawr Yep, aynen. Sadece başlığı basit tutmak istedim çünkü herkes ilk bakışta bunun ne olduğunu bilemeyebilirdi. Bunu kesinlikle challange tho :) yazmak olabilir
Denker

@DenkerAffe eğer "programlama diliniz kayan noktaları desteklemiyorsa" aradaki mesafeyi döndürmek uygun mudur? Bu benim beynimi programımı çok daha doğru bir hale getirirdi (Aksi halde bir tür tahmin algoritması uygulamak zorunda kalacağım).
YoYoYonnY,

2
@DenkerAffe Beyin saldırısının asla kod golf kazanamayacağını söylemek güvenli olduğunu düşünüyorum . Ama yine de sadece eğlence için :)
YoYoYonnY

Yanıtlar:


26

MATL , 2 bayt

ZP

Çevrimiçi deneyin !

ZP(MATLAB en tekabül fonksiyonu pdist2) varsayılan olarak Öklid mesafe kullanarak, nokta iki takım arasındaki tüm ikili mesafeler hesaplar. Her nokta kümesi bir matristir ve her nokta bir satırdır. Bu durumda, iki nokta arasındaki mesafe olan tek bir sonuç üretir.


7
Bunun gerçek olması mümkün değil
Martijn

6
Kaçınılmaz tek bayt MATL cevabını sabırla bekliyorum;)
Andras Deak

2
Bu dilleri hiç duymamışken, dilin asıl amacı belirsiz Code Golf sorunlarını çözmek mi? Bu tam olarak öyle geliyor. Ezoterik dillerin tam olarak bunun için var olup olmadığını merak etmemi sağlıyor.
Kanuni Tembel

1
Bu kesinlikle parayı ağzına koyar. Güzel iş Luis!
rayryeng - Monica

1
Pdist2 işlevi bulduğumda hayatımı tam anlamıyla değiştirdi ...
Lui

15

MATL, 4.0 3 bayt

@AndrasDeak tarafından -1 için teşekkürler!

-Zn

İki vektör okur (bunun istediği örtük girdiyle -) daha sonra bunları çıkarır ve farklarının normunu hesaplar Zn.

Çevrimiçi Deneyin!


10
Lütfen yarın oyuna başlayın, bugün çoktan motorlaştım.
kusur,

3
Çok geç ... Yine motorlu
tekneye binmelisin

1
Benim için bazı promosyonlar kaydet :-P
Luis Mendo

1
@DenkerAffe asla ödül avcısına güvenmez.
Andras Deak

1
Ödül avcıları ... bu pisliğe ihtiyacımız yok
Luis Mendo

12

Pyth, 2 bayt

.a

.a - A [0] ve A [1] vektör farklarının L2 normu.

Kelimenin tam anlamıyla bu sorunu yapan bir işlev

Burada dene.


10

Jöle , 4 bayt

_²S½

Çevrimiçi deneyin!

Nasıl çalışır

_²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
Amanın. Jelly ile sadece 4 bayt. Birisinin bundan daha iyisini nasıl yaptığını göremiyorum.
Mantık Şövalye

7
@CarpetPython Anlaşılan MATL ...
Denker

1
@CarpetPython And Pyth
isaacg,

9

Mathematica, 11 bayt

Norm[#-#2]&

İki liste halinde giriş yapın, sayı olarak çıktı alın. Girdi kesin ise (tamsayılar, rasyoneller vb.) Çıktı da kesin olacaktır. Giriş bir kayan noktalı sayı içeriyorsa, çıktı aynı zamanda bir kayan nokta olacaktır.


6
EuclideanDistanceçok güzel çalışırdı ... eğer isim çok uzun olmasaydı! Eğer "Mathematica için MATL" olsaydı, bu tek bir bayt olurdu =)
2012rcampion

1
Ben bir matematiğe dayalı bir matematik dili üzerinde çalışıyorum> :)
Greg Martin

6

Oktav, 15 bayt

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

Örnek:

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 bayt

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

Haskell, 35 bayt (Yazan: @ nimi)

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

Haskell, 31 bayt

Gibi bu Scala cevap , dizilerini bir dizi olarak girdi alır

<Hack>

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

</ Hack>

Örnekler:

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 cooking_ಠ Yemek yaparken bazen tuzsuz bir işleve sahip olmak isterim .
kusur


2
map+ uncurry+ zipNadiren kullanımını amorti zipWith: d a=sqrt.sum.zipWith(((^2).).(-))a.
nimi

1
Başka bir çift baytı eta azaltma ile kurtaramaz mısın?
jk.

@jk. Emin değilim ... Sanmıyorum, çünkü (.)her zaman yalnızca bir argüman alan bir işlev döndürür ... (.). (.) Gibi bir şey yapabileceğinizi düşünüyorum, ama buna gerçekten değmez.
YoYoYonnY

5

APL, 14 11 bayt

.5*⍨(+/-×-)

Bu, vektörleri sola ve sağa alan ve farklılıklarının Öklid normunu döndüren ikili fonksiyon trenidir.

Açıklama:

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

Burada dene

Dennis sayesinde 3 bayt kurtarıldı!


.5*⍨(+/-×-) birkaç bayt kaydeder.
Dennis

3
APL kodunu ilk kez gördüğümde bu gerçekten olabilir mi? Bu sembol! APL karakter setini her zaman tuhaf buldum, ancak parçalanmış bir zombi parmağının yorum işaretçisi olduğunu asla anlamadım. ;-)
Level River St

@steveverrill <s> yorum </s>, zombi parmaklarımı APL gönderimlerimin tamamına buraya koydu. ¯ \ _ (ツ) _ / ¯
Alex A.

@AlexA. Kötü hizalama (monospaced olmayan APL karakterleri nedeniyle) bu sefer ona elle elle benzer bir görünüm kazandırdı. Bunu 4 çizgiden 3'e düşürdün ve etkiyi mahvettin: -S Bu cevabın 4 çizgiye sahip, fakat elle görünüşlü bir görünümü yok codegolf.stackexchange.com/a/70595/15599 Herneyse, Kodunuzda hala tek bir karakter suratınız olması hoşuma gidiyor.
Seviye Nehri St

4

J, 9 bayt

+&.*:/-/>

Bu, bir koordinat kümesini diğerinden ( -/>) alan ve karenin +altında bir toplama yapan bir fonksiyondur .&.*:

Giriş , ilk koordinat grubunuzun ve diğerinin x y z;a b colduğu formatta olmalıdır .x y za b c


Girişler her zaman aynı uzunlukta olduğundan, >girişi düşürebilir ve girişin verilmesi gerektiğini belirleyebilirsiniz x y z,:a b c.
Bolce Bussiere

4

Java, 130 117 114 107 105 bayt

Bu açık bir çözümdür. Genellikle Java'da golf oynamam, ancak Java'nın Brainfuck sürümünü geçip geçemeyeceğini görmek merak ettim. O zaman iyi bir iş çıkarmışım gibi görünmüyor .. Belki birileri baytları kurtarmak için Java 8'den yeni Harita / Reduce kullanabilir.

@Flawr (13 bayt), @KevinCruijssen (9 bayt) ve @DarrelHoffman (3 bayt) sayesinde!

golfed:

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);}

Ungolfed:

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
İşlev adını kesinlikle bir karakterle kısaltabilirsiniz. forDöngü için sıkıştırılabilirdouble x=0,s;for(int i=0;++i<a.length;s=a[i]-b[i],x+=s*s);
flawr

1
Bu yol çok büyük. Döngü için kusurun önerisine bakınız. Java 8 lambda'yı kullanarak, bu şu değere düşürülebilir: 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);}toplam 93 bayt için.
Addison Crump,

1
public 7 bayt kaydetmek için yöntemin önünü kaldırabilir ve x+=s*sfor-loop'un dışına da yerleştirebilirsiniz, böylece for(int i=-1;++i<a.length;s=a[i]-b[i])x+=s*s;-1 bayt için virgül (yani ) gerekmez .
Kevin Cruijssen

1
@Bruce_Forte Ah, görüyorum .. Bu durumda bu kullanabilirsiniz: for(int i=0;i<a.length;x+=s*s)s=a[i]-b[i++];(ve ben de değişti -1için 0ek bir bayt için)
Kevin Cruijssen

1
@KevinCruijssen Doğru. 0Operatör öncelik kurallarını kullanarak değişiklik yapmayı seviyorum ! Beni bir sürü baytı kurtardığın için teşekkürler.
ბიმო

3

Julia, 16 bayt

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

Bu, iki diziyi kabul eden ve öklid normunu bir şamandıra olarak döndüren bir fonksiyondur.

Bir keresinde çevrimiçi tüm test durumları kontrol edebilirsiniz burada .


İşlev adı olarak bir işleç kullanarak 3 bayttan tasarruf edebilirsiniz: Çevrimiçi deneyin!
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)$

Arayarak çalışır

> 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


Bir Lua eşdeğeri olacaktır

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

Cidden, 12 bayt

,iZ`i-ª`MΣ√A

Çevrimiçi deneyin!

Açıklama:

,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}

Test programında

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 bayt

Bu kodlanmış bir kod, ancak forma yorum yaptım --.

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

Bu, buradaki diğer programların çoğu ile aynı algoritmayı kullanır.

örnek çalıştır


2

Perl 6, 30 29 26 24 bayt

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

(Teşekkürler @ b2gills 2 kayıp daha bayt için)

kullanım

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 bayt

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

Örneğin her vektörden bir dizi koordinat çifti bekler [[1, 5], [2, 6], [3, 7], [4, 8]]. Bu kabul edilemezse, 42 bayt için:

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

İki N-boyutlu vektöre karşılık gelen eşit uzunlukta iki dizi bekler, örn [1, 2, 3, 4], [5, 6, 7, 8]. Düzenleme: @ l4m2 sayesinde 3 bayt kaydedildi. (Ayrıca, kimse yazım hatası fark etmedi mi?)


Lütfen, ilk bakışta açıkça görülmediğinden, giriş biçiminin bir belirtimini içeren bu işlevin nasıl çağrılacağına bir örnek ekleyin.
Denker

@DenkerAffe Üzgünüm, bu maddeyi görmezden geldiğimde, o zamanlar benden önceki örneklerle ve gerçekten de herkesle aynı formatı kullandım.
Neil

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

2

Python 2, 47 bayt

Basit bir çözüm. İşlev, sayı dizisi olarak 2 nokta bekler ve aralarındaki mesafeyi döndürür.

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

Örnek:

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

Python3.6'da çalışır, ancak en uygun olmayabilir.
SIGSTACKFAULT


1

Scala, 67 62 bayt

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

Var-arg tuples dizisi / vektörü olarak giriş yapılmasını gerektirir.
Örnek:

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

1

C #, 72 bayt

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

Linq kullanarak basit bir çözüm.


1

Adaçayı, 35 bayt

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

Bu işlev giriş olarak 2 liste alır ve sembolik bir ifade döndürür. Mesafe listelerde vektör çıkarma yapılarak ve elde edilen vektörün Öklid normunun hesaplanmasıyla hesaplanır.

Çevrimiçi deneyin


1

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

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

TI-Basic belirtilmiş bir dildir .

İki liste olarak giriş yapılmasını ister ve bunları girilen Öklid mesafesini döndürür Ans

Açıklama:

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 bayt

dist

Bu, herhangi bir giriş matrisinin uzaklık matrisini hesaplamak için yerleşik bir fonksiyondur. Varsayılan olarak öklid mesafesine.

Örnek kullanım:

> 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

Yerleşik olduğu için hayal kırıklığına uğramış hissediyorsanız, burada yerleşik olmayan (veya en azından, daha az yerleşik ...) 22 baytlık bir sürüm ( Giuseppe ile ):

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

Bu, giriş olarak iki vektör alan anonim bir işlevdir.


function(x,y)norm(x-y,"F")ikinci sürümünden daha kısa.
Giuseppe

1

Haskell, 32 bayt

((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


@Angs Gelişme için teşekkürler. Biraz kurcalamadan sonra, 6 baytı daha kaldırmanın bir yolunu buldum (çıkarma mapve parantez içinde).
Rodrigo de Azevedo

Tekrar müdahale ettiğim için özür dilerim, ancak sqrt$sum$(^2)<$>zipWith(-)geçerli bir anonim işlev değil. Temel kural aslında oldukça basittir: Yazabilirsenizf = <mycode> ve fardından gerekli görevi gerçekleştiriyorsanız, <mycode>geçerli bir adsız işlevdir. Senin durumunda eklemek gerekir f p q = <mycode> p q, bu yüzden <mycode>kendi başına geçerli değil.
Laikoni,

1
@Likonik Haklısın. Cevabımı düzenledim ve Angs'in önerisini kullandım. Kısaltmanın bir yolunu bulursanız, lütfen bana bildirin.
Rodrigo de Azevedo

0

Python 3, 70 Karakter

Farkın karesini ve ardından toplamın kökünü bulmak için döngüler

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

2
Birkaç damla daha:sum([(x-y)**2 for x,y in zip(a,b)])**.5
Benjamin

0

Mathcad, bayt

görüntü tanımını buraya girin

İki nokta arasındaki farkın boyutunu (vektörler olarak ifade edilir) hesaplamak için yerleşik vektör büyüklüğü (mutlak değer) operatörünü kullanır.


Mathcad golf büyüklüğü, meta tartışmasını açana kadar (ya da başkası alırsa) dolana kadar beklemede kaldı. Bununla birlikte, en kısa yol (nokta vektörlerinin girişinin skora katkıda bulunmadığını varsayarsak) işlevsel sürüm için 14 bayt olan 3 "bayttır".



0

Ruby, 50 bayt

Sıkıştır, sonra eşle / küçült. Yakında diğer Ruby cevabını @LevelRiverSt 'den 2 byte kadar çıkar ...

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

Çevrimiçi deneyin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.