Учитывая - мерный вектор с вещественными элементами, найти ближайший перестановку из относительно -Расстояние.
Детали
- Если это более удобно, можно использовать перестановки вместо этого. Если имеется несколько ближайших перестановок, вы можете вывести любую или поочередно все из них.
- Расстояние между двумя векторами определяется как
- Если вы хотите, вы можете предположить, что входные данные состоят исключительно из целых чисел.
Примеры
[0.5 1] -> [1 2], [2 1]
c*[1 1 ... 1] -> any permutation
[1 4 2 6 2] -> [1 4 3 5 2], [1 4 2 5 3]
[1 3 5 4 1] -> [2 3 5 4 1], [1 3 5 4 2]
[7 7 3 2 5 6 4 2] -> [8 7 3 2 5 6 4 1], [8 7 3 1 5 6 4 2], [7 8 3 2 5 6 4 1], [7 8 3 1 5 6 4 2]
[-2 4 5 7 -1 9 3] -> [1 4 5 6 2 7 3], [2 4 5 6 1 7 3], [1 4 5 7 2 6 3], [2 4 5 7 1 6 3]
[0 4 2 10 -1 10 5] -> [1 4 2 6 3 7 5], [1 4 3 6 2 7 5], [2 4 3 6 1 7 5], [3 4 2 6 1 7 5], [1 4 2 7 3 6 5], [1 4 3 7 2 6 5], [2 4 3 7 1 6 5], [3 4 2 7 1 6 5]
Octave скрипт для генерации большего количества примеров.
v
, будут больше, чем0
? Или, по крайней мере, нет0
?v
могут быть любыми целыми числами. (Добавил еще несколько примеров.)[1.6 2]
это важный тестовый пример (жадный алгоритм / лексикографическая сортировка дает неправильный ответ).Ответы:
Python 2 , 60 байт
Попробуйте онлайн!
Использует нулевую индексацию.
Быстрый алгоритм с простой идеей. Если вместо этого мы должны переставить список ввода , чтобы сделать его как можно ближе к( 1 , 2 , . . . , П ) , насколько это возможно, мы должны просто разбирайтесь, как доказано ниже. Поскольку мы вместо перестановки ( 1 , 2 , . . . , П ) , мы выбираем перестановку , что заказали точно так же , как список ввода, как в моем вызове Подражать упорядоченность ( за исключением ввода может быть повторы). (Изменить: мили указали на этот более идентичный вызов , где Деннис имеет тот же ответ .)
Note that the only property of( 1 , 2 , . . . , П ) that we used is that it's sorted, so the same algorithm would work to permute any given list to minimize its distance to any fixed list.
In the code, the only purpose of
z=zip(l,range(len(l)))
is to make the input elements distinct, that is to avoid ties, while keeping the same comparisons between unequal elements. If the input we guaranteed to have no repeats, we could remove this and just havelambda l:map(sorted(l).index,l)
.источник
05AB1E , 7 байтов
Попробуйте онлайн!
объяснение
источник
Perl 6 , 44 байта
Попробуйте онлайн!
Анонимный кодовый блок, который возвращает первую минимальную перестановку с индексированием 0.
Объяснение:
Я думаю, что я также мог бы избавиться от
.sum
и отсортировать только по списку абсолютных значений, но я не уверен, что это действительно неверно, хотя и проходит мои текущие тестовые случаи.источник
[0.6 1]
(при условии, что мы проиндексированы 0), где, если вы оптимизируете первое значение, полученное[1,0]
для оценки 1,4, но если вы оптимизируете для всего вектора, 1 более ценно во второй позиции для оценки 0,6.Желе , 8 байт
Попробуйте онлайн!
источник
Желе , 5 байт
Монадическая ссылка, принимающая список чисел, который выдает список целых чисел.
Попробуйте онлайн! Или посмотрите набор тестов .
Как?
NB
L
(длина) будет работать вместо того, чтобыJ
с тех пор, какœ?
дано целое числоn
, справа будет неявно сделать диапазон[1..n]
для работы, ноJ
явно.источник
Рубин ,
6360 байтПопробуйте онлайн!
Здесь есть математический трюк, который может быть полезен и в других ответах - вместо того, чтобы минимизировать сумму абсолютных значений разностей, мы максимизируем сумму продуктов. Почему это работает?
Минимизация суммы
(x-y) squared
не эквивалентна минимизации суммы|x-y|
, но она всегда даст верный ответ, она просто придает приоритет сокращению больших различий по сравнению с маленькими, тогда как реальная задача безразлична между ними.Но
(x-y)*(x-y)
=x*x+y*y-2*x*y
. Поскольку квадратные члены всегда будут отображаться где-то в сумме для любой перестановки, они не влияют на результат, поэтому мы можем упростить до-2*x*y
. В2
сглаживает, поэтому мы можем упростить-x*y
. Тогда, если мы изменим минимизацию на максимизацию, мы можем упростить доx*y
.Интуитивно это похоже на наблюдение того, что, если вы пытаетесь максимизировать квадратные метры, используя набор горизонтальных и вертикальных стен, лучше всего объединить стены, близкие по размеру друг к другу, для создания комнат, которые будут как можно ближе к квадрату.
3*3 + 4*4 = 25
, пока3*4 + 4*3 = 24
.Редактировать: Сохранение трех байтов путем генерации и оценки строки формата вместо использования zip и sum.
источник
Gaia , 13 байт
Попробуйте онлайн!
источник
JavaScript (ES6), 61 байт
Основано на проницательности xnor .
Попробуйте онлайн!
комментарии
JavaScript (ES6),
130128 байтТам
должен быть ,безусловно , является более прямым путем ...0 индексированные.
Попробуйте онлайн! (с 1-индексированным выходом)
Как?
Вспомогательная функцияграмм вычисляет все перестановки ( 0 , . . . , П - 1 ) , где N неявная длина входного массива [] ,
Для каждой перестановкип мы вычисляем:
В конечном итоге мы возвращаем перестановку, которая приводит к наименьшемуК ,
источник
Wolfram Language (Mathematica) , 14 байтов
Попробуйте онлайн!
Основано на проницательности xnor .
источник
Python 2 ,
149126112 байтов-23 байта благодаря мистеру Xcoder
-14 байт благодаря xnor
Попробуйте онлайн!
Использует перестановки (0 ... n-1).
источник
functools
.reduce
обычно излишним, особенно здесь, где вы добавляете вещи. Я думаю, что вы можете просто сделатьsum(abs(p-q)for p,q in zip(x,a))
.без любого пакета перестановок
Python 3 , 238 байт
Попробуйте онлайн!
источник
Wolfram Language (Mathematica) , 57 байтов
Попробуйте онлайн!
источник
Japt
-g
, 12 байтПопытайся
For 0-indexed, replace the first 2 bytes with
m,
to map the array to its indices instead.источник
J ,
258 байтПопробуйте онлайн!
Гораздо более короткий ответ основан на блестящей идее xnor.
оригинальный ответ
J , 25 байт
Попробуйте онлайн!
источник