Получить индексы массива после сортировки

14

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

Другими словами, выведите индекс наименьшего значения, затем индекс второго наименьшего значения и т. Д.

Можно предположить, что входной массив будет содержать только положительные целые числа и будет содержать хотя бы один элемент.

Тестовые случаи:

Input                  | Output (1-indexed)
[7, 4, 5]              | [2, 3, 1]
[1, 2, 3]              | [1, 2, 3]
[2, 6, 1, 9, 1, 2, 3]  | [3, 5, 1, 6, 7, 2, 4]
[4]                    | [1]

Когда появляются два или более элемента с одинаковым значением, их индексы должны появляться рядом друг с другом от наименьшего к наибольшему.

Это , побеждает меньше байтов!

Павел
источник
16
-1 для тривиальной задачи, которую можно решить с помощью встроенных в общие языки игры в гольф, и для принятия ответа менее чем за 24 часа. Это не было ни честным испытанием, ни интересным.
Коди Грей,
3
Ну, я понимаю, почему он принял ответ в течение 24 часов, невозможно победить.
Захари
3
@CodyGray Я подумал об уменьшении голосов, когда увидел ответ в 1-2 байта, но на самом деле, я не думаю, что это плохая задача для более стандартных языков программирования. Конечно, это не сложная задача, но все же, безусловно, есть некоторые возможности для игры в гольф. Конечно, неприятно видеть встроенные однобайтовые встроенные модули, но я не думаю, что справедливо обвинять в этом вызов.
Дада
1
Использование встроенного 1 символа вряд ли является практикой. Легко не обязательно означает, что решаемо, используя только встроенные функции.
JAD
2
Лучшее решение в таких случаях - забыть о функции принятия, которая на самом деле здесь неактуальна.
г-н Xcoder

Ответы:

9

Желе , 1 байт

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

Деннис
источник
Хех, это было слишком очевидно ...
Эрик Outgolfer
2
APL заслужил это, +1, хотя для вашей скорости.
Захари
@ Zacharý Я уверен, что Jelly забрал этот у J, который, в свою очередь, унаследовал его от APL.
адам
11

Дьялог АПЛ, 1 байт

Dyalog APL имеет встроенную функцию оператора (спасибо Zacharý за прояснение этого), чтобы сделать это.

пример

⍋11 2 4 15
    2 3 1 4  
{⍵[⍋⍵]}11 4 2 15
    2 4 11 15

Здесь я индексирую в списке отсортированные индексы, чтобы вернуть список в порядке возрастания.

Джеймс Хеслип
источник
О, просто чтобы предупредить вас о какой-то сбивающей с толку терминологии, в APL такие встроенные функции считаются функциями, а подобные вещи ¨⍨⍣.∘/\⌿⍀⌸⍤- операторами.
Захари
9

Haskell , 43 42 байта

1-indexed:

import Data.List
map snd.sort.(`zip`[1..])

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

-1 байт благодаря @ ÖrjanJohansen!

ბიმო
источник
2
Pointfree версия сохраняет один байт: map snd.sort.(`zip`[1..]).
Орджан Йохансен
9

Python 2 , 56 байт

Это решение 0-проиндексировано. Это злоупотребляет тем, что sorted()создает копию исходного списка.

l=input()
for k in sorted(l):a=l.index(k);print a;l[a]=0

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

Мистер Xcoder
источник
Почему ты это разгадал?
Эрик Outgolfer
@EriktheOutgolfer Исправлено, откат.
Мистер Кскодер
9

Javascript (ES6), 39 байт

-2 байта благодаря @powelles

Это работает только в браузерах, где Array.prototype.sortстабильно.

a=>[...a.keys()].sort((b,c)=>a[b]-a[c])

1-индексированная версия (47 байт):

a=>a.map((_,i)=>i+1).sort((b,c)=>a[b-1]-a[c-1])

Пример кода:

f=
a=>[...a.keys()].sort((b,c)=>a[b]-a[c])
console.log("7,4,5 => "+f([7,4,5]))
console.log("1,2,3 => "+f([1,2,3]))
console.log("2,6,1,9,1,2,3 => "+f([2,6,1,9,1,2,3]))
console.log("4 -> "+f([4]))

Герман Л
источник
[...a.keys()]вместо того, a.map((_,i)=>i)чтобы сэкономить вам пару байтов.
Пауэлл
7

Python 2 , 48 байт

