Oto kolejny prosty:
Wyzwanie
Biorąc pod uwagę dwa punkty w przestrzeni n-wymiarowej, wypisz odległość między nimi, zwaną także odległością euklidesową.
- Współrzędne będą liczbami wymiernymi; jedynymi ograniczeniami są ograniczenia twojego języka.
- Najniższy wymiar to 1, najwyższy to wszystko, co twój język może obsłużyć
- Możesz założyć, że dwa punkty mają ten sam wymiar i że nie będzie pustych danych wejściowych.
- Odległość musi być poprawna do co najmniej 3 miejsc po przecinku. Jeśli twój język nie obsługuje liczb zmiennoprzecinkowych, wypisz najbliższą liczbę całkowitą.
Zasady
- Jak zwykle dozwolona funkcja lub pełny program.
- Dane wejściowe mogą być pobierane z argumentów STDIN, wiersza polecenia lub funkcji.
- Format wejściowy zależy od Ciebie, określ, którego użyłeś w swojej odpowiedzi.
- Dane wyjściowe mogą być dostarczane poprzez drukowanie na standardowe wyjście lub zwracanie wartości.
- To jest golf golfowy, więc wygrywa najmniej bajtów! W przypadku remisu wygrywa wcześniejsza odpowiedź.
Przypadki testowe
Każdy punkt jest reprezentowany przez listę długości 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
Happy Coding!
code-golf
number
arithmetic
geometry
Denker
źródło
źródło
Odpowiedzi:
MATL , 2 bajty
Wypróbuj online !
ZP
Funkcja (odpowiadające Matlabapdist2
) oblicza wszystkie odległości pomiędzy dwoma parami zbiorów punktów, przy użyciu odległości euklidesowej domyślnie. Każdy zestaw punktów jest macierzą, a każdy punkt jest rzędem. W tym przypadku daje jeden wynik, który jest odległością między dwoma punktami.źródło
MATL,
3 bajty4,0Dzięki za -1 autor: @AndrasDeak!
Odczytuje dwa wektory (poprzez niejawne dane wejściowe wymagane przez
-
), a następnie odejmuje je i oblicza normę ich różnicyZn
.Wypróbuj online!
źródło
Pyth, 2 bajty
Dosłownie funkcja, która rozwiązuje ten problem
Wypróbuj tutaj.
źródło
Galaretka , 4 bajty
Wypróbuj online!
Jak to działa
źródło
Mathematica, 11 bajtów
Wprowadź jako dwie listy, a jako liczbę. Jeśli dane wejściowe są dokładne (liczby całkowite, racjonalne itp.), Dane wyjściowe również będą dokładne. Jeśli dane wejściowe zawierają liczby zmiennoprzecinkowe, dane wyjściowe również będą zmiennoprzecinkowe.
źródło
EuclideanDistance
działałoby też ładnie ... gdyby nazwa nie była tak cholernie długa! Gdyby tylko było „MATL dla Mathematica”, byłby to jeden bajt =)Oktawa, 15 bajtów
Przykład:
źródło
CJam,
118 bajtówDzięki Dennis za oszczędność 3 bajtów.
Uruchom wszystkie przypadki testowe.
Wyjaśnienie
Zobacz tę wskazówkę, dlaczego
:mh
działa.źródło
:mh
jest naprawdę bardzo przyjemnaHaskell, 46 bajtów
Haskell, 35 bajtów (autor @nimi)
Haskell, 31 bajtów
<hack>
</hack>
Przykłady:
źródło
map
+uncurry
+zip
Rzadko opłaca, użyciezipWith
:d a=sqrt.sum.zipWith(((^2).).(-))a
.(.)
zawsze zwraca funkcję, która bierze tylko jeden argument ... Myślę, że możesz zrobić coś takiego (()). (.), Ale to naprawdę nie jest tego warte.APL,
1411 bajtówJest to ciąg funkcji dynamicznych, który bierze wektory po lewej i prawej stronie i zwraca normę euklidesową ich różnicy.
Wyjaśnienie:
Wypróbuj tutaj
Zaoszczędzono 3 bajty dzięki Dennisowi!
źródło
.5*⍨(+/-×-)
oszczędza kilka bajtów.J, 9 bajtów
Jest to funkcja, która bierze jeden zestaw współrzędnych od drugiego (
-/>
), a następnie wykonuje sumę+
pod&.
kwadratem*:
.Dane wejściowe powinny mieć format, w
x y z;a b c
którymx y z
jest twój pierwszy zestaw współrzędnych, aa b c
drugi.źródło
>
and specify that input should be given asx y z,:a b c
.Java,
130117114107105 bytesThis 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:
Ungolfed:
źródło
for
loop be compressed todouble x=0,s;for(int i=0;++i<a.length;s=a[i]-b[i],x+=s*s);
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.public
in front of the method to save 7 bytes, and you can also place thex+=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.for(int i=0;i<a.length;x+=s*s)s=a[i]-b[i++];
(and I also changed the-1
to0
for an additional byte)0
by using the operator precedence rules! Thanks for saving me a whole lot of bytes.Julia, 16 bytes
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.
źródło
golflua, 43 chars
Works by calling it as
A Lua equivalent would be
źródło
Seriously, 12 bytes
Try it online!
Explanation:
źródło
Ruby, 52
In test program
źródło
AppleScript,
241239 bytesThis is golfed code, but I've put comments in in the form
--
.This uses the same algorithm as most of the other programs here.
źródło
Perl 6,
30292624 bytes(Thanks @b2gills for 2 more bytes lost)
usage
źródło
{sqrt [+] ([Z-] $_)»²}
JavaScript
ES7, 45ES6, 37 bytesExpects 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: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?)źródło
a=>b=>Math.hypot(...a.map((t,i)=>t-b[i]))
Python 2, 47 bytes
A straight forward solution. The function expects 2 points as sequences of numbers, and returns the distance between them.
Example:
źródło
𝔼𝕊𝕄𝕚𝕟, 6 chars / 13 bytes
Try it here (Firefox only).
Calculates norm of difference of input arrays.
źródło
Scala,
6762 bytesRequires input as a
sequence/vector ofvar-arg tuplesExample:
źródło
C#, 72 bytes
A simple solution using Linq.
źródło
Sage, 35 bytes
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
źródło
TI-Basic (TI-84 Plus CE), 15 bytes
TI-Basic is a tokenized language.
Prompts for input as two lists, and returns the Euclidian distance betwrrn them in
Ans
Explanation:
źródło
R, 4 bytes
This is a built-in function to calculate the distance matrix of any input matrix. Defaults to euclidean distance.
Example usage:
If you're feeling disappointed because it's a built-in, then here's a non-built-in (or at least, it's less built-in...) version for 22 bytes (with thanks to Giuseppe):
This is an anonymous function that takes two vectors as input.
źródło
function(x,y)norm(x-y,"F")
is shorter than your second version.Haskell, 32 bytes
źródło
map
and parentheses).sqrt$sum$(^2)<$>zipWith(-)
is not a valid anonymous function. The underlying rule is actually quite simple: If you can writef = <mycode>
andf
afterwards performs the required task, then<mycode>
is a valid anonymous function. In your case you need to addf p q = <mycode> p q
, so<mycode>
on it's own is not valid.Python 3, 70 Chars
Loops through, finding the square of the difference and then the root of the sum:
źródło
sum([(x-y)**2 for x,y in zip(a,b)])**.5
Mathcad, bytes
Uses the built-in vector magnitude (absolute value) operator to calculate the size of the difference between the two points (expressed as vectors).
Mathcad golf size on hold until I get (or somebody else gets) round to opening up the discussion on meta. However, the shortest way (assuming that input of the point vectors doesn't contribute to the score) is 3 "bytes" , with 14 bytes for the functional version.
źródło
Pyke, 7 bytes
Try it here!
Transpose, apply subtract, map square, sum, sqrt.
źródło
Ruby, 50 bytes
Zip, then map/reduce. Barely edges out the other Ruby answer from @LevelRiverSt by 2 bytes...
Try it online
źródło