Trier les points par distance linéaire dans un espace 3D

15

Spécifications

  1. Vous disposez d'un espace 3D cubique x,y,zd' Sunités de taille entières, telles que 0 <= x,y,z <= S.
  2. Vous obtenez de méthodes d'entrée par défaut un tableau de points Preprésentés comme x,y,zcoordonnées entières, dans tout format raisonnable que vous le souhaitez, par exemple: [x1,y1,z1],[x2,y2,z2],[x3,y3,z3] ... [xn,yn,zn].
  3. Toutes les Pvaleurs seront dans ledit espace 3D cubique ci-dessus, comme 0 <= x,y,z <= S.
  4. Le nombre total possible de Psera .1 <= P <= S3
  5. Vous obtenez également en entrée les x,y,zcoordonnées entières du point de base B et la taille du cube 3D S.

Tâche

Votre objectif est de sortir, dans votre format préféré, les points Ptriés par la distance linéaire (euclidienne) du point de base B .

Règles

  1. Si vous trouvez plusieurs points Péquidistants, Bvous devez sortir tous les équidistants Pdans votre ordre préféré.
  2. Il est possible qu'un point Pcoïncide avec B, de sorte que leur distance soit 0, vous devez sortir ce point.
  3. C'est un défi de , donc le code le plus court l'emporte.
  4. Les failles standard sont interdites.
  5. Les explications du code sont appréciées.

Cas de test

Input:
S (size), [B (base point x,y,z)], [P1 (x,y,z)], [P2], [P3], [P4], [P5], [...], [Pn]
10, [5,5,5], [0,0,0], [10,10,10], [2,0,8], [10,3,1], [4,4,5], [5,5,5], [5,5,4]

Output:
[5,5,5], [5,5,4], [4,4,5], [2,0,8], [10,3,1], [0,0,0], [10,10,10]

- - -

Input:
5, [2, 3, 3], [3, 0, 4], [5, 0, 3], [0, 2, 4], [0, 3, 5], [4, 2, 1], [2, 2, 2], [3, 1, 2], [3, 1, 0], [1, 3, 2], [2, 3, 1], [3, 1, 5], [4, 0, 0], [4, 3, 1], [0, 5, 5], [1, 5, 1], [3, 1, 4], [2, 2, 2], [0, 2, 5], [3, 3, 5], [3, 3, 0], [5, 4, 5], [4, 1, 3], [5, 1, 1], [3, 5, 3], [1, 5, 3], [0, 5, 2], [4, 3, 3], [2, 1, 1], [3, 3, 0], [5, 0, 4], [1, 5, 2], [4, 2, 3], [4, 2, 1], [2, 5, 5], [3, 4, 0], [3, 0, 2], [2, 3, 2], [3, 5, 1], [5, 1, 0], [2, 4, 3], [1, 0, 5], [0, 2, 5], [3, 4, 4], [2, 4, 0], [0, 1, 5], [0, 5, 4], [1, 5, 1], [2, 1, 0], [1, 3, 4], [2, 2, 2], [4, 2, 4], [5, 5, 4], [4, 4, 0], [0, 4, 1], [2, 0, 3], [3, 1, 5], [4, 4, 0], [2, 5, 1], [1, 2, 4], [4, 3, 1], [0, 2, 4], [4, 5, 2], [2, 0, 1], [0, 0, 2], [4, 1, 0], [5, 4, 3], [2, 5, 2], [5, 4, 4], [4, 4, 3], [5, 5, 1], [4, 0, 2], [1, 3, 5], [4, 2, 0], [0, 3, 1], [2, 2, 0], [0, 4, 5], [3, 2, 0], [0, 2, 1], [1, 2, 2], [2, 5, 3], [5, 5, 2], [5, 2, 4], [4, 5, 5], [2, 1, 2], [5, 4, 3], [4, 5, 4], [2, 3, 1], [4, 4, 4], [3, 0, 0], [2, 4, 5], [4, 3, 3], [3, 5, 3], [4, 0, 0], [1, 1, 1], [3, 1, 3], [2, 5, 5], [0, 0, 5], [2, 0, 2], [1, 0, 3], [3, 1, 4], [1, 2, 5], [4, 1, 3], [1, 4, 5], [3, 1, 4], [3, 5, 1], [5, 1, 4], [1, 0, 4], [2, 2, 0], [5, 2, 1], [0, 5, 3], [2, 1, 1], [0, 3, 0], [4, 5, 5], [3, 4, 2], [5, 3, 3], [3, 1, 1], [4, 0, 1], [5, 0, 5], [5, 0, 4], [1, 4, 3], [5, 4, 2], [5, 4, 0], [5, 1, 0], [0, 0, 1], [5, 3, 0]

