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. 또한 기준점x,y,z정수 좌표 와 3D 큐브 크기 를 입력으로 얻습니다 . 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매개 변수로 사용해야 합니까?
Cristian Lupascu

@GolfWolf 필요하지 않으면 가져 가지 마십시오.
마리오

2
사용하려는 측정 항목을 지정하는 것이 좋습니다. 어떤 사람들은 유클리드 메트릭 (ρ = √ [(x₁-x₂) ² + (y₁-y₂) ² + (z₁-z₂) ²])을 사용하고 다른 사람들은 맨해튼 메트릭 (ρ = | x₁-x₂ | + | y₁-y₂)을 사용합니다 | + | z₁-z₂ |). 제 생각에는 모든 사람이 동일한 측정 항목을 사용해야합니다.
Ramillies

4
@Ramillies : 도전 은 내 마음에 유클리드 인 선형 거리 를 지정합니다 . 맨해튼을 선형 이라고 부르지는 않지만 , 어떤 메트릭을 사용해야하는지 지정하면 문제를 오해하기가 더 어려워집니다.
Emigna

1
유클리드가 선형이라고 말하지 마십시오.
Lyndon White

답변:


11

05AB1E , 4 바이트

ΣαnO

온라인으로 사용해보십시오!

설명

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

왜 필요한 n가요?
아웃 골퍼 에릭

@EriktheOutgolfer : 아마도이 작은 예 는 제곱의 차이와 그렇지 않은 차이를 보여줄 수 있습니다.
Emigna

그래서 모두 잘못하고 있습니까? 아니면 모두 올바르게하고 있습니까?
아웃 골퍼 에릭

@EriktheOutgolfer : 모든 답변을 확인하지는 않았지만 대부분 올바른 것 같습니다.
Emigna

많은 답변이 제곱되지 않으므로 정확히 동일한 알고리즘을 사용하기 때문에 내가 묻는 이유입니다.
아웃 골퍼 에릭

6

자바 스크립트 (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내부의 카레와 이동 정의를 사용하여 바이트를 절약 할 수 있다고 생각합니다 sort.

1
@ThePirateBay : 닐은 카레를하지 않습니다!
얽히고 설킨

6

하스켈 , 54 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

R , 56 40 바이트

다른 입력 형식을 제안한 flodel 덕분에 -16 바이트

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처럼 취할 수 있으며 대신에 할 수 있습니다! 3xncolSums((P-B)^2)
주세페

3

Mathematica, 24 바이트

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

형식으로 입력을 f[B][P]받습니다.

x중첩 함수를 만들려면 4 바이트를 사용해야 합니다.  ( \[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 코어) , 68 57 53 + 23 18 바이트

Emigna 덕분에 -11 바이트

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

자바 스크립트 (ES6), 72 71 바이트

이것은 Neil의 대답 보다 짧지는 않지만 어쨌든 그것을 사용하기 위해 그것을 게시 할 것이라고 생각했습니다.Math.hypot() ES6에 도입 된 .

커링 구문에서 입력을받습니다 (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

Japt , 10 9 바이트

@Shaggy 덕분에 -1 바이트

ñ_íaV m²x

점을 3 개 항목 배열의 배열로 취하고 기준점을 단일 배열로이 순서대로 가져옵니다. 크기 인수를 사용하지 않습니다.

온라인으로 사용해보십시오! 또는 거대한 테스트 사례 를 실행하여 줄에 -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 Online 에서 사용해보십시오 !

설명

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-합계
   ð-별도의 2 차원 체인을 시작합니다.
      -암시 적으로 출력합니다.

바이트를 저장하십시오 ạS¥Þ(내 게시물을 게시하기 전에 답변을 보지 못했습니다).
아웃 골퍼 에릭

흠 ... 나는 당신이 제곱해야한다는 것을ạ²SµÞ
알았으므로

@EriktheOutgolfer 나는 지금 그것을 고쳤다 고 생각한다. 확실하지 않음
Mr. Xcoder

이후가 아니라 합산 (벡터화) 전에 제곱해야합니다.
Outgolfer Erik

@EriktheOutgolfer 괜찮을
거야

2

Perl 6 , 35 바이트 (33 자)

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

온라인으로 사용해보십시오!

설명 : 이것은 기준점의 좌표가있는 목록 ( @b)과 다른 점의 좌표가있는 목록 ()을 갖습니다 @p. 블록에서 ^기호를 사용하여 즉시 사용할 수 있습니다 . 각 ^'d 변수는 하나의 인수에 해당합니다. 알파벳순으로 정렬되므로 @^b첫 번째 인수와 @^p두 번째 인수도 마찬가지 입니다 .이 기호를 한 번 사용한 후에는 변수를 정상적으로 사용할 수 있습니다.

이 문장 @^b은 블록이 기준점 인수를 취한다고 말하면서 정렬 블록 내부에서만 사용됩니다. (그렇지 않으면 정렬 블록의 인수를 참조합니다.)이 메소드 .sort는 하나의 인수를 취할 수 있습니다. 인수가 1 인 인수 (예 : 여기)를 가진 블록이면 배열은 해당 함수의 값에 따라 정렬됩니다. 블록 자체는 각 점을 차례로 가져와 Z-기준점 좌표와 함께 빼기 ( )로 압축합니다 . 그런 다음 목록의 모든 요소를 ​​제곱 »²하고을 사용하여 합계합니다 [+].

추가 보너스로, 이것은 부동 좌표와 함께 작동하며 모든 차원에서 작동합니다 (모든 점에 대해 동일한 수의 좌표를 제공하면 올바른 일을합니다).


더 이상 유효하지 않습니다. 나는 단지 재미를 위해 여기에 둡니다.

Perl 6 , 24 바이트 – 단지 농담!

{@^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

코 틀린 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].
Olivier Grégoire

@ OlivierGrégoire Oops, 고정
Roberto Graham

픽스 + 골프 : 대신에 매개 변수로 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 바이트) . List<int[]>int[][]
Olivier Grégoire

1
아, 대부분의 경우는 아니지만 캐스트없이 pow작업 +=합니다. 알고 반갑습니다!
Olivier Grégoire

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). 최대 링크 크기에 맞추려면 테스트 스위트를 더 작게 만들어야합니다.
Mr. Xcoder

@ Mr.Xcoder 감사합니다. 나는 그것을 고쳤다.
Jakube

1

펄 5 , 90 바이트

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

온라인으로 사용해보십시오!

입력은 개행으로 분리 된 점 목록이며, 첫 번째는 기준점이고 마지막은 후행 줄 바꿈입니다. []좌표 주위의 괄호 ( )는 선택 사항입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.