Distance between two points in n-dimensional space

Here is another simple one:

The Challenge

Given two points in an n-dimensional space, output the distance between them, also called the Euclidean distance.

• The coordinates will be rational numbers; the only limits are the restrictions of your language.
• Lowest dimension is 1, highest is whatever your language can handle
• You may assume that the two points are of the same dimension and that there will be no empty input.
• The distance has to be correct to at least 3 decimal places. If your language does not support floating point numbers, output the nearest whole number.

Rules

• As usual, function or full program allowed.
• Input may be taken from STDIN, command line- or function arguments.
• Input format is up to you, specify which one you used in your answer.
• Output may be provided by printing to stdout or return value.
• This is so lowest byte-count wins! In case of a tie, the earlier answer wins.

Test cases

Each point is represented by a list of length n.

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

Happy Coding!

• I'll give brainfuck a shot. Let's see what horrible monster comes out.
– yyny
Jan 30 '16 at 12:56
• I assume you mean the Euclidean distance? Jan 30 '16 at 13:54
• @flawr Yep, exactly. Just wanted to keep the title simple, since not everyone might know what that is at first glance. Could definetly write that in the challange tho :) Jan 30 '16 at 14:02
• @DenkerAffe is it OK to return the distance squared if "your programming language does not support floating points"? This would make my brainfuck program a lot more accurate (Otherwise I'll have to implement some sort of estimation algorithm).
– yyny
Jan 30 '16 at 14:58
• @DenkerAffe I think it's safe to say that brainfuck will never win a code golf. But it's just for fun anyways :)
– yyny
Jan 30 '16 at 16:17

MATL, 2 bytes

ZP

Try it online!