lambda x:sorted(range(len(x)),key=x.__getitem__)

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

Эрик Outgolfer
источник
Хорошо, я обошел стороной> _ <. Я переключил свой ответ на Python 3 так, чтобы мне не было так плохо
Mr. Xcoder
4
@ Mr.Xcoder Ну, это его работа ...
Нил
@ Mr.Xcoder Давай, ты не должен чувствовать себя плохо из-за этого! Вы сделали полную программу, я сделал функцию, и мой подход немного отличается.
Эрик Outgolfer
Я не чувствую себя плохо, я знал, что это появится (я лично ненавижу __<blahblah>__синтаксис). Я сделаю немного желе, я не хочу терять тренировки :)
Mr. Xcoder
1
@ Mr.Xcoder Codegolf не означает симпатичный синтаксис и форматирование. ;)
Эрик Outgolfer
4

Swift 4 , 82 байта

func f(l:[Int]){var l=l;for k in l.sorted(){let a=l.index(of:k)!;print(a);l[a]=0}}

Тестирование.

объяснение

В Swift l.sorted()создает отсортированную копию исходного массива. Мы перебрать отсортированные элементы в списке и после печати индекса каждого элемента в исходном массиве с let a=l.index(of:k)!;print(a), а затем, чтобы сохранить правильные индексы в массиве, мы относим l[a]к 0, потому что это не влияет на наш нормальный выход.


Обратите внимание, что это 0-индексированный, так как это порт моего решения Python. Если вы хотите, чтобы это было 1-проиндексировано, замените print(a)с print(a+1)или попробовать его в Интернете! ,

Мистер Xcoder
источник
4

R , 5 байт

Для этого есть встроенная функция.

order
djhurio
источник
3
Стандартными правилами является предоставление программы функций. orderэто уже функция, поэтому вам не нужно обрабатывать ввод с помощью scan(). Это будет 5 байтов.
JAD
rank()спас бы байт
gstats
1
Я уверен, что был rankответ @JarkoDubbeldam, но я его больше не вижу.
17
1
Правильно, он не соответствует спецификации, поэтому я удалил его.
JAD
3

Октава , 17 байт

@(i)[~,y]=sort(i)

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

Octave похож на MATLAB, но со встроенным назначением, что делает возможными вещи, которые доставляют людям головную боль в Mathworks HQ. Неважно, что вы называете y, но вы не можете обойтись без этой фиктивной переменной, насколько я знаю.

Sanchises
источник
3

МОИ , 3 байта

МОЯ также имеет встроенный для этого!

⎕⍋↵

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

Как?

Оцененный ввод, оценка вверх, затем вывод с новой строкой.

Индексируется однако вы устанавливаете индекс, с помощью / 0x48. (Может даже быть странным целым числом, например -1или 2, по умолчанию это 1).

Zachary
источник
3

Java 8, 128 + 19 = 147 байт

На основании г - Xcoder в растворе . 0 на основе. Лямбда принимает входные данные Integer[]и возвращает Integer[]. Число байтов включает в себя лямбда-выражение и требуемый импорт.

import java.util.*;

l->{Integer o[]=l.clone(),s[]=l.clone(),i=0;for(Arrays.sort(s);i<l.length;)l[o[i]=Arrays.asList(l).indexOf(s[i++])]=0;return o;}

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

Неуправляемая лямбда

l -> {
    Integer
        o[] = l.clone(),
        s[] = l.clone(),
        i = 0
    ;
    for (Arrays.sort(s); i < l.length; )
        l[o[i] = Arrays.asList(l).indexOf(s[i++])] = 0;
    return o;
}

Примечания

Я использую Integer[]вместо того, int[]чтобы разрешить использование Arrays.asList, которое не имеет примитивных версий. Integerпредпочтительнее, Longпотому что значения используются в качестве индексов массива и требуют преобразования.

Это оказалось короче моего лучшего решения в процедурном стиле Listиз-за стоимости имен классов и методов.

Это также превзошло решение, которое я пробовал, чтобы поток входных данных отображался на (значение, индекс) парами , отсортированные по значениям и сопоставленные с индексами, в основном из-за багажа, необходимого для сбора потока.

Подтверждения

  • -5 байт благодаря Nevay
Jakob
источник
1
Вам не нужно j: l->{Integer o[]=l.clone(),s[]=l.clone(),i=0;for(Arrays.sort(s);i<l.length;l[o[i]=Arrays.asList(l).indexOf(s[i++])]=0);return o;}(19 + 128 байт).
Невай
2

