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


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

Ответы:



11

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

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

пример

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

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


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



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__)

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


Хорошо, я обошел стороной> _ <. Я переключил свой ответ на 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)или попробовать его в Интернете! ,


4

R , 5 байт

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

order

3
Стандартными правилами является предоставление программы функций. orderэто уже функция, поэтому вам не нужно обрабатывать ввод с помощью scan(). Это будет 5 байтов.
JAD

rank()спас бы байт
gstats

1
Я уверен, что был rankответ @JarkoDubbeldam, но я его больше не вижу.
17

1
Правильно, он не соответствует спецификации, поэтому я удалил его.
JAD




3

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

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

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

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


3

МОИ , 3 байта

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

⎕⍋↵

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

Как?

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

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


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

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

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))

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


Вы можете изменить n=>a.indexOf(n)на просто a.indexOf?
Захари

@ Zacharý К сожалению, нет. Метод экземпляра объекта нельзя использовать в качестве обратного вызова.
Арно

@ Zacharý Еще хуже то, что Array#map3 функции Array#indexOfпередаются функции обратного вызова и ожидают 2, так что это даст нежелательные результаты.
kamoroso94



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.


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 до (длина массива) и сортировать его в том же порядке, что и входные данные.


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);}

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

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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.