Сортуйте точки за лінійною відстані в тривимірному просторі


15

Технічні характеристики

  1. У вас є кубічний 3D-простір цілочисельних одиниць x,y,zрозміру S, наприклад 0 <= x,y,z <= S.
  2. Ви отримуєте від методів введення по замовчуванням масив точок , Pпредставлених в вигляді x,y,zцілих координат, в будь-якому зручному форматі , як вам подобається, наприклад: [x1,y1,z1],[x2,y2,z2],[x3,y3,z3] ... [xn,yn,zn].
  3. Усі Pзначення будуть знаходитись у вищезазначеному кубічному тривимірному просторі, наприклад 0 <= x,y,z <= S.
  4. Можлива загальна кількість Pбуде .1 <= P <= S3
  5. Ви також отримуєте x,y,zцілі координати базової точки B та розмір 3D куба S.

Завдання

Ваша мета - вивести у бажаному форматі точки, 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, якщо він вам не потрібен, не приймайте його.
Маріо

2
Настійно рекомендую вказати, який саме показник ви бажаєте використовувати. Одні користуються евклідовою метрикою (ρ = √ [(x₁-x₂) ² + (y₁-y₂) ² + (z₁-z₂) ²]), інші використовують метрику Манхеттена (ρ = | x₁-x₂ | + | y₁-y₂ | + | z₁-z₂ |). На мою думку, всі повинні використовувати однакову метрику.
Рамілья

4
@Ramillies: виклик визначає лінійну відстань, яка, на мій погляд, є евклідовою . Я б не називав Манхеттен лінійним, але я погоджуюся, що конкретизація конкретної метрики, яка використовується, повинна ускладнити неправильне розуміння проблеми.
Емінья

1
Не кажіть лінійну, скажімо, Евклідова.
Ліндон Уайт

Відповіді:


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: Можливо, цей невеликий приклад може показати різницю між квадратом та ні.
Емінья

Отже, чи всі роблять неправильно чи всі роблять правильно?
Erik the Outgolfer

@EriktheOutgolfer: Я не перевірив усіх відповідей, але більшість, здається, є правильними.
Емінья

Багато відповідей не квадратичні, тому я запитав, оскільки вони використовують саме той самий алгоритм.
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))

Я думаю, ви можете зберегти байт, скориставшись currying і переміщення визначення gвсередині sort.

1
@ThePirateBay: Ніл не манить!
Shaggy

6

Haskell , 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.

EDIT : "якщо він вам не потрібен, не бери його", збережено 2 байти.



4

R , 56 40 байт

-16 байт завдяки флоделю за те, що він пропонує інший формат введення

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

Спробуйте в Інтернеті!

Приймає Pяк 3xnматрицю точок, тобто кожен стовпець є точкою; вихід у тому ж форматі.

За допомогою функції helper gперетворіть список балів Pіз тестових випадків у відповідний формат R.


1
Може бути , замінити sapply()з colSums((t(P)-B)^2), де вхід Pбуде матриця?
флодель

@flodel, якщо я буду робити це, я можу взяти Pза 3xnматрицю і просто зробити це colSums((P-B)^2)замість цього!
Джузеппе

3

Математика, 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 Core) , 68 57 53 + 23 18 байт

-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

JavaScript (ES6), 72 71 байт

Цей не коротший, ніж відповідь Ніла , але я думав, що все-таки опублікую його, щоб продемонструвати використання 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

Japt , 10 9 байт

-1 байт завдяки @Shaggy

ñ_íaV m²x

Приймає точки як масив трипозиційних масивів, а базову - єдиний масив у такому порядку. Не приймає аргумент розміру.

Спробуйте в Інтернеті! або запустити величезний тестовий приклад з -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 байт, але для цього потрібно ще тестування. EDIT: Обидві версії виходять з ладу у 2-му та 3-му тестових випадках.
Кудлатий

@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 байт

Збережено 1 байт завдяки Leaky Nun .

ạ²SðÞ

Спробуйте в Інтернеті!

Пояснення

ạ²SðÞ

    Þ - Сортування за функцією клавіш.
ạ - Абсолютна різниця з елементами другого вхідного списку.
 ² - площа. Векторизує.
  S - сума.
   ð - запускає окремий діадичний ланцюг.
      - Результат неявно.

Збережіть байт за допомогою ạS¥Þ(не помітив Вашої відповіді перед публікацією шахти).
Erik the Outgolfer

Хм ... я думаю, що вам доведеться повернутися до 5 байт, оскільки я виявив, що вам потрібно квадрат :ạ²SµÞ
Ерік Аутгольфер

@EriktheOutgolfer Я думаю, що зараз це виправили. Не впевнений, хоча
містер Xcoder

Потрібно вивести квадрат перед підсумовуванням (векторизацією), а не після.
Ерік Аутгольфер

@EriktheOutgolfer Мав би бути зараз добре
містер Xcoder

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

Спробуйте в Інтернеті!

Оскільки в ОП не вказано, який показник буде використовуватися, це уявлення вибирає використовувати дискретний показник. У цій метриці відстань між двома точками дорівнює 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, велике спасибі Я не знаю, про що думав ... Незабаром виправлюсь.
Рамілья

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

Java 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égoire На жаль, виправлено
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[][].
Олів'є Грегоар

1
О, powце працює в +=без кастингу, не в більшості інших випадків. Добре знати!
Олів'є Грегоар

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;}))
Невай,

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

@ 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}<>

Спробуйте в Інтернеті!

Вхід - це список розділених новим рядком точок, причому перший - базовий, а останній - зворотний. Дужки ( []) навколо координат необов’язкові.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.