n次元空間の2点間の距離


22

もう1つ簡単な例を示します。

チャレンジ

n次元空間内の2つの点が与えられた場合、それらの間の距離(ユークリッド距離とも呼ばれます)を出力します。

  • 座標は有理数になります。唯一の制限は、言語の制限です。
  • 最低次元は1、最高次元は言語が処理できるものです
  • 2つのポイントが同じ次元であり、空の入力がないと仮定できます。
  • 距離は、少なくとも小数点以下3桁まで正確でなければなりません。ご使用の言語が浮動小数点数をサポートしていない場合は、最も近い整数を出力してください。

ルール

  • 通常どおり、機能または完全なプログラムが許可されます。
  • 入力は、STDIN、コマンドライン、または関数の引数から取得できます。
  • 入力形式はあなた次第で、回答で使用した形式を指定します。
  • 出力は、stdoutまたは戻り値への印刷によって提供されます。
  • これはので、バイト数が最も少なくなります!同点の場合、以前の回答が優先されます。

テストケース

各ポイントは、長さ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

ハッピーコーディング!


16
Brainfuckを試してみます。どのような恐ろしいモンスターが出てくるか見てみましょう。
YoYoYonnY

ユークリッド距離を意味すると思いますか?
フレイ

3
@flawrうん、まさに。誰もがそれが一見しただけでは分からないかもしれないので、タイトルをシンプルにしたかっただけです。明確にそれをチャレンジthoで書くことができます:)
デンカー

「プログラミング言語が浮動小数点をサポートしていない」場合、@ DenkerAffeは距離の2乗を返しても大丈夫ですか?これにより、私のBrainfuckプログラムがより正確になります(そうでなければ、何らかの推定アルゴリズムを実装する必要があります)。
YoYoYonnY

2
@DenkerAffe Brainfuckがコードゴルフに勝つこと決してないと言うのは安全だと思います。しかし、とにかく楽しみのためだけです:)
YoYoYonnY

回答:


26

MATL、2バイト

ZP

オンラインでお試しください

ZP関数(MATLABに対応pdist2)は、デフォルトでユークリッド距離を使用して、2つのポイントセット間のすべてのペアワイズ距離を計算します。ポイントの各セットはマトリックスであり、各ポイントは行です。この場合、2つのポイント間の距離である単一の結果が生成されます。


7
これが本当であるまさか
マルタイン

6
避けられないシングルバイトMATLの回答を辛抱強く待っています;)
アンドラスディーク

2
言語の主な目的は、あいまいなコードゴルフの問題を解決することですが、これらの言語を聞いたことはありますか?これはまったく同じように聞こえます。これにぴったりの難解な言語が存在するのではないかと思います。
合法的なレイジー

1
これは間違いなくお金を口に入れます。いい仕事、ルイス!
rayryeng-モニカの復活

1
pdist2関数は、私が見つけたときに文字通り私の人生を変えました...-
ルイ

15

MATL、 4.0 3バイト

@AndrasDeakによる-1をありがとう!

-Zn

2つのベクトルを読み取ります(要求される暗黙的な入力を介して) -、それらを減算し、との差のノルムを計算しZnます。

オンラインでお試しください!


10
明日は投票を始めてください。今日はすでにモーターボートをしました。
-flawr

3
遅すぎる...再びモーターボートを取得する必要があります
。P–デンカー

1
いくつかの賛成票保存してください :-P
ルイスメンドー

1
@DenkerAffeは賞金稼ぎを決して信用しません。
アンドラスDeak

1
バウンティハンター...そのスカムは必要ありません
ルイスメンドー


10

ゼリー、4 バイト

_²S½

オンラインでお試しください!

使い方

_²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
いいね。Jellyでわずか4バイト。誰もそれ以上にうまくできる方法がわかりません。
ロジックナイト

7
@CarpetPythonどうやらMATLができる...-
デンカー

1
@CarpetPythonとPyth
isaacg

9

Mathematica、11バイト

Norm[#-#2]&

2つのリストとして入力し、数値として出力します。入力が正確な場合(整数、有理数など)、出力も正確になります。入力に浮動小数点数が含まれる場合、出力も浮動小数点数になります。


6
EuclideanDistance名前があまり長くない場合は...もうまくいきます!「MATLAB for Mathematica」がある場合、これはシングルバイトになります=)
2012rcampion

