En voici une autre simple:
Le défi
Étant donné deux points dans un espace à n dimensions, affichez la distance entre eux, également appelée distance euclidienne.
- Les coordonnées seront des nombres rationnels; les seules limites sont les restrictions de votre langue.
- La dimension la plus basse est 1, la plus élevée est tout ce que votre langue peut gérer
- Vous pouvez supposer que les deux points sont de la même dimension et qu'il n'y aura aucune entrée vide.
- La distance doit être correcte à au moins 3 décimales. Si votre langue ne prend pas en charge les nombres à virgule flottante, affichez le nombre entier le plus proche.
Règles
- Comme d'habitude, fonction ou programme complet autorisé.
- L'entrée peut provenir de STDIN, de la ligne de commande ou des arguments de fonction.
- Le format d'entrée dépend de vous, spécifiez celui que vous avez utilisé dans votre réponse.
- La sortie peut être fournie en imprimant sur stdout ou sur la valeur de retour.
- C'est le golf par code, donc le nombre d'octets le plus bas gagne! En cas d'égalité, la réponse précédente l'emporte.
Cas de test
Chaque point est représenté par une liste de longueur 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
Codage heureux!
code-golf
number
arithmetic
geometry
Denker
la source
la source
Réponses:
MATL , 2 octets
Essayez-le en ligne !
La
ZP
fonction (correspondant à MATLABpdist2
) calcule toutes les distances par paires entre deux ensembles de points, en utilisant la distance euclidienne par défaut. Chaque ensemble de points est une matrice et chaque point est une ligne. Dans ce cas, il produit un seul résultat, qui est la distance entre les deux points.la source
MATL,
3 octets4.0Merci pour -1 par @AndrasDeak!
Lit deux vecteurs (via une entrée implicite demandée par
-
) puis soustrait ceux-ci et calcule la norme de leur différence avecZn
.Essayez-le en ligne!
la source
Pyth, 2 octets
Littéralement une fonction qui résout ce problème
Essayez-le ici.
la source
Gelée , 4 octets
Essayez-le en ligne!
Comment ça marche
la source
Mathematica, 11 octets
Entrez comme deux listes, sortez comme un nombre. Si l'entrée est exacte (entiers, rationnels, etc.), la sortie sera également exacte. Si l'entrée contient un nombre à virgule flottante, la sortie sera également un flottant.
la source
EuclideanDistance
fonctionnerait bien aussi ... si le nom n'était pas si long! Si seulement il y avait "MATL pour Mathematica", ce serait un seul octet =)Octave, 15 octets
Exemple:
la source
CJam,
118 octetsMerci à Dennis d'avoir économisé 3 octets.
Exécutez tous les cas de test.
Explication
Voir cette astuce pour savoir pourquoi
:mh
fonctionne.la source
:mh
est vraiment très bienHaskell, 46 octets
Haskell, 35 octets (par @nimi)
Haskell, 31 octets
<hack>
</hack>
Exemples:
la source
map
+uncurry
+zip
rarely pays off, usezipWith
:d a=sqrt.sum.zipWith(((^2).).(-))a
.(.)
always returns a function that takes only one argument... I think you can do something like (.).(.), but that isn't really worth it.APL,
1411 bytesThis is dyadic function train that takes the vectors on the left and right and returns the Euclidean norm of their difference.
Explanation:
Try it here
Saved 3 bytes thanks to Dennis!
la source
.5*⍨(+/-×-)
saves a few bytes.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
wherex y z
is your first set of co-ordinates anda b c
is the other.la source
>
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:
la source
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.
la source
golflua, 43 chars
Works by calling it as
A Lua equivalent would be
la source
Seriously, 12 bytes
Try it online!
Explanation:
la source
Ruby, 52
In test program
la source
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.
la source
Perl 6,
30292624 bytes(Thanks @b2gills for 2 more bytes lost)
usage
la source
{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?)la source
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:
la source
𝔼𝕊𝕄𝕚𝕟, 6 chars / 13 bytes
Try it here (Firefox only).
Calculates norm of difference of input arrays.
la source
Scala,
6762 bytesRequires input as a
sequence/vector ofvar-arg tuplesExample:
la source
C#, 72 bytes
A simple solution using Linq.
la source
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
la source
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:
la source
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.
la source
function(x,y)norm(x-y,"F")
is shorter than your second version.Haskell, 32 bytes
la source
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:
la source
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.
la source
Pyke, 7 bytes
Try it here!
Transpose, apply subtract, map square, sum, sqrt.
la source
Ruby, 50 bytes
Zip, then map/reduce. Barely edges out the other Ruby answer from @LevelRiverSt by 2 bytes...
Try it online
la source