在3D空间中按线性距离对点进行排序


15

眼镜

  1. 您具有x,y,z大小为S整数单位的立方3D空间,例如0 <= x,y,z <= S
  2. 您可以从获得的默认输入法的点数组P表示x,y,z整数坐标,在任何合理的格式,只要你喜欢,例如:[x1,y1,z1],[x2,y2,z2],[x3,y3,z3] ... [xn,yn,zn]
  3. 所有P值将在上述立方3D空间中,例如0 <= x,y,z <= S
  4. 的总数可能P为。1 <= P <= S3
  5. 您还将获得基点和3D立方体大小的x,y,z整数坐标作为输入。 BS

任务

您的目标是以您喜欢的格式输出P按距基准点 的线性(欧几里得)距离排序的B

规则

  1. 如果发现多个P等距点,则B必须P按您的首选顺序输出所有等距。
  2. 一个点P可能与吻合B,因此它们的距离为0,您必须输出该点。
  3. 这是一个挑战,所以最短的代码胜出。
  4. 禁止出现标准漏洞
  5. 代码说明表示赞赏。

测试用例

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]

1
是否真的有必要将其S作为参数?
克里斯蒂安·卢帕斯库

@GolfWolf如果您不需要它,请不要接受。
马里奥(Mario)

2
我强烈建议您指定要使用的一种指标。某些人使用欧几里德度量(ρ=√[(x₁-x²)²+(y₁-y_2)²+(z₁-z²)²]),另一些人则使用曼哈顿度量(ρ= |x₁-x²| + |y₁-y² | + |z₁-z²|)。我认为每个人都应该使用相同的指标。
拉米利斯

4
@Ramillies:挑战指定了线性距离,在我看来是欧几里得。我不会将Manhattan称为线性,但我同意明确指定要使用的度量标准应该会更难于理解挑战。
艾米尼亚

1
欧几里得说,不要说线性。
Lyndon White

Answers:


11

05AB1E,4个字节

ΣαnO

在线尝试!

说明

Σ        # sort by
   O     # sum of
  n      # square of
 α       # absolute difference between current value and second input

为什么需要n
Erik the Outgolfer

@EriktheOutgolfer:也许这个小例子可以显示平方和不平方的区别。
Emigna

那么,是每个人做错了还是每个人做对了?
Erik the Outgolfer

@EriktheOutgolfer:我没有检查所有答案,但是大多数似乎是正确的。
Emigna

许多答案并不一致,这就是我问的原因,因为它们使用的是完全相同的算法。
Erik the Outgolfer

6

JavaScript(ES6),71个字节

(b,a,g=a=>a.reduce((d,c,i)=>d+(c-=b[i])*c,0))=>a.sort((b,a)=>g(b)-g(a))

我认为您可以通过使用g内部的currying和move定义节省一个字节sort

1
@ThePirateBay:尼尔不做客!
毛茸茸的

6

Haskell54 52字节

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

在线尝试!

我不需要空间的大小。sum.map(^2).zipWith(-)o计算从一个点到o:的距离(xo-xp)^2+(yo-yp)^2+(zo-zp)^2。这些点仅按到的距离排序o

编辑:“如果您不需要它,请不要接受”保存2个字节。



4

R56 40字节

-16个字节,感谢flodel建议使用其他输入格式

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

在线尝试!

注意到P作为一个3xn点的矩阵,即,每列是一个点; 输出格式相同。

使用助手功能将测试案例g中的点列表P转换为适当的R格式。


1
也许替换sapply()colSums((t(P)-B)^2),其中输入P将是一个矩阵?
flodel

@flodel如果我要这样做,我不妨将其P作为一个3xn矩阵colSums((P-B)^2)来代替!
朱塞佩

3

Mathematica,24个字节

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

接受格式为的输入f[B][P]

我们必须使用4个字节x来制作嵌套函数。 (\[Function])和的优先级//很好地计算出来,因此表达式与此等效:

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

我们需要,N因为默认情况下,Mathematica按表达式结构而不是按值排序:

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

SortBy[N][{1, Sqrt@2, 2}]
{1, Sqrt[2], 2}

3

C#(.NET Core)68 57 53 + 23 18字节

-11字节归功于Emigna

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

字节数还包括

using System.Linq;

在线尝试!

点被视为整数的集合。说明:

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
    )

3

JavaScript(ES6),72 71字节

这个答案并不比Neil的答案短,但是我想无论如何我都会张贴它来演示Math.hypot()ES6中引入的的用法。

以currying语法接受输入(p)(a),其中p = [x,y,z]是基点,a是其他点的数组。

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


3

k,14个字节

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

在线尝试!

{            } /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

此外,这适用于n个维度,但不限于3。


3

Japt10 9字节

-1字节感谢@Shaggy

ñ_íaV m²x