Clojure, 39 байт

#(map key(sort-by val(zipmap(range)%)))
NikoNyrh
источник
Переведено на Perl 6{map *.key,(sort *.value,(0..* Z=> @_))}
Брэд Гилберт b2gills
2

MATLAB / Octave , 29 байт

[~,y]=sort(input(''));disp(y)

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

Луис Мендо
источник
В то время как ваш ответ является идеальным MATLAB, вы можете выполнять встроенное назначение в анонимных функциях в Octave .
Санчиз
Хороший! Я знал о линейном назначении, но я не знал, что вы можете выводить напрямую, как это
Луис Мендо
1
Если честно, я тоже. Я начал с чего-то подобного @(X)([~,y]=sort(X)), и, хотя я искал способ получить yот этого, я понял, что на yсамом деле это возвращаемое значение из назначения, и более тщательная проверка показала, что скобки даже не нужны. MATLAB любит все явное; Октав счастлив, когда это однозначно.
Санчиз
2

JavaScript (ES6), 69 байт

0 индексированные. Работает для списков, содержащих до 65 536 элементов.

a=>[...a=a.map((n,i)=>n<<16|i)].sort((a,b)=>a-b).map(n=>a.indexOf(n))

Контрольные примеры

Arnauld
источник
Вы можете изменить n=>a.indexOf(n)на просто a.indexOf?
Захари
@ Zacharý К сожалению, нет. Метод экземпляра объекта нельзя использовать в качестве обратного вызова.
Арно
@ Zacharý Еще хуже то, что Array#map3 функции Array#indexOfпередаются функции обратного вызова и ожидают 2, так что это даст нежелательные результаты.
kamoroso94
2

Шелуха , 10 7 байт

Это прямой порт моего ответа на Haskell , также 1-индексированный:

m→O`z,N

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

Ungolfed / Разъяснения

Code        Description               Example
         -- implicit input            [2,6,1]
      N  -- natural numbers           [1,2,3,..]
   `z,   -- zip, but keep input left  [(2,1),(6,2),(1,3)]
  O      -- sort                      [(1,3),(2,1),(6,2)]
m→       -- keep only indices         [3,1,2]
ბიმო
источник
2

Java (OpenJDK 8) , 72 байта

l->l.stream().sorted().map(i->{int j=l.indexOf(i);l.set(j,0);return j;})

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

Принимает List<Integer>, возвращаетStream<Integer> содержащий результаты.

Мы получаем поток на основе исходного списка, сортируем его, а затем сопоставляем каждое число с его индексом в списке. Для размещения дублирующих элементов мы устанавливаем исходный элемент в списке на 0.

Xanderhall
источник
2

SmileBASIC, 67 байт

DEF I(A)DIM B[0]FOR I=1TO LEN(A)PUSH B,I
NEXT
SORT A,B
RETURN B
END

Все очень просто: генерировать список чисел от 1 до (длина массива) и сортировать его в том же порядке, что и входные данные.

12Me21
источник
2

Python 3 с Numpy , 38 26 байт

12 байтов, сохраненных благодаря Джо Кингу (не нужно давать имя функции)

import numpy
numpy.argsort

Выход основан на 0.

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

Луис Мендо
источник
Функция может быть просто numpy.argsortбез лямбда-части
Джо Кинг,
@JoKing Спасибо за предложение. Я написал это так, потому что просто numpy.argsort;import numpyя получаю сообщение об ошибке ( numpyеще не было импортировано), и import numpy;numpy.argsortмне нужно перейти f=к части кода. Знаете ли вы, что стандартная процедура в этих случаях? Двигайся f=и не считай?
Луис Мендо
Да, я полагаю. Может быть, просто переопределить f=numpy.argsortв нижнем колонтитуле
Джо Кинг
@ JoKing Хорошая идея. Выполнено. Благодарность!
Луис Мендо
1

PHP , 54 байта

<?php function i($a){asort($a);return array_keys($a);}

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

Это с нулевым индексом. Просто сортирует массив и возвращает ключи.

WebSmithery
источник
1
<?phpТег не является необходимым для функции. 48 байтов.
Тит
1

Tcl , 21 байт

(0-индексированные)

puts [lsort -indi $L]

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

sergiol
источник
Тестовые случаи имеют только однозначные числа; мое решение хорошо работает только на 1-значных числах.
sergiol