n 차원 공간에서 두 점 사이의 거리


22

여기 또 다른 간단한 것이 있습니다.

도전

n 차원 공간에 두 점이 주어지면 그 사이의 거리를 유클리드 거리라고도합니다.

  • 좌표는 유리수입니다. 유일한 제한은 언어의 제한입니다.
  • 가장 낮은 차원은 1이고, 가장 높은 것은 언어가 처리 할 수있는 모든 것입니다
  • 두 점의 치수가 같고 빈 입력이 없다고 가정 할 수 있습니다.
  • 거리는 소수점 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
나는 뇌성 주사를 줄 것이다. 끔찍한 괴물이 나오는지 봅시다.
YoYoYonnY

유클리드 거리를 의미한다고 가정합니까?
flawr

3
@flawr 그렇습니다. 모든 사람들이 언뜻 무엇을 알지 못하기 때문에 제목을 단순하게 유지하고 싶었습니다. challange tho :)
Denker

@DenkerAffe "프로그래밍 언어가 부동 소수점을 지원하지 않는"경우 거리를 제곱으로 반환해도 괜찮습니까? 이것은 내 brainfuck 프로그램을 훨씬 더 정확하게 만들 것입니다 (그렇지 않으면 일종의 추정 알고리즘을 구현해야합니다).
YoYoYonnY

2
@DenkerAffe 나는 brainfuck가 결코 코드 골프에서 이길 수 없다고 말하는 것이 안전하다고 생각합니다 . 그러나 그것은 어쨌든 재미를위한 것입니다 :)
YoYoYonnY

답변:


26

MATL , 2 바이트

ZP

온라인으로 사용해보십시오 !

ZP함수 (MATLAB에 해당 pdist2)는 기본적으로 유클리드 거리를 사용하여 두 점 세트 사이의 모든 쌍 거리를 계산합니다. 각 점 집합은 행렬이고 각 점은 행입니다. 이 경우 두 결과 사이의 거리 인 단일 결과가 생성됩니다.


7
이건 진짜 아니에요
Martijn

6
피할 수없는 싱글 바이트 MATL 답변을 참을성있게 기다리고 있습니다.)
Andras Deak

2
코드의 주요 요점은 모호한 코드 골프 문제를 해결하는 것입니다. 정확히 똑같습니다. 난해한 언어가 이것에 대해 정확히 존재하는지 궁금합니다.
합법적 인 게으른

1
이것은 분명히 입이 어디에 돈을 넣습니다. 잘 했어 루이스!
rayryeng-복원 모니카

1
pdist2 함수는 내가 그것을 발견했을 때 문자 그대로 내 인생을 바꿨습니다.
Lui

15

MATL, 4.0 3 바이트

@AndrasDeak의 -1에 감사드립니다!

-Zn

에서 요청한 암시 적 입력을 통해 두 개의 벡터를 읽은 -다음 해당 벡터 를 빼고와의 차이의 표준을 계산합니다 Zn.

온라인으로 사용해보십시오!


10
내일 출발을 시작해주세요. 나는 이미 모터 보트입니다.
flawr

3
너무 늦었 어 .. 다시 모터 보트를 타야 해. : P
Denker

1
일부 upvotes 저장을 나를 위해이 - P
루이스 Mendo

1
@ DenkerAffe는 현상금 사냥꾼을 신뢰하지 않습니다.
Andras Deak

1
현상금 사냥꾼 ... 우리는 쓰레기가 필요하지 않습니다
Luis Mendo



9

수학, 11 바이트

Norm[#-#2]&

두 개의 목록으로 입력하고 숫자로 출력합니다. 입력이 정확하면 (정수, 합리적 등) 출력도 정확합니다. 입력에 부동 소수점 숫자가 포함 된 경우 출력도 부동 소수점이됩니다.


6
EuclideanDistance이름이 그렇게 오래 가지 않았다면 잘 작동합니다! "Mathematica에 대한 MATL"만 있다면 이것은 1 바이트 =)입니다.
2012rcampion

1
나는 골프를 치는 Mathematica 기반 언어로 일하고 있습니다> :)
Greg Martin

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

하스켈, 46 바이트

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

Haskell, 35 바이트 (By @nimi)

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

하스켈, 31 바이트

이 Scala answer 와 같이 튜플 시퀀스로 입력을받습니다.

<해킹>

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 ಠ_ಠ 요리 할 때 때로 소금이없는 기능을 원합니다 .
flawr


2
map+ uncurry+ zip거의 사용을 지불하지 zipWith: d a=sqrt.sum.zipWith(((^2).).(-))a.
니미

1
에타 감소로 다른 몇 바이트를 저장할 수 없습니까?
jk.

@jk. 확실하지 않습니다 ... 나는 그렇게 생각하지 않습니다. (.)항상 하나의 인수 만 취하는 함수를 반환하기 때문에 .... (.). (.)와 같은 것을 할 수 있다고 생각하지만 실제로는 그만한 가치가 없습니다.
YoYoYonnY

5

APL, 14 11 바이트

.5*⍨(+/-×-)

이것은 왼쪽과 오른쪽의 벡터를 가져 와서 그 차이의 유클리드 표준을 반환하는 2 차원 함수 트레인입니다.

