Dapatkan indeks array setelah pengurutan

14

Tantangan Anda hari ini adalah menulis program atau fungsi yang mengambil daftar ldan memberikan posisil mana setiap elemen berurutan lmuncul.

Dengan kata lain, output indeks dari nilai terkecil, diikuti oleh indeks dari nilai terkecil kedua, dll.

Anda dapat mengasumsikan bahwa array input hanya akan berisi bilangan bulat positif, dan akan mengandung setidaknya satu elemen.

Kasus uji:

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]

Ketika dua atau lebih elemen dengan nilai yang sama muncul, indeks mereka akan muncul bersebelahan dari yang terkecil hingga yang terbesar.

Ini adalah , byte paling sedikit menang!

Pavel
sumber
16
-1 untuk tantangan sepele yang dapat diselesaikan dengan built-in dalam bahasa golf yang umum, dan untuk menerima jawaban dalam waktu kurang dari 24 jam. Ini bukan tantangan yang adil, atau yang menarik.
Cody Grey
3
Yah, saya mengerti mengapa dia menerima jawaban dalam 24 jam, tidak mungkin dikalahkan.
Zacharý
3
@CodyGray Saya pikir downvoting ketika saya melihat jawaban 1-2 byte, tetapi sebenarnya, saya tidak berpikir itu tantangan yang buruk untuk bahasa pemrograman standar. Tentu saja, ini bukan tantangan yang sulit , tapi tetap saja, ada beberapa kemungkinan bermain golf. Tentu saja, tidak menyenangkan melihat built-in 1-byte, tapi saya tidak berpikir adil untuk menyalahkan tantangan untuk itu.
Dada
1
Menggunakan 1 karakter bawaan tidak sulit dilakukan. Mudah tidak selalu berarti dipecahkan hanya dengan menggunakan builtin.
JAD
2
Solusi terbaik dalam kasus tersebut adalah melupakan fitur terima kasih, yang sebenarnya tidak relevan di sini.
Tn. Xcoder

Jawaban:

9

Jelly , 1 byte

Cobalah online!

Dennis
sumber
Heh itu terlalu jelas ...
Erik the Outgolfer
2
APL layak mendapatkan yang ini, +1 untuk kecepatan Anda.
Zacharý
@ Zacharý Saya yakin Jelly mengambil yang ini dari J, yang kemudian mewarisinya dari APL.
Adám
11

Dyalog APL, 1 byte

Dyalog APL memiliki built-in operator fungsi bawaan (terima kasih Zacharý untuk menyelesaikan ini) untuk melakukan ini.

Contoh

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

Di sini saya mengindeks ke dalam daftar dengan indeks yang diurutkan untuk mengembalikan daftar dalam urutan menaik.

James Heslip
sumber
Oh, hanya untuk mengingatkan Anda tentang beberapa terminologi yang membingungkan, di APL, bawaan seperti dianggap sebagai fungsi, sementara hal-hal seperti ¨⍨⍣.∘/\⌿⍀⌸⍤adalah operator.
Zacharý
9

Haskell , 43 42 byte

1-indeks:

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

Cobalah online!

-1 byte terima kasih kepada @ ØrjanJohansen!

ბიმო
sumber
2
Versi Pointfree menghemat satu byte: map snd.sort.(`zip`[1..]).
Ørjan Johansen
9

Python 2 , 56 byte

Solusi ini diindeks 0. Ini menyalahgunakan fakta yang sorted()membuat salinan daftar asli.

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

Cobalah online!

Tuan Xcoder
sumber
Mengapa Anda ungolf ini?
Erik the Outgolfer
@EriktheOutgolfer Tetap, Rollback.
Tn. Xcoder
9

Javascript (ES6), 39 byte

-2 byte terima kasih kepada @powelles

Ini hanya berfungsi di browser Array.prototype.sortyang stabil.

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

Versi 1-diindeks (47 byte):

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

Cuplikan kode contoh:

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

Herman L.
sumber
[...a.keys()]bukannya a.map((_,i)=>i)akan menghemat beberapa byte.
powelles
7

Python 2 , 48 byte

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

Cobalah online!

