Сортировка точек по линейному расстоянию в трехмерном пространстве


15

Спекуляции

  1. У вас есть кубическое трехмерное пространство 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 и размер трехмерного куба 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в качестве параметра?
Кристиан Лупаску

@ Голф волк, если тебе это не нужно, не бери это.
Марио

2
Я настоятельно рекомендую указать, какую метрику вы хотите использовать. Некоторые люди используют евклидову метрику (ρ = √ [(x₁-x₂) ² + (y₁-y₂) ² + (z₁-z₂) ²])), другие используют манхэттенскую метрику (ρ = | x₁-x₂ | + | y₁-y₂ | + | z₁-z₂ |). На мой взгляд, все должны использовать одну и ту же метрику.
Ramillies

4
@Ramillies: Задача определяет линейное расстояние, которое, на мой взгляд, является евклидовым . Я бы не назвал Манхэттен линейным, но я согласен с тем, что конкретное указание метрики, которую следует использовать, затруднит неправильное понимание проблемы.
Эминья,

1
Не говори линейно, скажи евклидово.
Линдон Уайт

Ответы:


11

05AB1E , 4 байта

ΣαnO

Попробуйте онлайн!

объяснение

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

Зачем вам нужен n?
Эрик Outgolfer

@EriktheOutgolfer: Может быть, этот небольшой пример может показать разницу между квадратом и нет.
Emigna

Итак, все делают это неправильно или все делают это правильно?
Эрик Outgolfer

@EriktheOutgolfer: я не проверил все ответы, но большинство, кажется, правильно.
Эминья,

Многие ответы не совпадают, поэтому я и спросил, поскольку они используют один и тот же алгоритм.
Эрик 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изнутри sort.

1
@ThePirateBay: Нил не делает карри!
Лохматый

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.

РЕДАКТИРОВАТЬ : «если вам это не нужно, не берите его» сохраненные 2 байта.



4

R , 56 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 байт

Этот ответ не короче ответа Нейла , но я решил опубликовать его, чтобы продемонстрировать использование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

Джапт , 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 байтов, но это требует дополнительного тестирования. РЕДАКТИРОВАТЬ: обе версии терпят неудачу на 2-й и 3-й тестовых случаях.
Лохматый

@ Шэгги, я никогда не осознавал, что могу íпринять аргументы в обратном порядке, это довольно мило. Я тоже думаю, что это должно работать; Я буду запускать некоторые другие тестовые случаи и редактировать, когда вернусь к компьютеру.
Джастин Маринер

Примечание: -или 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 - сумма
   ð - запускает отдельную двоичную цепочку.
      - Вывод неявно.

Сохраните байт с помощью ạS¥Þ(не заметили ваш ответ перед отправкой моего).
Эрик Outgolfer

Хм ... Я думаю, вам придется вернуться к 5 байтам, так как я обнаружил, что вам нужноạ²SµÞ
возвести

@EriktheOutgolfer Думаю, я исправил это сейчас. Не уверен, хотя
г-н Xcoder

Вы должны возвести в квадрат перед суммированием (векторизацией), а не после.
Эрик Outgolfer

@EriktheOutgolfer Теперь все должно быть в порядке
мистер Xcoder

2

Perl 6 , 35 байт (33 символа)

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

Попробуйте онлайн!

Объяснение: Это берет список с координатами базовой точки (вызываемой @b), затем список списков с координатами других точек (вызываемой @p). В блоке вы можете использовать их на лету, используя ^символ. Каждая из ^переменных d соответствует одному аргументу. (Они отсортированы в алфавитном порядке, поэтому @^b1-й аргумент и@^p 2-й.) После одного использования этого символа вы можете использовать переменную как обычно.

Заявление @^b просто для того, чтобы сказать, что блок будет принимать аргумент базовой точки, который используется только внутри блока сортировки. (В противном случае он будет ссылаться на аргумент блока сортировки.) Метод .sortможет принимать один аргумент. Если это блок с 1 аргументом (как здесь), массив сортируется в соответствии со значениями этой функции. Сам блок просто берет каждую точку по очереди и архивирует ее с помощью минуса ( Z-) с координатами базовой точки. Затем мы возводим в квадрат все элементы в списке »²и суммируем их, используя [+].

В качестве дополнительного бонуса, это будет работать и с координатами с плавающей точкой, и в любом измерении (если, конечно, вы предоставляете одинаковое количество координат для всех точек, это будет правильно).


Это больше не действует. Я оставляю это здесь просто для удовольствия.

Perl 6 , 24 байта - только шутка!

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

Попробуйте онлайн!

Поскольку в OP не указывается, какая метрика должна использоваться, в этом представлении выбирается дискретная метрика. В этой метрике расстояние между двумя точками равно 0, если они идентичны, и 1, если они не совпадают. Легко проверить, что это действительно метрика (если ρ (A, B) - это расстояние от A до B, мы требуем, чтобы 1) ρ (A, B) = 0 тогда и только тогда, когда 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

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 Упс, исправлено
Роберто Грэхем

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 байт), принимая в 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.