The ZP function (corresponding to MATLAB's pdist2) computes all pairwise distances between two sets of points, using Euclidean distance by default. Each set of points is a matrix, and each point is a row. In this case it produces a single result, which is the distance between the two points.

• No way this is real Jan 30 '16 at 19:06
• I'm patiently waiting for the inevitable single-byte MATL answer;) Jan 30 '16 at 20:18
• Ever heard those languages whereas the main point of the language is to solve obscure Code Golf problems? This sounds exactly like it. Makes me wonder if esoteric languages exist exactly for this. Jan 31 '16 at 5:00
• This definitely puts the money where the mouth is. Nice job Luis! Jan 31 '16 at 6:10
• The pdist2 function literally changed my life when I found it...
– Lui
Jan 31 '16 at 9:08

MATL, 4.0 3 bytes

Thanks for -1 by @AndrasDeak!

-Zn

Reads two vectors (via implicit input that is requested by -) then substracts those and calculates the norm of their difference with Zn.

Try it Online!

• Please start upvoting tomorrow, I already motorboated today. Jan 30 '16 at 14:25
• Too late...You gotta motorboat again :P Jan 30 '16 at 16:47
• Save some upvotes for me :-P Jan 30 '16 at 18:48
• @DenkerAffe never trust a bounty hunter. Jan 30 '16 at 20:14
• Bounty hunters... we don't need that scum Jan 30 '16 at 23:53

Pyth, 2 bytes

.a

.a - L2 norm of vector difference of A and A.

Literally a function that does this problem

Try it here.

Jelly, 4 bytes

_²S½

Try it online!

How it works

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

_       Subtract B from A, element by element.
²      Square all differences.
½    Take the square root of the sum.
• Yikes. Just 4 bytes with Jelly. I cannot see how anyone can do better than that. Jan 30 '16 at 13:17
• @CarpetPython Apparently MATL can... Jan 30 '16 at 16:43
• @CarpetPython And Pyth Jan 31 '16 at 5:12
• @CarpetPython and Vyxal too Dec 17 '21 at 6:38

Mathematica, 11 bytes

Norm[#-#2]&

Input as two lists, output as a number. If the input is exact (integers, rationals, etc.) the output will be exact as well. If the input contains a floating-point number, the output will be a float as well.

• EuclideanDistance would work nicely too... if the name weren't so darn long! If only there were "MATL for Mathematica" this would be a single byte =) Jan 31 '16 at 1:18
• I'm working on a golfy Mathematica-based language >:) Feb 3 '17 at 17:51

Octave, 15 bytes

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

Example:

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

CJam, 11 8 bytes

Thanks to Dennis for saving 3 bytes.

q~.-:mhz

Run all test cases.

Explanation

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.

See this tip for why :mh works.

• That trick with :mh is very nice indeed Jan 30 '16 at 16:57

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

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

Like this Scala answer, takes input as a sequence of tuples

<hack>

d :: Float c => [(c,c)] -> c
d=sqrt.sum.map(^2).uncurry(-) </hack> Examples: Prelude> d   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 • uncurry ಠ_ಠ When cooking I sometimes wish to have an unsalt function. Jan 30 '16 at 14:27 • – yyny Jan 30 '16 at 14:38 • map + uncurry + zip rarely pays off, use zipWith: d a=sqrt.sum.zipWith(((^2).).(-))a. – nimi Jan 30 '16 at 21:16 • can't you save another couple of bytes by eta reduction? – jk. Feb 1 '16 at 15:05 • @jk. Not sure... I don't think so, since (.) always returns a function that takes only one argument... I think you can do something like (.).(.), but that isn't really worth it. – yyny Feb 2 '16 at 14:29 APL, 14 11 bytes .5*⍨(+/-×-) This is dyadic function train that takes the vectors on the left and right and returns the Euclidean norm of their difference. Explanation: -×-) ⍝ Squared differences (+/ ⍝ Sum them .5*⍨ ⍝ Take the square root Try it here Saved 3 bytes thanks to Dennis! • .5*⍨(+/-×-) saves a few bytes. Jan 30 '16 at 19:14 • Can this really be the first time I've seen commented APL code? That symbol! I've always found the APL character set weird, but I never realized a dismembered zombie finger was the comment marker. ;-) Jan 30 '16 at 22:34 • @steveverrill I <s>comment</s> put zombie fingers in just about all of my APL submissions here. ¯\_(ツ)_/¯ Jan 31 '16 at 3:39 • @AlexA. The poor alignment (due to the non-monospaced APL characters) happened to give it a particularly hand-like appearance this time. You've golfed it down from 4 lines to 3, and ruined the effect :-S This answer of yours has 4 lines, but doesn't have the hand-like appearance codegolf.stackexchange.com/a/70595/15599 Anyway, I like that you still have a single character smiley in your code. Jan 31 '16 at 8:39 Julia, 16 bytes N(x,y)=norm(x-y) This is a function that accepts two arrays and returns the Euclidean norm of their difference as a float. You can verify all test cases at once online here. • You can save 3 bytes by using an operator as the function name : Try it online! Jul 2 '18 at 23:29 J, 9 bytes +&.*:/-/> This is a function that takes one set of coordinates from the other (-/>), and then performs a sum + under &. square *:. The input should be in the format x y z;a b c where x y z is your first set of co-ordinates and a b c is the other. • Since the inputs are always the same length, you can drop the > and specify that input should be given as x y z,:a b c. Apr 11 '18 at 20:22 Java, 130117114107 105 bytes This is the obvious solution. I don't usually golf in Java, but I was curious to see if Java could beat the Brainfuck version. Doesn't seem like I did a good job then.. Maybe one could use the new Map/Reduce from Java 8 to save some bytes. Thanks to @flawr (13 bytes), @KevinCruijssen (9 bytes) and @DarrelHoffman (3 bytes)! 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); } • You can certainly shorten the function name to one character. The for loop be compressed to double x=0,s;for(int i=0;++i<a.length;s=a[i]-b[i],x+=s*s); Jan 31 '16 at 0:28 • This is way oversized. See flawr's suggestion for the loop. Using Java 8 lambda, this can be reduced to: 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);} for a total of 93 bytes. Jan 31 '16 at 14:04 • You can remove the public in front of the method to save 7 bytes, and you can also place the x+=s*s outside the for-loop so you don't need the comma (i.e. for(int i=-1;++i<a.length;s=a[i]-b[i])x+=s*s;) for -1 byte. Jan 17 '17 at 10:31 • @Bruce_Forte Ah, I see.. In that case you could use this: for(int i=0;i<a.length;x+=s*s)s=a[i]-b[i++]; (and I also changed the -1 to 0 for an additional byte) Jan 18 '17 at 16:08 • @KevinCruijssen True. I like the change to 0 by using the operator precedence rules! Thanks for saving me a whole lot of bytes. Jan 18 '17 at 21:26 golflua, 43 chars \d(x,y)s=0~@i,v i(x)s=s+(v-y[i])^2~M.q(s)$Works by calling it as > 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 A Lua equivalent would be function dist(x, y) s = 0 for index,value in ipairs(x) s = s + (value - y[index])^2 end return math.sqrt(s) end Seriously, 12 bytes ,iZi-ªMΣ√A Try it online! Explanation: ,iZi-ªMΣ√A ,iZ get input, flatten, zip  M map: i-ª flatten, subtract, square Σ√A sum, sqrt, abs Perl 6, 302926 24 bytes {sqrt [+] ([Z-]$_)»²}

(Thanks @b2gills for 2 more bytes lost)

usage

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