Output:
[2, 4, 3], [2, 3, 2], [1, 3, 4], [1, 3, 2], [2, 2, 2], [1, 4, 3], [2, 2, 2], [2, 2, 2], [1, 2, 2], [3, 4, 2], [1, 2, 4], [3, 4, 4], [2, 5, 3], [4, 3, 3], [2, 3, 1], [4, 3, 3], [2, 3, 1], [1, 3, 5], [4, 4, 3], [2, 5, 2], [3, 1, 3], [1, 5, 3], [4, 2, 3], [2, 1, 2], [3, 5, 3], [2, 4, 5], [3, 3, 5], [3, 5, 3], [3, 1, 4], [0, 2, 4], [0, 2, 4], [1, 2, 5], [3, 1, 2], [3, 1, 4], [3, 1, 4], [4, 2, 4], [1, 4, 5], [4, 4, 4], [1, 5, 2], [4, 3, 1], [0, 5, 3], [2, 1, 1], [4, 1, 3], [4, 3, 1], [2, 5, 5], [0, 3, 5], [4, 1, 3], [2, 5, 1], [2, 1, 1], [0, 3, 1], [2, 5, 5], [1, 1, 1], [0, 4, 5], [4, 5, 4], [4, 5, 2], [0, 2, 1], [1, 5, 1], [5, 3, 3], [0, 5, 2], [3, 5, 1], [3, 5, 1], [0, 2, 5], [1, 5, 1], [4, 2, 1], [3, 1, 5], [3, 1, 1], [0, 2, 5], [4, 2, 1], [0, 5, 4], [0, 4, 1], [2, 0, 3], [3, 1, 5], [2, 4, 0], [2, 2, 0], [2, 0, 2], [3, 3, 0], [3, 3, 0], [5, 4, 3], [1, 0, 3], [5, 4, 3], [2, 2, 0], [3, 0, 2], [5, 4, 4], [5, 4, 2], [1, 0, 4], [3, 0, 4], [5, 2, 4], [3, 2, 0], [3, 4, 0], [0, 1, 5], [0, 5, 5], [4, 5, 5], [4, 5, 5], [0, 3, 0], [2, 0, 1], [2, 1, 0], [4, 4, 0], [5, 1, 4], [5, 5, 4], [5, 2, 1], [3, 1, 0], [5, 4, 5], [4, 4, 0], [1, 0, 5], [4, 2, 0], [0, 0, 2], [4, 0, 2], [5, 5, 2], [4, 1, 0], [5, 5, 1], [0, 0, 1], [5, 1, 1], [4, 0, 1], [0, 0, 5], [5, 0, 3], [5, 3, 0], [5, 4, 0], [3, 0, 0], [5, 0, 4], [5, 0, 4], [5, 1, 0], [4, 0, 0], [4, 0, 0], [5, 0, 5], [5, 1, 0]

- - -

