Отримайте індекси масиву після сортування


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 годин, перемогти це неможливо.
Zacharý

3
@CodyGray Я подумав похититися, побачивши відповідь на 1-2 байти, але насправді я не думаю, що це погана проблема для більш стандартних мов програмування. Звичайно, це не складний виклик, але все-таки є певні можливості для гольфу. Звичайно, неприємно бачити вбудовані 1-байтові вбудовані модулі, але я не думаю, що в цьому справедливо звинувачувати виклик.
Дада

1
Використання вбудованого символу 1 навряд чи є практикою. Легко не обов'язково означає вирішення, використовуючи лише вбудовані.
JAD

2
Найкращим рішенням у таких випадках є забути про функцію прийняття, яка все-таки не є актуальною.
Містер Xcoder

Відповіді:



11

Діалог APL, 1 байт

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

Приклад

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

Тут я індексую до списку відсортовані індекси, щоб повернути список у порядку зростання.


О, просто щоб попередити вас про деяку заплутану термінологію, в APL такі вбудовані файли вважаються функціями, тоді як ¨⍨⍣.∘/\⌿⍀⌸⍤такі речі є операторами.
Zacharý



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 так, що я не відчуваю себе так погано
містер Xcoder

4
@ Mr.Xcoder Ну, це його робота ...
Ніл

@ Mr.Xcoder Давайте, ви не повинні почувати себе погано за це! Ви зробили повну програму, я зробив функцію, і мій підхід трохи інший.
Ерік Аутгольфер

Мені не погано, я знав, що це з’явиться (я особисто ненавиджу __<blahblah>__синтаксис). Я
зароблю

1
@ Mr.Xcoder Codegolf не означає гарний синтаксис та форматування. ;)
Ерік Аутгольфер



4

Швидкий 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, але я її більше не бачу.
djhurio

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




3

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

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

Спробуйте в Інтернеті!

Октава схожа на 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 bytes

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

Try it online!


While your answer is perfect MATLAB, you can actually do inline assignment in anonymous functions in Octave.
Sanchises

Good one! I knew about in-line assignment, but I didn't know you could output directly like that
Luis Mendo

1
To be honest, me neither. I started with something like @(X)([~,y]=sort(X)), and while I was looking of a way to get y from this, I realized y was actually the return value from the assignment, and closer inspection revealed that brackets weren't even needed. MATLAB likes everything explicit; Octave is happy when it's unambiguous.
Sanchises

2

JavaScript (ES6), 69 bytes

0-indexed. Works for lists containing up to 65,536 elements.

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

Test cases


Can you change n=>a.indexOf(n) to just a.indexOf?
Zacharý

@Zacharý Unfortunately not. A method of an instanced object cannot be used as a callback.
Arnauld

@Zacharý Even worse is that Array#map passes 3 arguments to the callback function, and Array#indexOf expects 2, so it will give undesirable results.
kamoroso94


2

Husk, 10 7 bytes

This is a direct port of my Haskell answer, also 1-indexed:

m→O`z,N

Try it online!

Ungolfed/Explained

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 bytes

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

Try it online!

Takes a List<Integer>, returns a Stream<Integer> containing the results.

We get a Stream based off the initial list, sort it, then map each number to it's index in the list. In order to accommodate duplicate elements, we set the original element in the list to 0.


2

SmileBASIC, 67 bytes

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

Very simple, all it does is generate a list of numbers from 1 to (length of array) and sort this by the same order as the input.


2

Python 3 with Numpy, 38 26 bytes

12 bytes saved thanks to Jo King (no need to give the function a name)

import numpy
numpy.argsort

Output is 0-based.

Try it online!


The function could just be numpy.argsort without the lambda part
Jo King

@JoKing Thanks for the suggestion. I wrote it that way because with just numpy.argsort;import numpy I get an error (numpy has not been imported yet), and with import numpy;numpy.argsort I need to move f= to the code part. Do you know that the standard procedure is in these cases? Move the f= and not count it?
Luis Mendo

Yeah, I guess. Maybe just redefine f=numpy.argsort in the footer
Jo King

@JoKing Good idea. Done. Thanks!
Luis Mendo



1

PHP, 54 bytes

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

Try it online!

This is zero-indexed. Simply sorts the array and returns the keys.


1
The <?php tag is unnecessary for a function. 48 bytes.
Titus

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.