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!

Pavel
quelle
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:

9

Gelee , 1 Byte

Probieren Sie es online!

Dennis
quelle
Heh das war zu offensichtlich ...
Erik der Outgolfer
2
APL hat diesen verdient, +1 für Ihre Geschwindigkeit.
Zacharý
@ Zacharý Ich bin sicher, dass Jelly dieses von J abgeholt hat, das es wiederum von APL geerbt hat.
Adám,
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.

James Heslip
quelle
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

Haskell , 43 42 Bytes

1-indexiert:

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

Probieren Sie es online!

-1 byte danke an @ ØrjanJohansen!

ბიმო
quelle
2
Pointfree Version speichert ein Byte: map snd.sort.(`zip`[1..]).
Ørjan Johansen
9

Python 2 , 56 Bytes

Diese Lösung ist 0-indiziert. Dies missbraucht die Tatsache, dass sorted()eine Kopie der ursprünglichen Liste erstellt wird.

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

Probieren Sie es online!

Mr. Xcoder
quelle
Warum hast du das ungolf gemacht?
Erik der Outgolfer
@EriktheOutgolfer Behoben, Rollback.
Mr. Xcoder
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]))

Herman L
quelle
[...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!

Erik der Outgolfer
quelle
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
5

Perl 6 ,  27  21 Bytes

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

Probier es aus

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

Probier es aus

Inspiriert von einer Python-Antwort

Erweitert:

->    # 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
quelle
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! .

Mr. Xcoder
quelle
4

R , 5 Bytes

Dafür gibt es eine eingebaute Funktion.

order
Djhurio
quelle
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

MATL, 2 bytes

&S

Try it online!

Input and output are implicit.

Sanchises
quelle
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
quelle
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ý
quelle
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
quelle
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
quelle
2

Clojure, 39 bytes

#(map key(sort-by val(zipmap(range)%)))
NikoNyrh
quelle
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
quelle
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
quelle
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]
ბიმო
quelle
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
quelle
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
quelle
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
quelle
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
quelle
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
quelle
The test cases only have 1 digit numbers; my solution only works well on 1 digit numbers.
sergiol