Input:
10, [1, 9, 4], [4, 6, 2], [7, 5, 3], [10, 5, 2], [9, 8, 9], [10, 5, 10], [1, 5, 4], [8, 1, 1], [8, 6, 9], [10, 4, 1], [3, 4, 10], [4, 7, 0], [7, 10, 9], [5, 7, 3], [6, 7, 9], [5, 1, 4], [4, 3, 8], [4, 4, 9], [6, 9, 3], [8, 2, 6], [3, 5, 1], [0, 9, 0], [8, 4, 3], [0, 1, 1], [6, 7, 6], [4, 6, 10], [3, 9, 10], [8, 3, 1], [10, 1, 1], [9, 10, 6], [2, 3, 9], [10, 5, 0], [3, 2, 1], [10, 2, 7], [8, 4, 9], [5, 2, 4], [0, 8, 9], [10, 1, 6], [0, 8, 10], [5, 10, 1], [7, 4, 5], [4, 5, 2], [0, 2, 0], [8, 3, 3], [6, 6, 6], [3, 0, 2], [0, 1, 1], [10, 10, 8], [6, 2, 8], [8, 8, 6], [5, 4, 7], [10, 7, 4], [0, 9, 2], [1, 6, 6], [8, 5, 9], [3, 7, 4], [5, 6, 6], [3, 1, 1], [10, 4, 5], [1, 5, 7], [8, 6, 6], [4, 3, 7], [2, 1, 0], [6, 4, 2], [0, 7, 8], [8, 3, 6], [9, 2, 0], [1, 3, 8], [4, 4, 6], [5, 8, 9], [9, 4, 4], [0, 7, 3], [8, 3, 4], [6, 7, 9], [8, 7, 0], [0, 7, 7], [8, 10, 10], [10, 2, 5], [6, 9, 5], [6, 2, 7], [0, 9, 6], [1, 4, 1], [4, 3, 1], [5, 7, 3], [9, 6, 8], [4, 1, 7], [4, 0, 8], [3, 4, 7], [2, 3, 6], [0, 0, 7], [5, 3, 6], [7, 3, 4], [6, 7, 8], [3, 7, 9], [1, 9, 10], [2, 1, 2], [2, 8, 2], [0, 3, 0], [1, 1, 9], [3, 5, 2], [10, 5, 3], [5, 2, 9], [6, 9, 0], [9, 5, 0], [7, 1, 10], [3, 3, 8], [2, 5, 1], [3, 10, 10], [6, 2, 2], [10, 7, 2], [4, 3, 1], [4, 2, 1], [4, 2, 8], [6, 8, 5], [3, 10, 0], [1, 1, 7], [6, 9, 6], [6, 2, 4], [5, 5, 7], [5, 4, 5], [9, 8, 1], [9, 8, 1], [0, 10, 6], [1, 1, 9], [3, 8, 8], [3, 1, 5], [5, 7, 4], [4, 3, 6], [5, 4, 7], [6, 0, 8], [7, 8, 1], [9, 8, 4], [2, 10, 0], [3, 4, 5], [9, 3, 10], [7, 4, 1], [2, 1, 9], [10, 8, 1], [10, 3, 7], [2, 0, 6], [3, 8, 4], [10, 0, 2], [9, 9, 10], [8, 9, 5], [4, 10, 2], [8, 3, 4], [4, 2, 10], [9, 1, 6], [6, 1, 3], [4, 1, 3], [2, 9, 0], [5, 6, 5], [8, 8, 3], [5, 5, 0], [7, 6, 9], [1, 1, 5], [3, 0, 4], [1, 10, 6], [8, 0, 2], [0, 7, 3], [8, 9, 8], [2, 1, 8], [3, 1, 10], [4, 5, 9], [7, 6, 10], [3, 6, 10], [5, 9, 8], [9, 3, 3], [2, 2, 3], [9, 9, 0], [7, 2, 2], [0, 0, 9], [8, 7, 4], [9, 2, 9], [0, 6, 4], [9, 4, 3], [10, 1, 3], [5, 9, 10], [5, 10, 6], [6, 3, 10], 