say f(, ); # 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-] $_)»²} Feb 5 '16 at 6:28 Python 2, 47 bytes A straight forward solution. The function expects 2 points as sequences of numbers, and returns the distance between them. lambda a,b:sum((d-e)**2for d,e in zip(a,b))**.5 Example: >>> f([13.37, 2, 6, -7], [1.2, 3.4, -5.6, 7.89]) 22.50202213135522 • Works in Python3.6, but might not be optimal. Jul 9 '18 at 16:07 Ruby, 52 ->p,q{t=0;p.size.times{|i|t+=(p[i]-q[i])**2} t**0.5} In test program f=->p,q{t=0;p.size.times{|i|t+=(p[i]-q[i])**2} t**0.5} p f[, ] # 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 AppleScript, 241 239 bytes This is golfed code, but I've put comments in in the form --. 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 This uses the same algorithm as most of the other programs here. JavaScript ES7, 45 ES6, 37 bytes a=>Math.hypot(...a.map(([b,c])=>b-c)) Expects an array of pairs of coordinates, one from each vector, e.g. [[1, 5], [2, 6], [3, 7], [4, 8]]. If that is unacceptable, then for 42 bytes: (a,b)=>Math.hypot(...a.map((e,i)=>e-b[i])) Expects two arrays of equal length corresponding to the two N-dimensional vectors, e.g. [1, 2, 3, 4], [5, 6, 7, 8]. Edit: Saved 3 bytes thanks to @l4m2. (Also, did nobody notice my typo?) • Please add an example on how to invoke this function including a specification of the input format, since this is not obvious on the first glance. Jan 30 '16 at 16:41 • @DenkerAffe Sorry, having overlooked that clause, I had just used the same format as the examples and indeed everyone previous to me at the time. – Neil Jan 30 '16 at 17:07 • a=>b=>Math.hypot(...a.map((t,i)=>t-b[i])) – l4m2 Dec 27 '17 at 9:04 Haskell, 32 bytes ((sqrt.sum.map(^2)).).zipWith(-) λ> let d = ((sqrt.sum.map(^2)).).zipWith(-) λ> d   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 • 32 bytes – Angs Jul 2 '18 at 11:15 • @Angs Thanks for the improvement. After some tinkering, I found a way to remove 6 more bytes (by removing map and parentheses). Jul 9 '18 at 15:50 • I'm sorry to intervene again, but sqrt$sum$(^2)<$>zipWith(-) is not a valid anonymous function. The underlying rule is actually quite simple: If you can write f = <mycode> and f afterwards performs the required task, then <mycode> is a valid anonymous function. In your case you need to add f p q = <mycode> p q, so <mycode> on it's own is not valid. Jul 10 '18 at 9:52
• @Laikoni You're right. I edited my answer and used Angs's suggestion. If you find a way to shorten it, please let me know. Jul 15 '18 at 11:20

C (gcc), 79 77 bytes

-2 bytes thanks to ceilingcat.

TIO requires compiler flag -lm. GCC of MinGW (that I use) does not.

f(p,q,d,s)float*p,*q,s;{for(s=0;d--;)s+=*p++*=*p-=*q++;printf("%f",sqrt(s));}

Try it online!

• @ceilingcat Cheers! Jun 20 '20 at 7:17

Vyxal, 2 bytes

∆d

Try it Online!

Laughs in built-in. Generalised euclidian distance do be like that sometimes.

𝔼𝕊𝕄𝕚𝕟, 6 chars / 13 bytes

МŰМŷ…ï

Try it here (Firefox only).

Calculates norm of difference of input arrays.

Scala, 67 62 bytes

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

Requires input as a sequence/vector of var-arg tuples
Example:

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

C#, 72 bytes

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

A simple solution using Linq.

Sage, 35 bytes

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

This function takes 2 lists as input and returns a symbolic expression. The distance is calculated by performing vector subtraction on the lists and computing the Euclidean norm of the resultant vector.

Try it online

Clojure, 48 bytes

#(Math/sqrt(apply +(for[d(map - % %2)](* d d))))

05AB1E, 4 bytes

-nOt

Try it online!

Negative not y'all!

-    # a-b
n   # (a-b)**2
O  # sum((a-b)**2) for all a,b
t # sqrt(sum((a-b)**2) for all a,b)

Elixir, 74 bytes

:math.sqrt Enum.reduce Enum.zip(p,q),0,fn({a,b},c)->:math.pow(a-b,2)+c end

You can try it online

• Welcome to PPCG! Nice first post! Nov 24 '17 at 2:15

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

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

TI-Basic is a tokenized language.

Prompts for input as two lists, and returns the Euclidian distance betwrrn them in Ans

Explanation:

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