1
私はゴルフに基づいたMathematicaベースの言語に取り組んでいます> :)
グレッグマーティン

6

オクターブ、15バイト

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

例:

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

CJam、11 8バイト

3バイトを節約してくれたDennisに感謝します。

q~.-:mhz

すべてのテストケースを実行します。

説明

q~   e# Read and evaluate input.
.-   e# Vectorised difference.
:mh  e# Reduce √(x²+y²) over the list.
z    e# Take abs() to handle 1D input.

なぜ:mh機能するかについては、このヒントを参照してください。


そのトリック:mhは確かにとてもいいです
ルイスメンドー

6

Haskell、46バイト

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

Haskell、35バイト(@nimiによる)

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

Haskell、31バイト

同様に、このScalaの答え、タプルのシーケンスとして入力を受け取り、

<ハック>

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

</ hack>

例:

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 ಠ_ಠ料理をするとき、時々無塩機能を持ちたいです。
フレイ


2
map+ uncurry+ zipめったに、使用をオフに支払っていませんzipWithd a=sqrt.sum.zipWith(((^2).).(-))a
nimi

1
イータ削減によってさらに数バイト節約できませんか?
jk。

@jk。わからない...私はそうは思わない、(.)常に一つの引数のみをとる関数を返すから...(。)。(。)のようなことができると思うが、それは本当に価値がない。
YoYoYonnY 16

5

APL、14 11バイト

.5*⍨(+/-×-)

これは、左右のベクトルを取り、それらの差のユークリッドノルムを返すダイアディック関数列です。

説明:

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

ここで試してみてください

デニスのおかげで3バイト節約できました!


.5*⍨(+/-×-)数バイト節約します。
デニス

3
これが本当にコメントされたAPLコードを見たのは初めてですか?そのシンボル!私はいつもAPLのキャラクターセットがおかしいと思っていましたが、解体されたゾンビの指がコメントマーカーであることに気付きませんでした。;-)
Level River St

@steveverrill私は<s> comment </ s>で、私のAPL提出物のほとんどすべてにゾンビの指を入れました。¯\ _(ツ)_ /¯
アレックスA.

@AlexA。不適切な配置(非等幅APL文字による)により、今回は特に手のような外観になりました。あなたはそれを4行から3行に落とし、効果を台無しにしました:-Sこの答えは4行ですが、手に似た外観はありません codegolf.stackexchange.com/a/70595/15599とにかく、私はあなたがあなたのコードにまだ一文字スマイリーを持っているのが好きです。
レベルリバーセント

4

J、9バイト

+&.*:/-/>

これは、他の座標セット(-/>)から1つの座標セットを取得し、次にsquareの+下で合計を実行する関数です。&.*:

入力は形式にする必要があります座標のあなたの最初のセットで、他のです。x y z;a b cx y za b c


入力は常に同じ長さなので、をドロップして>、入力をとして指定するように指定できますx y z,:a b c
ボルスビュッシーリ

4

Java、130 117 114 107 105バイト

これは明らかな解決策です。私は通常Javaでゴルフをしませんが、JavaがBrainfuckバージョンを打ち負かすことができるかどうか興味がありました。そのとき、私は良い仕事をしたようには見えません。おそらく、Java 8の新しいMap / Reduceを使用して、いくつかのバイトを節約できるかもしれません。

@flawr(13バイト)、@ KevinCruijssen(9バイト)、および@DarrelHoffman(3バイト)のおかげです!

ゴルフ:

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

ゴルフをしていない:

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
確かに関数名を1文字に短縮できます。forループはに圧縮するdouble x=0,s;for(int i=0;++i<a.length;s=a[i]-b[i],x+=s*s);
flawr

1
これは、ある方法で特大。flawrのループの提案を参照してください。Java 8ラムダを使用すると、これを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);}合計で93バイトに減らすことができます。
アディソンクランプ

1
public メソッドの前のを削除して7バイトを節約できます。また、-1バイトのx+=s*sコンマ(つまりfor(int i=-1;++i<a.length;s=a[i]-b[i])x+=s*s;)を必要としないようにforループの外側に配置することもできます。
ケビンCruijssen

1
@Bruce_Forteあ、なるほど。その場合、これを使うことができます:(for(int i=0;i<a.length;x+=s*s)s=a[i]-b[i++];そして、追加のバイト-10を変更しました)
ケビンCruijssen