Output: 
[1, 10, 6], [3, 8, 4], [0, 9, 6], [0, 9, 2], [2, 8, 2], [0, 7, 3], [0, 7, 3], [0, 10, 6], [3, 7, 4], [0, 6, 4], [1, 6, 6], [0, 7, 7], [4, 10, 2], [1, 5, 4], [0, 9, 0], [2, 9, 0], [2, 10, 0], [5, 7, 4], [5, 7, 3], [5, 10, 6], [5, 7, 3], [0, 7, 8], [3, 10, 0], [3, 8, 8], [4, 6, 2], [3, 5, 2], [1, 5, 7], [5, 10, 1], [6, 9, 3], [6, 9, 5], [5, 6, 5], [2, 5, 1], [0, 8, 9], [6, 8, 5], [5, 6, 6], [6, 9, 6], [4, 5, 2], [4, 7, 0], [3, 5, 1], [3, 4, 5], [5, 9, 8], [6, 7, 6], [3, 7, 9], [1, 4, 1], [1, 9, 10], [4, 4, 6], [0, 8, 10], [6, 6, 6], [3, 4, 7], [3, 9, 10], [5, 5, 7], [3, 10, 10], [2, 3, 6], [6, 9, 0], [5, 8, 9], [5, 4, 5], [6, 7, 8], [7, 8, 1], [5, 5, 0], [4, 3, 6], [3, 6, 10], [8, 9, 5], [5, 4, 7], [4, 5, 9], [5, 4, 7], [2, 2, 3], [8, 8, 3], [1, 3, 8], [5, 9, 10], [0, 3, 0], [7, 5, 3], [8, 7, 4], [4, 3, 1], [8, 8, 6], [6, 4, 2], [4, 3, 7], [6, 7, 9], [4, 6, 10], [4, 3, 1], [6, 7, 9], [3, 3, 8], [5, 3, 6], [4, 4, 9], [4, 3, 8], [8, 6, 6], [3, 2, 1], [7, 4, 5], [7, 10, 9], [2, 3, 9], [5, 2, 4], [1, 1, 5], [3, 4, 10], [8, 9, 8], [9, 8, 4], [0, 2, 0], [4, 2, 1], [3, 1, 5], [2, 1, 2], [8, 7, 0], [9, 10, 6], [7, 4, 1], [7, 6, 9], [7, 3, 4], [1, 1, 7], [0, 1, 1], [4, 2, 8], [9, 8, 1], [0, 1, 1], [4, 1, 3], [6, 2, 4], [9, 8, 1], [8, 4, 3], [3, 1, 1], [6, 2, 2], [5, 1, 4], [9, 9, 0], [7, 6, 10], [2, 1, 0], [2, 1, 8], [4, 1, 7], [8, 6, 9], [6, 2, 7], [8, 3, 4], [8, 3, 4], [10, 7, 4], [3, 0, 4], [8, 3, 3], [8, 10, 10], [2, 0, 6], [9, 6, 8], [10, 7, 2], [1, 1, 9], [8, 3, 6], [1, 1, 9], [7, 2, 2], [3, 0, 2], [9, 4, 4], [8, 5, 9], [2, 1, 9], [6, 1, 3], [6, 2, 8], [5, 2, 9], [9, 4, 3], [9, 8, 9], [0, 0, 7], [10, 8, 1], [4, 2, 10], [8, 3, 1], [9, 5, 0], [6, 3, 10], [10, 10, 8], [10, 5, 3], [8, 4, 9], [9, 9, 10], [10, 5, 2], [9, 3, 3], [8, 2, 6], [3, 1, 10], [4, 0, 8], [0, 0, 9], [10, 4, 5], [10, 5, 0], [10, 4, 1], [8, 1, 1], [6, 0, 8], [10, 3, 7], [9, 2, 0], [10, 2, 5], [9, 1, 6], [10, 5, 10], [8, 0, 2], [9, 3, 10], [7, 1, 10], [9, 2, 9], [10, 2, 7], [10, 1, 3], [10, 1, 6], [10, 1, 1], [10, 0, 2]

- - -

Input:
10000, [8452, 3160, 6109], [7172, 5052, 4795], [9789, 4033, 2952], [8242, 213, 3835], [177, 7083, 908], [3788, 3129, 3018], [9060, 464, 2701], [6537, 8698, 291], [9048, 3860, 6099], [4600, 2696, 4854], [2319, 3278, 9825]

