Holen Sie sich die Indizes eines Arrays nach dem Sortieren


14

Ihre heutige Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben, die eine Liste erstellt lund die Positionen angibt, lan denen jedes aufeinanderfolgende Element von lsortiert erscheint.

Mit anderen Worten, geben Sie den Index des kleinsten Werts gefolgt vom Index des zweitkleinsten Werts usw. aus.

Sie können davon ausgehen, dass das Eingabearray nur positive Ganzzahlen und mindestens ein Element enthält.

Testfälle:

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]

Wenn zwei oder mehr Elemente mit demselben Wert angezeigt werden, sollten ihre Indizes vom kleinsten zum größten nebeneinander angezeigt werden.

Das ist , die wenigsten Bytes gewinnen!


16
-1 für eine einfache Herausforderung, die mit integrierten Funktionen in gängigen Golfsprachen gelöst werden kann, und für die Annahme einer Antwort in weniger als 24 Stunden. Dies war weder eine faire noch eine interessante Herausforderung.
Cody Grey

3
Nun, ich verstehe, warum er eine Antwort innerhalb von 24 Stunden angenommen hat, es ist unmöglich zu schlagen.
Zacharý

3
@CodyGray Als ich die Antwort von 1-2 Bytes sah, dachte ich mir Downvoting, aber ich glaube nicht, dass es eine schlechte Herausforderung für Standard-Programmiersprachen ist. Natürlich ist es keine schwierige Herausforderung, aber dennoch gibt es definitiv einige Golfmöglichkeiten. Natürlich ist es unangenehm, 1-Byte-Built-Ins zu sehen, aber ich denke nicht, dass es fair ist, die Herausforderung dafür verantwortlich zu machen.
Dada

1
Das Verwenden eines eingebauten 1-Zeichens ist kaum Übung. Einfach heißt nicht zwangsläufig, nur mit eingebauten Funktionen lösbar zu sein.
JAD

2
Die beste Lösung in solchen Fällen ist, die Accept-Funktion zu vergessen, die hier ohnehin nicht wirklich relevant ist.
Mr. Xcoder

Antworten:



11

Dyalog APL, 1 Byte

Dyalog APL hat eine eingebaute Operatorfunktion (danke Zacharý für die Aufklärung), um dies zu tun.

Beispiel

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

Hier indiziere ich die Liste anhand der sortierten Indizes, um die Liste in aufsteigender Reihenfolge zurückzugeben.


Oh, nur um Sie auf verwirrende Begriffe aufmerksam zu machen: In APL werden eingebaute Funktionen als Funktionen betrachtet, während ¨⍨⍣.∘/\⌿⍀⌸⍤Operatoren als solche gelten.
Zacharý



9

Javascript (ES6), 39 Byte

-2 Bytes dank @powelles

Dies funktioniert nur in Browsern, in denen Array.prototype.sortes stabil ist.

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

1-indizierte Version (47 Bytes):

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

Beispielcode-Snippet:

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()]Statt a.map((_,i)=>i)sparen Sie ein paar Bytes.
Powelles

7

Python 2 , 48 Bytes

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

Probieren Sie es online!


Schön, ich habe mich überfordert> _ <. Ich habe meine Antwort auf Python 3 umgestellt, damit ich mich nicht so schlecht fühle
Mr. Xcoder

4
@ Mr.Xcoder Nun, das ist sein Job ...
Neil

@ Mr.Xcoder Komm schon, dafür solltest du dich nicht schlecht fühlen! Sie haben ein vollständiges Programm erstellt, ich habe eine Funktion erstellt, und mein Ansatz ist ein bisschen anders.
Erik der Outgolfer

Ich fühle mich nicht schlecht, ich wusste, dass dies erscheinen wird (ich persönlich hasse die __<blahblah>__Syntax). Ich werde ein
bisschen

1
@ Mr.Xcoder Codegolf bedeutet nicht hübsche Syntax und Formatierung. ;)
Erik der Outgolfer



4

Schnelle 4 , 82 Bytes

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.

Erläuterung

Erstellt in Swift l.sorted()eine sortierte Kopie des ursprünglichen Arrays. Wir durchlaufen die sortierten Elemente in der Liste und drucken den Index jedes Elements im ursprünglichen Array mit. let a=l.index(of:k)!;print(a)Um die korrekten Indizes im Array beizubehalten, weisen wir sie l[a]zu 0, da dies unsere normale Ausgabe nicht beeinträchtigt.


Beachten Sie, dass dies 0-indiziert ist, da es ein Port meiner Python-Lösung ist. Wenn Sie es auf 1-indexiert werden sollen, ersetzen print(a)mit print(a+1)oder Online ausprobieren! .


4

R , 5 Bytes

Dafür gibt es eine eingebaute Funktion.

order

3
Standardregeln bestehen darin, ein Funktionsprogramm bereitzustellen. orderist bereits eine Funktion, so dass Sie nicht mit Eingaben umgehen müssen scan(). Dies wären 5 Bytes.
JAD

rank()würde ein Byte speichern
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

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.


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


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

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!




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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.