задача
Для заданного входного списка целых чисел x 1 … x n вычислить список рангов r 1 … r n (перестановка {1… n} ) так, чтобы x r 1 ≤ x r 2 ≤… ≤ x r n . Затем для каждого x i замените его ранг средним арифметическим рангов всех значений в x , равных x i . (То есть, когда есть связь между равными значениями в x , достаточно перераспределить ранги между всеми ними.) Выведите измененный список рангов r ' 1 … r'п .
(Для фанатов статистики: такое ранжирование наблюдений используется в U- тесте Манна – Уитни (метод 2, шаг 1.))
пример
Учитывая входной список [3, -6, 3, 3, 14, 3] , первым списком рангов будет [2, 1, 3, 4, 6, 5] , который будет сортировать список в [-6, 3, 3, 3, 3, 14] . Затем ранги всех 3 с в списке входов распределяются по (2 + 3 + 4 + 5) ÷ 4 = 3,5 . Окончательный результат составляет [3,5, 1, 3,5, 3,5, 6, 3,5] .
Контрольные примеры
[4, 1, 4] -> [2.5, 1.0, 2.5]
[5, 14, 14, 14, 14, 5, 14] -> [1.5, 5.0, 5.0, 5.0, 5.0, 1.5, 5.0]
[9, 9, -5, -5, 13, -5, 13, 9, 9, 13] -> [5.5, 5.5, 2.0, 2.0, 9.0, 2.0, 9.0, 5.5, 5.5, 9.0]
[13, 16, 2, -5, -5, -5, 13, 16, -5, -5] -> [7.5, 9.5, 6.0, 3.0, 3.0, 3.0, 7.5, 9.5, 3.0, 3.0]
правила
Это код-гольф , поэтому выигрывает самый короткий код в байтах.
Ответы:
Желе ,
108 байтСохранено 2 байта с помощью
cmp
трюка из ответа @ xnor .Попробуйте онлайн! или проверьте все контрольные примеры .
Как это работает
источник
Пиф, 12
Тестирование
Для каждого значения это вычисляет среднее арифметическое
[1..frequency]
и добавляет количество значений меньше текущего.Это работает, потому что для каждого значения мы вычисляем:
который мы можем упростить до:
и снова:
Тем не менее, в Pyth было сложнее вычислить первое слагаемое, используя среднее значение, а не эту другую формулу.
источник
Python 2, 51 байт
Для каждого элемента
y
, тоcmp
выражение дает 2 очка за каждый меньше ,x
и 1 балл за каждый равенx
. Эта сумма пересчитывается в правильный диапазон путем добавления 1 и деления пополам. Это2.
необходимо, чтобы избежать целочисленного деления.Python 3, 52 байта
В Python 3 отсутствуют
cmp
булевы выражения (+2 байта), но есть деление с плавающей запятой (-1 байт).источник
MATL , 14 байтов
Попробуйте онлайн! Или проверьте все контрольные примеры (слегка измененная версия кода; каждый результат находится в отдельной строке).
источник
05AB1E , 13 байтов
Код:
Использует кодировку CP-1252 . Попробуйте онлайн! ,
источник
R,
1712 байтПринимает вход от выходов STDIN к STDOUT. Если вывод является гибким, то мы можем отказаться
cat()
.Довольно просто, использует встроенный ранг, который по умолчанию усредняется для тай-брейка.
В использовании:
источник
cat()
, если это до меня. Я не знаю, что такое консенсус сообщества.J, 18 байт
На основе решения Денниса с использованием метода xnor .
Использование прямого подхода требует от меня 24 байта .
использование
источник
На самом деле, 18 байт
Попробуйте онлайн!
По сути это порт решения xnor Python .
Объяснение:
источник
APL, 17 символов
Предполагая, что список хранится в
X
.Объяснение:
Обратите внимание, что APL оценивает выражения справа налево. Затем:
∘.=⍨X
=X∘.=X
где∘.=
это внешнее произведение, используемое в=
качестве двоичной функции. (Там, где вы обычно умножаете. Таким образом, математический внешний продукт может быть записан как∘.×
.)y
иy
складывается напрямую, используя+
для определения вектора количество равных объектов для каждого ранга (давайте назовем егоz←+/y
).⍋X
возвращает в рядыX
y+.×⍋X
дает внутреннее произведение нашей матрицы у с этим вектором.z
.источник
Юлия, 30 байт
Это использует подход из ответа @ xnor . Джулия
cmp
, но это не векторизация.Попробуйте онлайн!
источник
JavaScript (ES6),
4948 байтРедактировать: 1 байт сохранен путем переформулировки выражения, чтобы оно теперь выглядело как ответ @ xnor's Python 3.
источник