Output:
[9048, 3860, 6099], [7172, 5052, 4795], [9789, 4033, 2952], [8242, 213, 3835], [4600, 2696, 4854], [9060, 464, 2701], [3788, 3129, 3018], [2319, 3278, 9825], [6537, 8698, 291], [177, 7083, 908]
Mario
la source
1
Faut-il vraiment prendre Scomme paramètre?
Cristian Lupascu du
@GolfWolf si vous n'en avez pas besoin, ne le prenez pas.
Mario
2
Je vous recommande fortement de spécifier le type de mesure que vous souhaitez que nous utilisions. Certaines personnes utilisent la métrique euclidienne (ρ = √ [(x₁-x₂) ² + (y₁-y₂) ² + (z₁-z₂) ²]), d'autres utilisent la métrique Manhattan (ρ = | x₁-x₂ | + | y₁-y₂ | + | z₁-z₂ |). À mon avis, tout le monde devrait utiliser la même métrique.
Ramillies
4
@Ramillies: Le défi spécifie une distance linéaire qui, dans mon esprit, est euclidienne . Je n'appellerais pas Manhattan linéaire, mais je conviens que la spécification spécifique de la métrique à utiliser devrait rendre plus difficile de mal comprendre le défi.
Emigna
1
Ne dites pas linéaire, dites euclidienne.
Lyndon White

Réponses:

11

05AB1E , 4 octets

ΣαnO

Essayez-le en ligne!

Explication

Σ        # sort by
   O     # sum of
  n      # square of
 α       # absolute difference between current value and second input
Emigna
la source
Pourquoi as-tu besoin n?
Erik the Outgolfer du
@EriktheOutgolfer: Peut - être que ce petit exemple peut montrer la différence entre la quadrature et non.
Emigna
Alors, est-ce que tout le monde le fait mal ou tout le monde le fait bien?
Erik the Outgolfer
@EriktheOutgolfer: Je n'ai pas vérifié toutes les réponses, mais la plupart semblent être correctes.
Emigna
Beaucoup de réponses ne concordent pas, c'est pourquoi j'ai demandé, car elles utilisent exactement le même algorithme.
Erik the Outgolfer
6

JavaScript (ES6), 71 octets

(b,a,g=a=>a.reduce((d,c,i)=>d+(c-=b[i])*c,0))=>a.sort((b,a)=>g(b)-g(a))
Neil
la source
Je pense que vous pouvez enregistrer un octet en utilisant le curry et la définition mobile de l' gintérieur sort.
1
@ThePirateBay: Neil ne fait pas de curry!
Shaggy
6

Haskell , 54 52 octets

import Data.List
f o=sortOn(sum.map(^2).zipWith(-)o)

Essayez-le en ligne!

Je n'ai pas besoin de la taille de l'espace. sum.map(^2).zipWith(-)ocalcule la distance d'un point à o: (xo-xp)^2+(yo-yp)^2+(zo-zp)^2. Les points sont simplement triés sur la distance à o.

EDIT : "si vous n'en avez pas besoin, ne le prenez pas" a sauvé 2 octets.

jferard
la source
4

R , 56 40 octets

-16 octets grâce à Flodel pour avoir suggéré un format d'entrée différent

function(P,B)P[,order(colSums((P-B)^2))]

Essayez-le en ligne!

Prend Pcomme 3xnmatrice de points, c'est-à-dire que chaque colonne est un point; la sortie est au même format.

Utilisez la fonction d'assistance gpour transformer la liste des points Pdes cas de test au format R approprié.

Giuseppe
la source
1
Peut-être remplacer le sapply()par colSums((t(P)-B)^2), où l'entrée Pserait une matrice?
flodel
@flodel si je vais faire ça, je peux aussi bien prendre Pcomme 3xnmatrice et juste faire à la colSums((P-B)^2)place!
Giuseppe
3

Mathematica, 24 octets

