Zusammenfassung
Bei einer gegebenen Liste von Ganzzahlen geben Sie den Index zurück, bei dem jede Ganzzahl sortiert wird.
Wenn die Liste zum Beispiel war [0,8,-1,5,8]
, sollten Sie zurückkehren [1,3,0,2,4]
. Beachten Sie, dass die beiden 8
ihre Reihenfolge relativ zueinander beibehalten (die Sortierung ist stabil).
Anders ausgedrückt: Geben Sie für jedes Element in der Liste die Anzahl der Elemente in der Liste zurück: Kleiner als das ausgewählte Element ODER (gleich dem Element UND wird vor dem ausgewählten Element angezeigt)
Indizes müssen mit 0 (nicht mit 1) EDIT beginnen: Angesichts des großen Pushbacks erlaube ich 1-basierte Angaben.
Testfälle:
0 -> 0
23 -> 0
2,3 -> 0,1
3,2 -> 1,0
2,2 -> 0,1
8,10,4,-1,-1,8 -> 3,5,2,0,1,4
0,1,2,3,4,5,6,7 -> 0,1,2,3,4,5,6,7
7,6,5,4,3,2,1,0 -> 7,6,5,4,3,2,1,0
4,4,0,1,1,2,0,1 -> 6,7,0,2,3,5,1,4
1,1,1,1,1,1,1,1 -> 0,1,2,3,4,5,6,7
1,1,1,1,1,1,1,0 -> 1,2,3,4,5,6,7,0
code-golf
array-manipulation
sorting
Nathan Merrill
quelle
quelle
[0 1 ... n-1]
.8,10,4,-1,-1
Testfall täuscht sehr. Versuchen Sie es4,4,0,1,1,2,0,1
zuerst.Antworten:
APL, 2 Bytes
Die eingebaute "Note up", angewendet zweimal. Funktioniert, wenn die Indizierung bei 0 beginnt. Dies ist nicht die Standardeinstellung für alle APL-Varianten. Probieren Sie es hier aus!
Warum funktioniert das?
⍋x
Gibt eine Liste von Indizes zurück, die stabil sortiert werden könnenx
. Beispielsweise:denn wenn Sie Element nehmen
2
, dann6
, dann3
... Sie eine stabil sortierte Liste erhalten:Die Indexliste, die diese Frage beantwortet, unterscheidet sich jedoch geringfügig: Zuerst möchten wir den Index des kleinsten Elements, dann des zweitkleinsten usw. - wieder unter Beibehaltung der ursprünglichen Reihenfolge.
Wenn wir uns anschauen
⍋x
, aber sehen wir es uns diese Liste leicht geben kann: die Position eines0
in⍋x
mir sagt , wo das kleinste Element nach dem Sortieren enden würde, und die Position eines1
in⍋x
sagt uns , wo das zweitkleinste Element würde am Ende , etc.Aber wir wissen,
⍋x
enthält genau die Zahlen [0, 1… n − 1] . Wenn wir es erneut bewerten, erhalten wir nur den Index von0
in⍋x
, dann den Index von1
in⍋x
usw., und genau das ist es, woran wir interessiert sind.Die Antwort lautet also
⍋⍋x
.quelle
Gelee, 2 Bytes
Steige zweimal auf. 1-indiziert. Probieren Sie es online!
quelle
JavaScript ES6,
8782797470 BytesIch mag es nicht, ein Objekt zu benutzen, aber es scheint der kürzeste Weg zu sein, Dupes zu verfolgen
Erläuterung
quelle
K ,
52 BytesBenote (
<
) zweimal. JohnE sparte drei Bytes, indem er auf implizite Ausdrücke in K hinwies! Super cool. Versuch es.quelle
<<
. Probieren Sie es hier aus .Haskell,
5048 BytesAnwendungsbeispiel:
m.m $ [4,4,0,1,1,2,0,1]
->[6,7,0,2,3,5,1,4]
.Es
map snd.sort.zip x [0..]
wird zweimal auf die Eingabe angewendet, dh jedes Element e wird mit seinem Index i ((e,i)
) gepaart, und die ersten Elemente werden entfernt. Einmal wiederholen.@Lynn
m=map snd.sort.(`zip`[0..])
hat die gleiche Byteanzahl gefunden .quelle
Python 2,
6760 BytesVielen Dank an @xnor für das Golfen mit 7 Bytes!
Teste es auf Ideone .
quelle
enumerate
kann mit einem kürzeren erfolgenzip
:l=input();x=zip(l,range(len(l)))
.PowerShell v2 +, 63 Byte
Übernimmt Eingaben
$n
, leitet diese durch eine Schleife über jedes Element|%{...}
. Jede Iteration, wirsort
$n
und erhalten die inIndexOf
unserem aktuellen Element$_
. Dies zählt, wie viele Elemente kleiner als das aktuelle Element sind. Wir fügen dem ein Stück hinzu$n
, das jede Schleifeniteration der Elemente erweitert, die gleich dem aktuellen Element sind$_
und nehmen das.Count
davon. Wir subtrahieren-1
dann, um unser aktuelles Element nicht zu zählen, und diese Zahl verbleibt in der Pipeline. Die Ausgabe am Ende ist implizit.Beispiele
quelle
CJam, 15 Bytes
Probieren Sie es online!
Erläuterung
quelle
J, 5 Bytes
/:
Zweimal benoten ( ) (^:2
). 0-indiziert.Probieren Sie es aus, geben
f =: /:^:2
und dannf 4 4 0 1 1 2 0 1
in tryj.tk .quelle
/:@/:
mit einer gleichen Anzahl von Bytes.MATL,
1094 Bytes4 Bytes gespart dank @Luis
Diese Lösung verwendet eine 1-basierte Indizierung
Probieren Sie es online
quelle
05AB1E, 12 Bytes
Erklärt
Probieren Sie es online aus
quelle
Python 2, 67 Bytes
xnor sparte zwei Bytes.
quelle
a=input();p=[]\nfor x in a:print sorted(a).index(x)+p.count(x);p+=x,
Haskell, 40 Bytes
Beschriften Sie jedes Element mit seinem Index, und ordnen Sie dann jedes Element der Anzahl kleinerer Elemente zu. Keine Sortierung.
quelle
Julia, 17 Bytes
1-indiziert. Benote (
sortperm
) zweimal. Probieren Sie es hier aus.BEARBEITEN: Dennis hat vier Bytes gespart, indem er die Namen der Benutzer angegeben hat! Julia ist komisch.
quelle
JavaScript (ES6), 52 Byte
Definiert
g
als Klassenfunktion, die ein Array von Indizes zurückgibt, von denen alle Elemente im sortierten Array im ursprünglichen Array stammen würden. Leider wollen wir die Indizes, zu denen alle Elemente gehen werden. Glücklicherweise stellt sich heraus, dass dies die Zuordnung von der Note zurück zur ursprünglichen Indexliste ist, die selbst als Ergebnis der Sortierung der Note angesehen werden kann, sodass wir die Note der Note nehmen können, um das gewünschte Ergebnis zu erzielen.quelle
Pyth,
109 Bytes1 Byte danke an Jakube.
Testsuite.
Es muss einen kürzeren Weg geben ...
quelle
xL
stattsxR
. Oder übersehen ich etwas?Schläger, 117 Bytes
Ich bin auf ewig enttäuscht über das Fehlen eines Einbaus dafür.
quelle
Ruby,
5453 BytesProbieren Sie es online aus
-1 Byte vom Upgrade auf @ Downgoat, bei dem ein Hash zum Speichern von Werten verwendet wird, anstatt jedes Mal die Duplikate zu zählen.
quelle
Clojure, 83 Bytes
Ich erstelle eine anonyme Funktion, die das Eingabearray aufwertet und es bei der Eingabe zweimal durchläuft. Beim ersten Aufruf wird die Note zurückgegeben. Der zweite Aufruf wird für die Note ausgeführt und gibt den Rang zurück.
quelle
Brachylog , 27 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Erläuterung
Dies ist eine einfache Implementierung der folgenden Beziehung: Jede Ganzzahl der Ausgabe, die einem Element der Eingabe entspricht, ist der Index dieses Elements in der sortierten Eingabe.
quelle
Mathematica, 15 Bytes
quelle
Mathematica, 135 Bytes
quelle
Common Lisp, 117 Bytes
Wenden Sie eine Schwartzsche Transformation zweimal an.
Prüfung
quelle
JavaScript (mit externer Bibliothek) (105 Bytes)
Link zu lib: https://github.com/mvegh1/Enumerable Erklärung des Codes: Erstellen Sie eine anonyme Methode, die eine Liste von Ganzzahlen akzeptiert. _.From erstellt eine Instanz der Bibliothek, die ein Array mit speziellen Methoden umschließt. Select ordnet jedes Element einem neuen Element zu, indem es den Wert "v" aufnimmt, ihn in eine Zeichenfolge zerlegt und dann den "i" -Ndex dieses Elements verkettet (dies löst doppelten Wertefall). Das ist in der Variablen 'a' gespeichert. Anschließend geben wir das folgende Ergebnis zurück: Ordnen Sie jedes Element in 'a' dem Index dieses Elements in der sortierten Version von a (als Ganzzahlen) zu und übertragen Sie es in ein natives JS-Array
Beachten Sie, dass negative doppelte Zahlen in umgekehrter Reihenfolge gedruckt werden. Ich bin nicht sicher, ob das diese Lösung ungültig macht? Technisch gesehen sollten 8,10,4, -1, -1,8 laut OP 3,5,2,0,1,4 sein, aber mein Code druckt 3,5,2,1,0,4, was ich glaube noch technisch gültig?
quelle
GNU Core Utils,
3933 BytesErzeugt 1-basierte Ausgabe.
-v0
Nach der zweiten hinzufügennl
, um eine 0-basierte Ausgabe zu erhalten. (+4 Bytes)Befehle, die wir verwenden:
nl
Fügt jeder Zeile der Eingabe Zeilennummern hinzu.sort -n -k 2
sortiert nach Spalte 2 numerisch.cut -f 1
Nimmt die erste durch Tabulatoren getrennte Spalte und verwirft den Rest.Zusätzlich ist die
-s
Option an übergeben werdensort
, um eine stabile Sortierung anzufordern, die wir hier jedoch nicht benötigen. Wenn zwei Elemente identisch sind,sort
wird ihre Reihenfolge bestimmt, indem auf die anderen Spalten zurückgegriffen wird. Dies ist in diesem Fall die monoton steigende Ausgabe vonnl
. Die Sortierung ist also aufgrund der Eingabe stabil, ohne dass sie angegeben werden muss.quelle
Java
149140 BytesGolf gespielt
Vielen Dank an @ Kevin Cruissjen für das Rasieren von 9 Bytes.
quelle
int[] a
undint[] b
. Sie können dieint
aus den Schleifen nehmen. Und da Sie esb.length
zu Beginn zweimal verwenden, können Sie es in ein separates Feld einfügen. Insgesamt also ungefähr so:int[]a(int[]b){int l=b.length,o[]=new int[l],i,j;for(i=-1;++i<l;)for(j=-1;++i<b.length;)if(b[i]==Arrays.sort(b.clone())[j])o[i]=j;return o;}
( 140 Bytes ) Hmm, es scheint auch nicht zu funktionieren. EsArrays.sort(...)
gibt nichts zurück (es ist einevoid
Methode). Wie kann man es also vergleichenb[i]
?PHP, 88 Bytes
arbeitet mit Kommandozeilenargumenten; druckt eine durch 0 Indexe und Unterstriche getrennte Liste. Laufen Sie mit
-nr
.Nervenzusammenbruch
quelle
MATLAB, 29 Bytes
Die meisten integrierten Sortierfunktionen von MATLAB geben ein optionales zweites Array mit den sortierten Indizes zurück. Das
j=
könnte entfernt werden, wenn das Drucken der Indizes akzeptabel ist, anstatt sie zurückzugeben.quelle
CJam , 19 Bytes
Probieren Sie es online!
Erläuterung:
quelle