Erik the Outgolfer
sumber
Bagus, saya kalah> _ <. Saya mengalihkan jawaban saya ke Python 3 sehingga saya tidak merasa seburuk itu
Tn. Xcoder
4
@ Mr.Xcoder Nah, itu tugasnya ...
Neil
@ Mr.Xcoder Ayo, Anda seharusnya tidak merasa sedih untuk itu! Anda membuat program lengkap, saya membuat fungsi, dan pendekatan saya agak berbeda.
Erik the Outgolfer
Saya tidak merasa buruk, saya tahu ini akan muncul (saya pribadi membenci __<blahblah>__sintaksis). Saya akan melakukan beberapa Jelly, saya tidak ingin kehilangan pelatihan saya :)
Tn. Xcoder
1
@ Mr.Xcoder Codegolf tidak berarti cukup sintaks dan pemformatan. ;)
Erik the Outgolfer
5

Perl 6 ,  27  21 byte

*.pairs.sort(*.value)».key

Menguji

->\x{sort {x[$_]},^x}

Menguji

Terinspirasi oleh jawaban Python

Diperluas:

->    # pointy block lambda
  \x  # declare sigilless parameter
{
  sort
    { x[$_] },  # sort by the value in 「x」 at the given position
    ^x          # Range up-to the number of elements in 「x」
}
Brad Gilbert b2gills
sumber
5

Bash + coreutils, 20

nl|sort -nk2|cut -f1

Cobalah online .

Trauma Digital
sumber
4

Cepat 4 , 82 byte

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

Test Suite.

Penjelasan

Di Swift, l.sorted()buat salinan diurutkan dari Array asli. Kami loop melalui unsur-unsur diurutkan dalam daftar dan setelah mencetak indeks setiap item dalam Array asli dengan let a=l.index(of:k)!;print(a), dan kemudian, untuk menjaga indeks yang benar dalam Array, kami menetapkan l[a]untuk 0, karena tidak mempengaruhi output normal kita.


Perhatikan bahwa ini adalah 0-diindeks, karena ini adalah port dari solusi Python saya. Jika Anda ingin diindeks 1, ganti print(a)dengan print(a+1)atau Coba online! .

Mr. Xcoder
sumber
4

R, 5 bytes

There is a builtin function for this.

order
djhurio
sumber
3
Standard rules is to provide a program of function. order is already a function, so you don't have to handle input using scan(). This would be 5 bytes.
JAD
rank() would save a byte
gstats
1
I am sure there was a rank answer by @JarkoDubbeldam, but I do not see it anymore.
djhurio
1
Correct, it does not follow the spec so I deleted it.
JAD
3

MATL, 2 bytes

&S

Try it online!

Input and output are implicit.

Sanchises
sumber
3

Octave, 17 bytes

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

Try it online!

Octave is like MATLAB but with inline assignment, making things possible that gives the folks at Mathworks HQ headaches. It doesn't matter what you call y, but you can't do without that dummy variable, as far as I know.

Sanchises
sumber
3

MY, 3 bytes

MY also has a builtin for this!

⎕⍋↵

Try it online!

How?

Evaluated input, grade up, then output with a newline.

Indexed however you set the index, with /0x48. (Can even be some weird integer like -1 or 2, the default is 1).

Zacharý
sumber
3

Java 8, 128 + 19 = 147 bytes

Based on Mr. Xcoder's solution. 0-based. Lambda takes input as an Integer[] and returns Integer[]. Byte count includes lambda expression and required import.

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

Try It Online

Ungolfed lambda

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

Notes

I use Integer[] instead of int[] to allow use of Arrays.asList, which has no primitive versions. Integer is preferred to Long because values are used as array indices and would require casting.

This ended up being shorter than my best procedural-style List solution because of the cost of class and method names.

This also beat a solution I tried that streamed the inputs, mapped to (value, index) pairs, sorted on values, and mapped to indices, mostly because of the baggage needed to collect the stream.

Acknowledgments

  • -5 bytes thanks to Nevay
Jakob
sumber
1
You don't need 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 bytes).
Nevay
2

Common Lisp, 82 bytes

(lambda(l)(loop as i in(sort(copy-seq l)'<)do(setf(elt l(print(position i l)))0)))

Try it online!

Renzo
sumber
2

Clojure, 39 bytes

#(map key(sort-by val(zipmap(range)%)))
NikoNyrh
sumber
Translated to Perl 6 {map *.key,(sort *.value,(0..* Z=> @_))}
Brad Gilbert b2gills
2

MATLAB / Octave, 29 bytes

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

Try it online!

Luis Mendo
sumber
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

Arnauld
sumber
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]
ბიმო
sumber
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.

Xanderhall
sumber
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.

12Me21
sumber
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!

Luis Mendo
sumber
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.

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

Tcl, 21 bytes

(0-indexed)

puts [lsort -indi $L]

Try it online!

sergiol
sumber
The test cases only have 1 digit numbers; my solution only works well on 1 digit numbers.
sergiol