설명:

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

여기 사용해보십시오

Dennis 덕분에 3 바이트를 절약했습니다!


.5*⍨(+/-×-)몇 바이트를 절약합니다.
Dennis

3
내가 APL 코드를 주석으로 본 것을 처음으로 볼 수 있습니까? 상징! 나는 항상 APL 문자 세트가 이상하다는 것을 알았지 만, 좀비 손가락이 주석 마커라는 것을 깨닫지 못했습니다. ;-)
Level River St

@steveverrill <s> 댓글 </ s>은 여기에 거의 모든 APL 제출에 좀비 손가락을 넣었습니다. ¯ \ _ (ツ) _ / ¯
Alex A.

@AlexA. (단일 공백이 아닌 APL 문자로 인한) 잘못된 정렬은 이번에 특히 손 모양으로 나타납니다. 당신이 대답은 4 선이 -S 있지만, 손과 같은 모양이없는 : 당신은 3 4 개 라인에서 내려 golfed 및 효과를 파괴 한 codegolf.stackexchange.com/a/70595/15599을 , 어쨌든 나는 여전히 당신의 코드에 하나의 문자가 웃는 ​​것을 좋아합니다.
Level River St

4

J, 9 바이트

+&.*:/-/>

하나의 좌표를 다른 좌표에서 가져 와서 square under -/>sum을 수행하는 함수 입니다.+&.*:

입력은 형식이어야 좌표의 첫 번째 세트이고 다른 하나입니다.x y z;a b cx y za b c


입력은 항상 같은 길이이므로를 삭제하고 >입력을로 지정하도록 지정할 수 있습니다 x y z,:a b c.
Bolce Bussiere

4

자바 130 117 114 107 105 바이트

이것이 확실한 해결책입니다. 나는 보통 자바로 골프를 치지 않지만 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
함수 이름을 한 문자로 줄일 수 있습니다. 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 바이트를 절약 할 수 x+=s*s있으며 for 루프 외부에 배치하여 for(int i=-1;++i<a.length;s=a[i]-b[i])x+=s*s;-1 바이트에 쉼표 (예 :)가 필요하지 않습니다 .
Kevin Cruijssen

1
@Bruce_Forte 아, 내가 볼 ..이 경우 당신은이를 사용할 수 있습니다 for(int i=0;i<a.length;x+=s*s)s=a[i]-b[i++];(그리고 나는 또한 변경 -10추가 바이트를 위해)
케빈 Cruijssen

1
@KevinCruijssen True. 0연산자 우선 순위 규칙을 사용하여 변경하는 것을 좋아합니다 ! 많은 바이트를 절약 해 주셔서 감사합니다.
ბიმო


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


루아에 해당하는 것은

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

여기서 다른 대부분의 프로그램과 동일한 알고리즘을 사용합니다.

샘플 실행


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

2

자바 스크립트 ES7, 45 ES6, 37 바이트

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

각 벡터에서 하나씩 좌표 쌍의 배열을 예상합니다 (예 :) [[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 바이트가 절약되었습니다. (아무도 내 오타를 눈치 채지 못했습니까?)


입력 형식의 사양을 포함하여이 함수를 호출하는 방법에 대한 예를 추가하십시오. 처음에는 명확하지 않기 때문입니다.
Denker

@DenkerAffe 죄송합니다, 그 조항을 간과 한, 나는 방금 예제와 같은 형식을 사용했고 실제로 그 이전의 모든 사람들이 그랬습니다.
Neil

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

2

파이썬 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

스칼라, 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

C #, 72 바이트

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

Linq를 사용하는 간단한 솔루션.


1

세이지, 35 바이트

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

이 함수는 2 개의 목록을 입력으로 사용하여 기호 표현식을 리턴합니다. 거리는 목록에서 벡터 빼기를 수행하고 결과 벡터의 유클리드 표준을 계산하여 계산됩니다.

온라인으로 사용해보십시오


1

TI 기본 (TI-84 Plus CE), 15 바이트

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

TI-Basic은 토큰 화 된 언어입니다 입니다.

두 개의 목록으로 입력하라는 프롬프트를 표시하고 유클리드 거리를 반환합니다. 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 바이트 (감사와 주세페 ) :

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

이것은 두 벡터를 입력으로 사용하는 익명 함수입니다.


function(x,y)norm(x-y,"F")두 번째 버전보다 짧습니다.
Giuseppe

1

하스켈, 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>자체적으로 유효하지 않습니다.
Laikoni

1
@Laikoni 당신이 맞아요. 나는 대답을 편집하고 Angs의 제안을 사용했습니다. 단축 방법을 찾으면 알려주십시오.
Rodrigo de Azevedo

0

파이썬 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
Benjamin

0

Mathcad, 바이트

여기에 이미지 설명을 입력하십시오

내장 벡터 크기 (절대 값) 연산자를 사용하여 두 점 사이의 차이 크기를 계산합니다 (벡터로 표시).


메타에 대한 토론을 시작하기 전까지 Mathcad 골프 크기는 그대로 유지됩니다. 그러나 가장 짧은 방법 (점 벡터의 입력이 점수에 영향을 미치지 않는다고 가정)은 3 "bytes"이며 기능 버전은 14 바이트입니다.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.