1
@KevinCruijssenはい。0演算子の優先順位規則を使用することによる変更が好きです!たくさんのバイトを節約してくれてありがとう。
1


3

golflua、43文字

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

次のように呼び出すことで機能します

> 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


Luaに相当するものは

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


2

ルビー、52

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

テストプログラムで

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バイト

これはゴルフのコードですが、フォームにコメントを入れました--

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

ここでは、他のほとんどのプログラムと同じアルゴリズムを使用します。

run sample


2

Perl 6の、30の 29 26 24バイト

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

(さらに2バイト失われた@ b2gillsに感謝します)

使用法

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-] $_)»²}
ブラッドギルバートb2gills 16

2

JavaScript ES7、45 ES6、37バイト

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

各ベクトルから1つずつなど、座標のペアの配列が必要[[1, 5], [2, 6], [3, 7], [4, 8]]です。それが受け入れられない場合、42バイトの場合:

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

2つのN次元ベクトルに対応する長さが等しい2つの配列を期待します[1, 2, 3, 4], [5, 6, 7, 8]。編集:@ l4m2のおかげで3バイトを保存しました。(また、私のタイプミスに誰も気づきませんでしたか?)


入力フォーマットの仕様を含むこの関数を呼び出す方法の例を追加してください。これは一見して明らかではありません。
デンカー

@DenkerAffe申し訳ありませんが、その条項を見落としていたので、例と同じ形式を使用していました。
ニール

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

2

Python 2、47バイト

簡単な解決策。この関数は、数値のシーケンスとして2点を予期し、それらの間の距離を返します。

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

例:

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

Python3.6で動作しますが、最適ではない場合があります。
-SIGSTACKFAULT


1

Scala、67 62バイト

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

var-argタプルのシーケンス/ベクトルとしての入力が必要です
例:

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


1

セージ、35バイト

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

この関数は、入力として2つのリストを取り、シンボリック式を返します。距離は、リストでベクトル減算を実行し、結果のベクトルのユークリッドノルムを計算することにより計算されます。

オンラインで試す


1

TI-Basic(TI-84 Plus CE)、15バイト

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

TI-Basicはトークン化された言語ですです。

2つのリストとして入力を求め、それらの間のユークリッド距離を返します Ans

説明:

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バイト

dist

これは、入力行列の距離行列を計算する組み込み関数です。デフォルトはユークリッド距離です。

使用例:

> 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

組み込みであるためにがっかりしている場合は、22バイトの組み込みではない(少なくとも組み込みが少ない ...)バージョンがありますGiuseppeに感謝します)。

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

これは、2つのベクトルを入力とする匿名関数です。


function(x,y)norm(x-y,"F")2番目のバージョンよりも短いです。
ジュゼッペ

1

Haskell、32バイト

((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改善してくれてありがとう。少し手を加えた後、さらに6バイトを削除する方法を見つけました(削除mapして括弧で囲む)。
ロドリゴデアゼ

改めてご迷惑をおかけして申し訳ありませsqrt$sum$(^2)<$>zipWith(-)んが、有効な匿名関数ではありません。基礎となるルールは実際には非常に単純です:記述できf = <mycode>fその後必要なタスクを実行する<mycode>と、有効な匿名関数になります。あなたの場合、追加する必要があるf p q = <mycode> p qので<mycode>、それ自体は有効ではありません。
ライコニ

1
@ライコニその通りです。私は答えを編集し、Angsの提案を使用しました。短縮する方法を見つけたら、お知らせください。
ロドリゴデアゼ

0

Python 3、70文字

ループを繰り返し、差の二乗と合計の根を見つけます。

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

2
さらにいくつかのドロップ:sum([(x-y)**2 for x,y in zip(a,b)])**.5
ベンジャミン

0

Mathcad、バイト

enter image description here

組み込みのベクトルマグニチュード(絶対値)演算子を使用して、2つのポイント間の差のサイズを計算します(ベクトルとして表現)。


Mathcadのゴルフサイズは、メタに関する議論を開始するまで(または他の誰かが取得するまで)保留しています。ただし、最短の方法(ポイントベクトルの入力がスコアに寄与しないと仮定した場合)は3 "バイト"で、機能バージョンでは14バイトです。



0

ルビー、50バイト

圧縮してから、マップ/縮小します。@LevelRiverStからの他のRubyの回答を2バイトだけかろうじて追い出します...

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

オンラインで試す

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.