Вам дан непустой список натуральных чисел, например
[6 2 9 7 2 6 5 3 3 4]
Вы должны ранжировать эти числа по их значению, но, как обычно в списках лидеров, если есть связь, тогда все связанные числа получают одинаковый ранг, и соответствующее количество рангов пропускается. Поэтому ожидаемый результат для приведенного выше списка будет
[3 9 1 2 9 3 5 7 7 6]
Например, самое высокое значение на входе было 9
, поэтому оно становится 1
(первый ранг). Третье по величине значение 6
, так что оба 6
становятся 3
, и ранг 4
полностью пропускается.
правила
Вы можете использовать любой удобный, однозначный, плоский формат списка для ввода и вывода. Первый / наименьший ранг в выходных данных всегда должен быть 1 .
Вы можете написать программу или функцию и использовать любой из наших стандартных методов получения ввода и предоставления вывода.
Вы можете использовать любой язык программирования , но учтите, что эти лазейки по умолчанию запрещены.
Это код-гольф , поэтому самый короткий действительный ответ - измеренный в байтах - выигрывает.
Тестовые случаи
[8] -> [1]
[1 15] -> [2 1]
[18 14 11] -> [1 2 3]
[11 16 14 8] -> [3 1 2 4]
[15 15 15 15 15] -> [1 1 1 1 1]
[10 2 5 4 15 5] -> [2 6 3 5 1 3]
[5 5 10 10 5 11 18] -> [5 5 3 3 5 2 1]
[2 4 9 4 17 9 17 16] -> [8 6 4 6 1 4 1 3]
[11 17 19 17 10 10 15 3 18] -> [6 3 1 3 7 7 5 9 2]
[2 11 4 8 3 3 12 20 4 18] -> [10 4 6 5 8 8 3 1 6 2]
[12 6 10 2 19 19 6 19 8 6 18] -> [5 8 6 11 1 1 8 1 7 8 4]
[5 6 14 19 13 5 19 9 19 9 9 19] -> [11 10 5 1 6 11 1 7 1 7 7 1]
[9 2 12 3 7 11 15 11 6 8 11 17 11] -> [8 13 3 12 10 4 2 4 11 9 4 1 4]
[3 5 15 7 18 5 3 9 11 2 18 1 10 19] -> [11 9 4 8 2 9 11 7 5 13 2 14 6 1]
[6 11 4 19 14 7 13 16 10 12 7 9 7 10 10] -> [14 6 15 1 3 11 4 2 7 5 11 10 11 7 7]
[11 20 11 1 20 16 11 11 4 8 9 7 11 14 10 14] -> [6 1 6 16 1 3 6 6 15 13 12 14 6 4 11 4]
[4 7 15 2 3 2 3 1 14 2 10 4 7 6 11 2 18] -> [9 6 2 13 11 13 11 17 3 13 5 9 6 8 4 13 1]
[5 1 17 7 1 9 3 6 9 7 6 3 2 18 14 4 18 16] -> [12 17 3 8 17 6 14 10 6 8 10 14 16 1 5 13 1 4]
[5 6 8 10 18 13 20 10 7 1 8 19 20 10 10 18 7 2 1] -> [16 15 11 7 4 6 1 7 13 18 11 3 1 7 7 4 13 17 18]
[12 17 8 2 9 7 15 6 19 5 13 16 14 20 10 11 18 4 3 1] -> [9 4 13 19 12 14 6 15 2 16 8 5 7 1 11 10 3 17 18 20]
источник
indexOf
функции. Я считаю, что для несортированного ввода есть более короткие альтернативы на многих языках.Ответы:
Обходной путь в Excel для глупых правил, касающихся входных данных мыши при обмене стеками Code Golf: (WESRRMICGSE) 28 байт
rank(RC[1],r1c1:r1024:c1024)
Ввести список как csv (
10,23,34,2,
) в компилятор после ввода источника. без кавычек, без скобок, запятая.WESRRMICGSE точно так же, как программирование в Excel, за исключением того, что вы можете опустить начальный знак '=', чтобы сохранить байт. Различие в функциональности происходит из-за того, что WESRRMICGSE будет либо перетаскивать формулу вниз, чтобы автоматически копировать код и предоставлять разные выходные данные с одним целочисленным вводом. если в качестве входных данных указан список, этот список помещается в столбец B (столбец ввода), а формула автоматически выводит лекарство, чтобы соответствовать количеству входных данных. (Например: ввод 34,21,45 «перетянет» формулу вниз на 2 ячейки, в общей сложности на 3 ячейки с формулой).
Изменить: я никогда не ожидал, что этот ответ будет популярным. Вот Это Да!
источник
MATL , 4 байта
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Python 2, 41 байт
Для каждого значения найдите его индекс в списке, отсортированном по убыванию. Чтобы наибольшее значение давало 1 вместо 0, мы используем дополнительный элемент «бесконечность» самого списка, так как Python 2 обрабатывает списки как больше, чем числа.
Более прямое решение составляет 42 байта и также работает в Python 3.
Для каждого элемента подсчитывает количество меньших элементов, добавляя 1 к сдвигу в 1.
источник
Желе , 5 байт
Попробуйте онлайн!
Как это устроено
источник
R, 24
2520байтИспользует стандартную функцию ранга с помощью метода связей «min» над отрицательным вектором.
cat
добавил, чтобы вывести его на STDOUT. Сохранено благодаря @Guiseppeпример
источник
cat
чтобы это была полная программа.rank(-a,,'min')
бы нормально , если бы входные данные списка были в векторной форме?function(a)rank(-a,,'min')
."mi"
а не"min"
.cat
? Если бы подача былаfunction(a)rank(-a,,'mi')
такой, то это было бы сочтено достаточным, а результаты программы идентичныrank(-scan(),,'mi')
PowerShell v2 +,
4341 байтРазрабатывается независимо, но я вижу, что это тот же алгоритм, что и в решении Python @ xnor , поэтому / shrug.
Принимает ввод как отдельные аргументы командной строки (то есть, список через пробел). Выход (форматирование по умолчанию) - это новая строка между элементами.
Для каждого элемента в списке ввода это список
sort
ввода в-d
порядке возрастания, берет.indexOf()
текущий элемент и добавляет1
. Обратите внимание на явный массив, приведенный@(...)
для учета однозначного ввода. Полученные числа остаются на конвейере и вывод неявен.Сохранено 2 байта благодаря @Matt!
пример
источник
sort -d
не работает для вас? Это однозначно для меня.-Descending
и-Debug
является неоднозначным. Но в прямой оболочке на Win8.1 и оболочке и ISE на Win10 все работает нормально. Это будет не первый раз, когда моя конкретная установка Win8.1 будет глупой ...: / / Спасибо за гольф!$args|%{@($args|sort -d).indexof($_)+1}
это короче, но у меня не было хорошего взгляда, чтобы знать, работает ли это$args
функционирует как вход для блока скрипта цикла{...}
, так же, как если бы вы использовалиfilter
илиfunction
.Октава, 15 байт
Порт моего MATL ответа Октаве. Это также работает в Matlab R2016b.
Код определяет анонимную функцию. Чтобы вызвать его, присвойте его переменной. Попробуйте это в Ideone .
источник
JavaScript (ES6),
3836 байтРедактировать: 2 байта сохранены благодаря @ETHproductions.
источник
.map
FTW ;-)a=>a.map(e=>a.map(d=>r+=e<d,r=1)&&r)
Желе , 5 байт
TryItOnline!
Как?
источник
1+(+/@:<)"0 1~
>€µS‘
или действительно похож<@€µS‘
(@
обращает аргументы к<
оператору). J~
является неявным в цепочке слева отµ
, которая является монадическим (а не диадическим) разделением и<
векторизируется, если аргумент (ы) является (являются) списком (ами).Perl 6 ,
4226 байтНайти первый индекс
:k
в перевернутом[R,]
отсортированном спискеПодсчитайте значения, которые больше, и добавьте одно
источник
JavaScript,
8749 байтf=a=>a.slice().map(function(v){return a.sort(function(a,b){return b-a}).indexOf(v)+1 })
a=>[...a].map(v=>a.sort((a,b)=>b-a).indexOf(v)+1)
Спасибо Конор О'Брайен и ETHproductions!
источник
v=>a.sort((a,b)=>b-a).indexOf(v)+1
..slice()
вообще, потому что.map
работает с копией массива.f=
.[18,13,18]
возврат[1,1,2]
[1, 3, 1]
a.sort()
хранит отсортированный массив вa
. Но вы можете изменитьa.slice()
это,[...a]
чтобы сохранить несколько байтов.Mathematica,
44 байта42 байта40 байтов
3-байтовый символ частного использованияU+F4A1
( страница документации Wolfram )Изменить: Спасибо JHM за байтовую экономию.
источник
{10,2,5,4,15,5}
(выход должен быть{2,6,3,5,1,3}
не{2,5,3,4,1,3}
. Обратите внимание , что4
должно быть пропущено , потому что есть два5
с во входном).x
и#
(фактически избавившись от скобок):xPosition[SortBy[x,-#&],#][[1,1]]&/@x
.Пайк, 6 байт
Попробуй это здесь!
источник
J ,
148 байтКак?
Предыдущее решение
источник
1+1#.</~
. Строковое суммирование выполняется с использованием преобразования базы 1. Другой альтернативой является1+\:~i.]
также 8 байтов.Haskell, 28 байт
Просто список понятий.
источник
Чудо , 28 байт
Использование:
Сопоставьте входной массив с функцией, которая добавляет 1 к первому индексу элемента в отсортированной по убыванию версии ввода.
источник
Dyalog APL , 7 байтов
⊢
аргументы⍳⍨
индексы в⍒
индексы, которые будут сортировать аргумент по убыванию⊃¨
каждый выбран из⊂
весь аргументПопробуй APL онлайн!
источник
Mathematica, 37 байт
Чистая функция, которая будет оценивать входные данные в соответствии с правилами задачи. Пример:
источник
Медуза , 15 байт
Попробуйте онлайн!
объяснение
Похоже, пока нет хорошего способа найти индекс значения в списке в Jellyfish, поэтому здесь используется метод подсчета количества значений больше текущего и увеличения результата. Это в основном делается путем создания унарной функции, которая вычисляет это значение для данного элемента.
Это создает многопоточную версию оператора сравнения, поэтому, если вы передадите ей целое число и список, он вернет список результатов сравнения между этим целым числом и каждым элементом в списке.
Это карри правый аргумент предыдущей функции со списком ввода. Таким образом, результатом является унарная функция, которая принимает целое число и выдает список результатов сравнения с входными данными программы.
Здесь,
/+
сокращение путем сложения, что означает, что это просто функция «суммировать этот список».&
составляет это в предыдущую функцию, так что теперь у нас есть унарная функция, которая подсчитывает, сколько значений на входе больше, чем это целое число.Мы также составляем функцию приращения на это.
Наконец, мы также выполняем эту функцию, чтобы она автоматически применялась к каждому целому числу переданного ей списка. Из-за разметки кода,
i
в качестве входных данных для этой функции также принимается решение, которое вычисляет желаемый результат.Наконец, это печатает результат.
источник
мозговой трах, 124 байта
отформатирован:
Это разработано для 8-битных реализаций мозгового меха. Вход и выход осуществляются через байтовые значения .
Попробуйте онлайн.
Для каждого элемента это число элементов больше его, а затем вывод результата плюс один. Это достигается путем увеличения всех элементов до тех пор, пока текущий элемент не станет равным нулю, обновляя результат всякий раз, когда другой элемент становится равным нулю перед текущим элементом.
Лента разбита на 4-ячеечные узлы,
b c 0 0
где
c
находится элемент иb
является флагом навигации, который является отрицательным для текущего элемента, в противном случае - один.Результат и копия текущего элемента хранятся слева от массива.
источник
Java, 215 байт
Объяснение:
Очень само за себя.
В основном для каждого целого числа в массиве он проверяет, сколько их больше, а затем печатает новый массив с ранжированием.
Извините, это не очень кратко, но это моя первая попытка на одном из них, и я не увидел запись для Java. Я уверен, что это может быть в гольфе больше.
Его можно запустить, просто сделав ссылку на статический метод и передав массив. Я не думал, что нужно писать основную функцию, но если это так, я сделаю это в будущем.
источник
r = new
)for (
?PHP, 101 байт
Должен быть какой-то более короткий путь.
Функция принимает входные данные как массив целых чисел, перезаписывает входную переменную рангами в виде числовых строк.
Использование:
$a=[1,2,4,2,2,3];f($a);print_r($a);
источник
Рубин,
4540 байтисточник
[10, 2, 5, 4, 15, 5]
дает вывод,[2, 5, 3, 4, 1, 3]
когда это должно быть[2, 6, 3, 5, 1, 3]
- я думаю, чтобы исправить, что вы просто удалите.uniq
- сохранение 5 байтов!Clojure,
4844 байтаОбновление: использование
for
вместоmap
Просто фильтрует каждое значение меньше текущего, считает длину списка и увеличивает его на единицу.
источник
Tcl , 54 байта
Попробуйте онлайн!
источник
PHP, 84 байта
Использование: Передайте функции r свой массив целых чисел, и она вернет соответствующий массив ранжированных целых чисел.
Сдача тестов здесь.
источник
Perl 5, 23 +2 (-ap)
Попробуйте онлайн
источник
К (ок) , 11 байт
Решение:
Попробуйте онлайн!
Примеры:
Объяснение:
Найти позицию исходного списка в отсортированном списке, затем добавить один.
источник