xN@Norm[#-x]&//SortBy

Prend la saisie dans le format f[B][P].

Nous devons utiliser 4 octets xpour créer la fonction imbriquée. La priorité de  ( \[Function]) et //fonctionne bien pour que l'expression soit équivalente à ceci:

Function[x, SortBy[N@Norm[# - x]&] ]

Nous en avons besoin Ncar par défaut, Mathematica trie par structure d'expression plutôt que par valeur:

Sort[{1, Sqrt@2, 2}]
{1, 2, Sqrt[2]}

SortBy[N][{1, Sqrt@2, 2}]
{1, Sqrt[2], 2}
hftf
la source
3

C # (.NET Core) , 68 57 53 + 23 18 octets

-11 octets grâce à Emigna

B=>P=>P.OrderBy(p=>p.Zip(B,(x,y)=>(x-y)*(x-y)).Sum())

Le nombre d'octets comprend également

using System.Linq;

Essayez-le en ligne!

Les points sont traités comme des collections d'entiers. Explication:

B => P =>                          // Take the base point and a collection of points to sort
    P.OrderBy(p =>                 // Order the points by:
        p.Zip(B, (x, y) =>         //     Take each point and combine it with the base:
            (x - y) * (x - y)      //         Take each dimension and measure their distance squared
        ).Sum()                    //     Sum of the distances in each dimension together
    )
Grzegorz Puławski
la source
3

JavaScript (ES6), 72 71 octets

Celui-ci n'est pas plus court que la réponse de Neil , mais j'ai pensé que je le Math.hypot()publierais quand même pour démontrer l'utilisation de , qui a été introduit dans ES6.

Prend l'entrée dans la syntaxe de curry (p)(a), où p = [x, y, z] est le point de base et a est le tableau des autres points.

p=>a=>a.sort((a,b)=>(g=a=>Math.hypot(...a.map((v,i)=>v-p[i])))(a)-g(b))

Arnauld
la source
3

k , 14 octets

{y@<+/x*x-:+y}

Essayez-le en ligne!

{            } /function(x,y)
           +y  /transpose y
        x-:    /w[j,i] = x[j] - y[j,i]
      x*       /w[j,i]*w[j,i]
    +/         /v[i] = sum over all j: w[j,i]
   <           /indices to sort by
 y@            /rearrange list of points by indices

En outre, cela fonctionne pour n dimensions et n'est pas limité à 3.

zgrep
la source
3

Japt , 10 9 octets

-1 octet grâce à @Shaggy

ñ_íaV m²x

Prend les points comme un tableau de tableaux à trois éléments et le point de base un tableau unique, dans cet ordre. Ne prend pas l'argument de taille.

Essayez-le en ligne! ou exécutez l' énorme cas de test avec -Rpour en produire un x,y,zpar ligne.

Explication

ñ_            Sort the input array as if each item were mapped through the function...
  í V         Pair the x,y,z in the current item with those in the base point, V
   a          Take the absolute different from each pair
      m²      Square each of the 3 differences
        x     Sum those squares
              Sorted array is implicitly returned
Justin Mariner
la source
Nice :) J'étais à 11 octets avant que le travail ne me gêne !
Shaggy
Il semble que cela devrait fonctionner pendant 9 octets, mais il a besoin de tests supplémentaires. EDIT: Les deux versions échouent sur les 2e et 3e cas de test.
Shaggy du
@Shaggy Je n'avais jamais réalisé que je ípouvais prendre ses arguments à l'envers, c'est plutôt sympa. Moi aussi, je pense que cela devrait fonctionner; Je vais exécuter certains des autres cas de test et les modifier lorsque je serai de retour sur un ordinateur.
Justin Mariner
Remarque: -ou nfonctionnerait également à la place de a.
Shaggy
2

MATL , 7 octets

yZP&SY)

Les entrées sont: matrice à 3 colonnes avec des points comme lignes et vecteur à 3 colonnes avec point de base.

Essayez-le sur MATL Online!

Explication

y   % Implicitly take two inputs: 3-column matrix and 3-row vector. Duplicate the first
    % STACK: input 1 (matrix), input 2 (vector), input 1 (matrix)
ZP  % Euclidean distance between rows of top two elements in stack
    % STACK: input 1 (matrix), distances (vector)
&S  % Sort and push the indices of the sorting (not the sorted values)
    % STACK: input 1 (matrix), indices (vector)
Y)  % Use as row indices. Implicitly display
    % STACK: final result (matrix)
Luis Mendo
la source
2

Gelée , 5 octets

1 octet enregistré, grâce à Leaky Nun .

ạ²SðÞ

Essayez-le en ligne!

Explication

ạ²SðÞ

    Þ - Trier par fonction de touche.
ạ - Différence absolue avec les éléments de la deuxième liste d'entrée.
 ² - Carré. Vectorise.
  S - Somme.
   ð - Démarre une chaîne dyadique distincte.
      - Sortie implicitement.
M. Xcoder
la source
Enregistrer un octet avec ạS¥Þ(je n'ai pas remarqué votre réponse avant de poster la mienne).
Erik the Outgolfer du
Hmm ... Je pense que vous devrez revenir à 5 octets car j'ai trouvé que vous devez mettre à la place :ạ²SµÞ
Erik the Outgolfer
@EriktheOutgolfer Je pense que je l'ai corrigé maintenant. Pas sûr cependant
M. Xcoder
Vous devez rectifier avant de sommer (vectoriser), pas après.
Erik the Outgolfer du
@EriktheOutgolfer Ça devrait aller maintenant
M. Xcoder
2

Perl 6 , 35 octets (33 caractères)

{@^b;@^p.sort:{[+] ($_ Z- @b)»²}}

Essayez-le en ligne!

Explication: Cela prend une liste avec les coordonnées du point de base (appelé @b), puis une liste des listes avec les coordonnées des autres points (appelé @p). Dans un bloc, vous pouvez les utiliser à la volée en utilisant le ^symbole. Chacune des ^variables 'd correspond à un argument. (Ils sont triés par ordre alphabétique, tout @^bcomme le 1er argument et @^ple 2e.) Après une utilisation de ce symbole, vous pouvez utiliser la variable normalement.

La déclaration @^b est là juste pour dire que le bloc prendra l'argument du point de base, qui n'est utilisé qu'à l'intérieur du bloc de tri. (Sinon, cela ferait référence à l'argument du bloc de tri.) La méthode .sortpeut prendre un argument. Si c'est un bloc prenant 1 argument (comme ici), le tableau est trié selon les valeurs de cette fonction. Le bloc lui-même prend chaque point à son tour et le zippe avec moins ( Z-) avec les coordonnées du point de base. Ensuite, nous cadrons tous les éléments de la liste avec »²et les additionnons à l'aide [+].

En prime, cela fonctionnera également avec les coordonnées flottantes et dans toutes les dimensions (tant que vous fournissez évidemment le même nombre de coordonnées pour tous les points, cela fait la bonne chose).


Ce n'est plus valable. Je le laisse ici juste pour le plaisir.

Perl 6 , 24 octets - seulement une blague!

{@^b;@^p.sort:{$_!~~@b}}

Essayez-le en ligne!

Étant donné que l'OP ne précise pas quelle métrique doit être utilisée, cette soumission choisit d'utiliser la métrique discrète. Dans cette métrique, la distance entre deux points est 0 s'ils sont identiques et 1 s'ils ne le sont pas. Il est facile de vérifier qu'il s'agit bien d'une métrique (si ρ (A, B) est la distance de A à B, il faut que 1) ρ (A, B) = 0 ssi A = B, 2) ρ (A, B ) = ρ (B, A), 3) ρ (A, B) + ρ (B, C) ≥ ρ (A, C) ("inégalité triangulaire")).

Il pourrait probablement être beaucoup plus joué au golf, mais je ne le pense pas sérieusement.

Ramillies
la source
Ne fonctionne pas pour <5 5 5>,(<5 5 10>,<6 5 5>). Les listes ne trient pas par leur somme, mais par comparaison élément par élément. Vous avez besoin d'un sumendroit.
nwellnhof
@nwellnhof, merci beaucoup. Je ne sais pas à quoi je pensais ... Je réparerai sous peu.
Ramillies
2

Kotlin 1.1, 58 octets

{t,i->i.sortedBy{it.zip(t).map{(f,s)->(f-s)*(f-s)}.sum()}}

Embellie

// t is the target, i is the list of inputs
{ t, i ->
    // Sort the inputs by the distance
    i.sortedBy {
        // For each dimension
        it.zip(t)
            // Calculate the square of the distance
            .map { (f, s) -> (f - s) * (f - s) }
            // Add up the squares
            .sum()
    }
}

Tester

var f: (List<Int>, List<List<Int>>) -> List<List<Int>> =
{t,i->i.sortedBy{it.zip(t).map{(f,s)->(f-s)*(f-s)}.sum()}}

data class TestData(val target: List<Int>, val input: List<List<Int>>, val output: List<List<Int>>)

fun main(args: Array<String>) {
    val items = listOf(
            TestData(listOf(5, 5, 5),
                    listOf(listOf(0, 0, 0), listOf(10, 10, 10), listOf(2, 0, 8), listOf(10, 3, 1), listOf(4, 4, 5), listOf(5, 5, 5), listOf(5, 5, 4)),
                    listOf(listOf(5, 5, 5), listOf(5, 5, 4), listOf(4, 4, 5), listOf(2, 0, 8), listOf(10, 3, 1), listOf(0, 0, 0), listOf(10, 10, 10))
            ),
            TestData(listOf(8452, 3160, 6109),
                    listOf(listOf(7172, 5052, 4795), listOf(9789, 4033, 2952), listOf(8242, 213, 3835), listOf(177, 7083, 908), listOf(3788, 3129, 3018), listOf(9060, 464, 2701), listOf(6537, 8698, 291), listOf(9048, 3860, 6099), listOf(4600, 2696, 4854), listOf(2319, 3278, 9825)),
                    listOf(listOf(9048, 3860, 6099), listOf(7172, 5052, 4795), listOf(9789, 4033, 2952), listOf(8242, 213, 3835), listOf(4600, 2696, 4854), listOf(9060, 464, 2701), listOf(3788, 3129, 3018), listOf(2319, 3278, 9825), listOf(6537, 8698, 291), listOf(177, 7083, 908))
            ))
    items.map { it to f(it.target, it.input) }.filter { it.first.output != it.second }.forEach {
        System.err.println(it.first.output)
        System.err.println(it.second)
        throw AssertionError(it.first)
    }
    println("Test Passed")
}
jrtapsell
la source
2

Java 8, 194 + 31 214 169 163 123 112 112 106 + 19 109 103 octets

B->P->P.sort(java.util.Comparator.comparing(p->{int d=0,i=0;while(i<3)d+=(d=p[i]-B[i++])*d;return d;}))

Essayez-le en ligne!

Roberto Graham
la source
De mauvais résultats: base=[2,3,3], points=[4,3,3],[1,3,4]. Votre résultat est [4,3,3], [1,3,4], tandis que le résultat correct est [1,3,4],[4,3,3].
Olivier Grégoire
@ OlivierGrégoire Oups, fixe
Roberto Graham
Fix + golf: b->l->{l.sort(java.util.Comparator.comparing(p->{int d=0,i=3;for(;i-->0;)d+=(b[i]-p[i])*(b[i]-p[i]);return d;}));}(114 octets), en supposant un List<int[]>paramètre as au lieu de int[][].
Olivier Grégoire
1
Oh, powça marche +=sans casting, pas dans la plupart des autres cas. Bon à savoir!
Olivier Grégoire
103 octets:B->P->P.sort(java.util.Comparator.comparing(p->{int d=0,i=0;while(i<3)d+=(d=p[i]-B[i++])*d;return d;}))
Nevay
1

Pyth, 6 octets

o.a,vz

Essayez-le en ligne: Démonstration

Explication:

o.a,vzNQ   implicit variables at the end
o      Q   order the points from the first input line by:
 .a           the euclidean distance between
      N       the point
   ,          and
    vz        the point from the second input line
Jakube
la source
1
Herokuapp dit: Bad Request: Request Line is too large (7005 > 4094). Vous devez réduire la taille de votre suite de tests afin de l'adapter à la taille de lien maximale.
M. Xcoder du
@ Mr.Xcoder Merci. Je l'ai corrigé.
Jakube
1

Perl 5 , 90 octets

sub v{$i=$t=0;$t+=($_-$p[$i++])**2for pop=~/\d+/g;$t}@p=<>=~/\d+/g;say sort{v($a)<=>v$b}<>

Essayez-le en ligne!

L'entrée est une liste de points séparés par des sauts de ligne, le premier étant le point de base et le dernier ayant un saut de ligne final. Les crochets ( []) autour des coordonnées sont facultatifs.

Xcali
la source