按此顺序将点作为三项数组的数组,将基点作为单个数组。不采用size参数。

在线尝试!或运行巨大的测试用例,每行-R输出一个x,y,z

说明

ñ_            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

很好:) 在工作开始之前,我只有11个字节
毛茸茸的

看起来应该可以使用9个字节,但是还需要更多测试。编辑:两个版本在第二个和第三个测试用例上均失败。
毛茸茸的

@Shaggy我从未意识到í可以反过来接受它的参数,这非常好。我也认为它应该起作用;我将运行其他一些测试用例,并在返回计算机时进行编辑。
贾斯汀·马里纳

注意:-n也可以代替a
毛茸茸的

2

MATL,7个字节

yZP&SY)

输入为:以点为行的3列矩阵,以及以基点为单位的3列向量。

MATL在线上尝试一下

说明

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)

2

果冻,5字节

感谢Leaky Nun节省了1个字节。

ạ²SðÞ

在线尝试!

说明

S²SðÞ

    Þ-按键功能排序。
ạ-与第二个输入列表中的元素的绝对差。
 ²-正方形。向量化。
  S-总和
   ð-启动单独的二元链。
      -隐式输出。

保存一个字节ạS¥Þ(在发布我的消息之前不会注意到您的答案)。
Erik the Outgolfer

嗯...我认为您将不得不回到5个字节,因为我发现您需要平方ạ²SµÞ
Erik the Outgolfer

@EriktheOutgolfer我想我现在已解决它。不知道,虽然
Xcoder先生

您需要在求和(向量化)之前平方,而不是在平方之后。
Erik the Outgolfer

@EriktheOutgolfer应该现在可以
Xcoder先生17年

2

Perl 6,35个字节(33个字符)

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

在线尝试!

说明:这将获取具有基点坐标的列表(称为@b),然后是具有其他点坐标的列表的列表(称为@p)。在一个块中,您可以使用^符号即时使用它们。每个^'d变量都对应一个参数。(它们按字母顺序排序,@^b第一个参数和@^p第二个参数也是如此。)在使用此符号后,可以正常使用该变量。

该语句@^b只是说该块将采用基点参数,该基点参数仅在排序块内部使用。(否则,它将引用排序块的参数。)该方法.sort可以采用一个参数。如果它是一个带有1个参数的块(如此处所示),则根据该函数的值对数组进行排序。块本身只是依次获取每个点,并在其Z-基点坐标处加上减号()。然后,我们将列表中的所有元素»²与平方,并使用对其求和[+]

另外,它也适用于浮点坐标,并且在任何维度上都可以使用(显然,只要您为所有点提供相同数量的坐标,它就会做正确的事情)。


这不再有效。我把它留在这里只是为了好玩。

Perl 6字节—只是个玩笑!

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

在线尝试!

由于OP没有说明应使用哪个指标,因此此提交选择使用离散指标。在此度量标准中,如果两个点相同,则它们之间的距离为0,否则为1。可以很容易地检查出这确实是一个度量(如果ρ(A,B)是从A到B的距离,我们要求1)ρ(A,B)= 0 iff A = B,2)ρ(A,B )=ρ(B,A),3)ρ(A,B)+ρ(B,C)≥ρ(A,C)(“三角形不等式”)。

它可能打得更多,但我并不是认真的意思。


不适用于<5 5 5>,(<5 5 10>,<6 5 5>)。列表不是按总和排序,而是按元素进行比较。你需要一个sum地方。
nwellnhof

@nwellnhof,非常感谢。我不知道我在想什么...很快就会解决。
Ramillies

2

Kotlin 1.1,58个字节

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

美化

// 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()
    }
}

测试

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

2

爪哇8,194 + 31 214 169 163 123 112 106 + 19个 109 103字节

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

在线尝试!


错误的结果:base=[2,3,3], points=[4,3,3],[1,3,4]。您的结果是[4,3,3], [1,3,4],而正确的结果是[1,3,4],[4,3,3]
OlivierGrégoire17年

@OlivierGrégoire糟糕,固定
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字节),假设以a List<int[]>作为参数,而不是int[][]
OlivierGrégoire17年

1
哦,pow确实可以在+=没有强制转换的情况下工作,而在其他大多数情况下则不会。很高兴知道!
OlivierGrégoire17年

103字节: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个字节

o.a,vz

在线尝试: 演示

说明:

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

1
Herokuapp说:Bad Request: Request Line is too large (7005 > 4094)。您应该缩小测试套件以适合最大链接大小。
Xcoder先生17年

@ Mr.Xcoder谢谢。我修好了它。
雅库布

1

Perl 5,90个字节

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

在线尝试!

输入是换行符分隔的点列表,第一个是基点,最后一个是尾随换行符。括号([]坐标周围的方)是可选的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.