Резюме
Получив список целых чисел, верните индекс, в котором каждое целое число будет в итоге при сортировке.
Например, если список был [0,8,-1,5,8]
, вы должны вернуться [1,3,0,2,4]
. Обратите внимание, что эти два 8
поддерживают свой порядок относительно друг друга (сортировка стабильна).
Другими словами: для каждого элемента в списке вернуть количество элементов в списке: Меньше, чем выбранный элемент ИЛИ (равный элементу И появляется перед выбранным элементом)
Индексы должны начинаться с 0 (не с 1) РЕДАКТИРОВАТЬ: учитывая большой откат, я позволю индикации на основе 1.
Тестовые случаи:
0 -> 0
23 -> 0
2,3 -> 0,1
3,2 -> 1,0
2,2 -> 0,1
8,10,4,-1,-1,8 -> 3,5,2,0,1,4
0,1,2,3,4,5,6,7 -> 0,1,2,3,4,5,6,7
7,6,5,4,3,2,1,0 -> 7,6,5,4,3,2,1,0
4,4,0,1,1,2,0,1 -> 6,7,0,2,3,5,1,4
1,1,1,1,1,1,1,1 -> 0,1,2,3,4,5,6,7
1,1,1,1,1,1,1,0 -> 1,2,3,4,5,6,7,0
code-golf
array-manipulation
sorting
Натан Меррилл
источник
источник
[0 1 ... n-1]
.8,10,4,-1,-1
тестовый пример очень обманчив. Попробуйте4,4,0,1,1,2,0,1
первый.Ответы:
APL, 2 байта
Встроенная оценка, применяется дважды. Работает, если индексирование начинается с 0, что не является значением по умолчанию для всех разновидностей APL. Попробуй это здесь!
Почему это работает?
⍋x
возвращает список индексов, которые будут стабильно сортироватьсяx
. Например:потому что если вы возьмете элемент
2
, тогда ...6
тогда3
вы получите стабильно отсортированный список:Но список индексов, который отвечает на этот вопрос, несколько отличается: сначала нам нужен индекс наименьшего элемента, затем второй наименьший и т. Д., Опять же, сохраняя первоначальный порядок.
Если мы посмотрим на
⍋x
, хотя, мы видим , что может дать нам этот список легко: позиция из0
ин⍋x
говорит нам , где наименьший элемент будет в конечном итоге после сортировки, а также положение о1
ин⍋x
говорит нам , где второй наименьший элемент будет в конечном итоге , так далее.Но мы знаем, что
⍋x
содержит именно числа [0, 1… n − 1] . Если мы снова оценим его , мы просто получим индекс0
in⍋x
, затем индекс1
in⍋x
и т. Д., И это именно то, что нас интересует.Так что ответ
⍋⍋x
.источник
Желе, 2 байта
Оценить в два раза. 1-индексироваться. Попробуйте онлайн!
источник
JavaScript ES6,
8782797470 байтНе люблю использовать объект, но это, кажется, самый короткий способ отследить обманщиков
объяснение
источник
K ,
52 байтаОценить (
<
) в два раза. JohnE сохранил три байта, указав, что в K существуют неявные выражения! Очень круто. Попробуйте это.источник
<<
. Попробуй это здесь .Haskell,
5048 байтовПример использования:
m.m $ [4,4,0,1,1,2,0,1]
->[6,7,0,2,3,5,1,4]
.Он
map snd.sort.zip x [0..]
применяется дважды на входе, т.е. соединяет каждый элемент e с его индексом i ((e,i)
), сортирует его, удаляя первые элементы. Повторите один раз.@Lynn придумал, у
m=map snd.sort.(`zip`[0..])
которого есть то же самое число байтов.источник
Python 2,
6760 байтСпасибо @xnor за 7 байтов!
Проверьте это на Ideone .
источник
enumerate
можно сделать короче сzip
:l=input();x=zip(l,range(len(l)))
.PowerShell v2 +, 63 байта
Принимает ввод
$n
, передает это через цикл по каждому элементу|%{...}
. На каждой итерации мыsort
$n
и получаемIndexOf
наш текущий элемент$_
. Это подсчитывает, сколько элементов меньше, чем текущий элемент. Мы добавляем к этому кусочек$n
, который расширяет каждую итерацию цикла, элементов, которые равны текущему элементу,$_
и принимаем его.Count
. Затем мы вычитаем,-1
чтобы не считать наш текущий элемент, и это число остается в конвейере. Вывод в конце неявный.Примеры
источник
CJam, 15 байтов
Попробуйте онлайн!
объяснение
источник
J, 5 байт
Оценить (
/:
) в два раза (^:2
). 0 индексированные.Для того, чтобы попробовать его, типа ,
f =: /:^:2
а затемf 4 4 0 1 1 2 0 1
в tryj.tk .источник
/:@/:
с равным количеством байтов.MATL,
1094 байта4 байта сохранены благодаря @Luis
В этом решении используется индексирование на основе 1
Попробуйте онлайн
источник
05AB1E, 12 байтов
Разъяснения
Попробуйте онлайн
источник
Python 2, 67 байт
xnor сохранил два байта.
источник
a=input();p=[]\nfor x in a:print sorted(a).index(x)+p.count(x);p+=x,
Haskell, 40 байт
Аннотируйте каждый элемент с его индексом, затем сопоставьте каждый элемент с количеством меньших элементов, разрывая связь по индексу. Нет сортировки.
источник
Юлия, 17 байт
1-индексироваться. Оценить (
sortperm
) в два раза. Попробуй это здесь.РЕДАКТИРОВАТЬ: Деннис сэкономил четыре байта, давая имена операторов вещи! Юлия странная
источник
JavaScript (ES6), 52 байта
Определяется
g
как функция оценки, которая возвращает массив индексов, из которого все элементы в отсортированном массиве были бы взяты из исходного массива. К сожалению, нам нужны индексы, на которые пойдут все элементы. К счастью, это оказывается сопоставлением оценки с первоначальным списком показателей, который сам по себе можно считать результатом сортировки оценки, что позволяет нам получить оценку оценки для достижения желаемого результата.источник
Pyth,
109 байтов1 байт благодаря Якубе.
Тестирование.
Там должна быть более коротким путем ...
источник
xL
вместоsxR
. Или я что-то упускаю?Ракетка, 117 байт
Я вечно разочарован отсутствием встроенных средств для этого.
источник
Рубин,
5453 байтаПопробуйте онлайн
-1 байт от обновления до подхода @ Downgoat - использование хеша для хранения значений вместо подсчета дубликатов каждый раз.
источник
Clojure, 83 байта
Я создаю анонимную функцию, которая оценивает входной массив и повторяет его дважды на входе. Первый звонок вернет оценку. Второй вызов действует на оценку и возвращает рейтинг.
источник
Брахилог , 27 байт
Попробуйте онлайн! или проверьте все контрольные примеры .
объяснение
Это простая реализация следующего отношения: каждое целое число выходных данных, соответствующее элементу входных данных, является индексом этого элемента в отсортированном входном файле.
источник
Mathematica, 15 байт
источник
Mathematica, 135 байт
источник
Common Lisp, 117 байт
Примените преобразование Шварца дважды.
Тест
источник
JavaScript (с использованием внешней библиотеки) (105 байт)
Ссылка на lib: https://github.com/mvegh1/Enumerable Объяснение кода: Создайте анонимный метод, который принимает список целых чисел. _.From создает экземпляр библиотеки, которая упаковывает массив специальными методами. Select сопоставляет каждый элемент новому элементу, беря значение «v», анализируя его в строку, а затем конкатенируя «i» ndex этого элемента (это решает случай повторяющегося значения). Это хранится в переменной «а». Затем мы возвращаем результат следующего: сопоставить каждый элемент в 'a' с индексом этого элемента в отсортированной версии a (как целые числа) и привести обратно к собственному массиву JS
Обратите внимание, что отрицательные повторяющиеся числа печатаются в обратном порядке. Я не уверен, что это делает это решение недействительным? Технически 8,10,4, -1, -1,8 должны быть 3,5,2,0,1,4 в соответствии с OP, но мой код печатает 3,5,2,1,0,4, который я считаю все еще технически действительный?
источник
GNU Core Utils,
3933 байтаПроизводит вывод на основе 1. Добавить
-v0
после второгоnl
чтобы получить 0 на основе вывода. (+4 байта)Команды, которые мы используем:
nl
добавляет номера строк к каждой строке ввода.sort -n -k 2
сортирует по столбцу 2 численно.cut -f 1
занимает первый столбец с разделителями табуляции, отбрасывая остальные.Кроме того,
-s
опция может быть передана дляsort
запроса стабильной сортировки, но здесь она нам не нужна. Если два элемента идентичны, ониsort
будут определять их порядок, возвращаясь к другим столбцам, что в данном случае является монотонно увеличивающимся выходомnl
. Таким образом, сортировка будет стабильной без необходимости ее указания, благодаря вводу.источник
Java
149140 байтGolfed
Спасибо @Kevin Cruissjen за бритье 9 байтов.
источник
int[] a
иint[] b
. Вы можете вынутьint
из петель. И поскольку вы используетеb.length
дважды в начале, вы можете поместить его в отдельном поле. В общем, что-то вроде этого:int[]a(int[]b){int l=b.length,o[]=new int[l],i,j;for(i=-1;++i<l;)for(j=-1;++i<b.length;)if(b[i]==Arrays.sort(b.clone())[j])o[i]=j;return o;}
( 140 байт ) Хм, также, похоже, это не работает ...Arrays.sort(...)
не возвращает ничего (этоvoid
метод), так как вы можете сравнить это сb[i]
? ..PHP, 88 байт
оперирует аргументами командной строки; печатает 0-индексированный список, разделенный подчеркиванием. Беги с
-nr
.сломать
источник
MATLAB, 29 байт
Большинство встроенных модулей сортировки MATLAB будут возвращать дополнительный второй массив, содержащий отсортированные индексы. Они
j=
могут быть удалены, если печать индексов приемлема, а не возвращать их.источник
CJam , 19 байтов
Попробуйте онлайн!
Объяснение:
источник