Sommaire
Étant donné une liste d'entiers, retournez l'index auquel chaque entier se retrouverait lors du tri.
Par exemple, si la liste était [0,8,-1,5,8]
, vous devriez revenir [1,3,0,2,4]
. Notez que les deux 8
s maintiennent leur ordre l'un par rapport à l'autre (le tri est stable).
Autrement dit: pour chaque élément de la liste, renvoyez le nombre d'éléments de la liste qui sont: plus petits que l'élément choisi OU (égal à l'élément ET apparaît avant l'élément choisi)
Les index doivent commencer par 0 (pas 1) EDIT: étant donné le grand recul, je vais autoriser les indices basés sur 1.
Cas de test:
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
la source
la source
[0 1 ... n-1]
.8,10,4,-1,-1
cas de test est très trompeur. Essayez d'4,4,0,1,1,2,0,1
abord celui-là.Réponses:
APL, 2 octets
Le «grade up» intégré, appliqué deux fois. Fonctionne si l'indexation commence à 0, ce qui n'est pas la valeur par défaut pour toutes les versions d'APL. Essayez-le ici!
Pourquoi ça marche?
⍋x
renvoie une liste d'indices qui seraient triés de manière stablex
. Par exemple:parce que si vous prenez un élément
2
, alors6
, alors3
… vous obtenez une liste triée de manière stable:Mais la liste d'index qui répond à cette question est subtilement différente: nous voulons d'abord l'index du plus petit élément, puis le deuxième plus petit, etc. - encore une fois, en gardant l'ordre d'origine.
Si nous regardons
⍋x
, cependant, nous voyons que cela peut nous donner facilement cette liste: la position d'un0
in⍋x
nous indique où le plus petit élément finirait après le tri, et la position d'un1
in⍋x
nous indique où le deuxième plus petit élément finirait , etc.Mais nous savons que
⍋x
contient exactement les nombres [0, 1… n − 1] . Si nous le notons à nouveau , nous obtiendrons simplement l'indice de0
in⍋x
, puis l'indice de1
in⍋x
, etc., ce qui est précisément ce qui nous intéresse.La réponse est donc
⍋⍋x
.la source
Gelée, 2 octets
Montez deux fois. 1 indexé. Essayez-le en ligne!
la source
JavaScript ES6,
8782797470 octetsJe n'aime pas utiliser un objet, mais cela semble être le moyen le plus court de garder une trace des dupes
Explication
la source
K ,
52 octetsMontez (
<
) deux fois. JohnE a économisé trois octets en soulignant que les expressions tacites existent en K! Super cool. Essaye le.la source
<<
. Essayez-le ici .Haskell,
5048 octetsExemple d'utilisation:
m.m $ [4,4,0,1,1,2,0,1]
->[6,7,0,2,3,5,1,4]
.Il est
map snd.sort.zip x [0..]
appliqué deux fois sur l'entrée, c'est-à-dire que chaque élément e est associé à son indice i ((e,i)
), triez-le et supprimez les premiers éléments. Répétez une fois.@Lynn est arrivé avec
m=map snd.sort.(`zip`[0..])
le même nombre d'octets.la source
Python 2,
6760 octetsMerci à @xnor d'avoir joué au golf 7 octets!
Testez-le sur Ideone .
la source
enumerate
peut être fait plus court aveczip
:l=input();x=zip(l,range(len(l)))
.PowerShell v2 +, 63 octets
Prend l'entrée
$n
, les tuyaux qui traversent une boucle sur chaque élément|%{...}
. À chaque itération, noussort
$n
obtenonsIndexOf
notre élément actuel$_
. Cela compte combien d'éléments sont plus petits que l'élément actuel. Nous ajoutons à cela une tranche de$n
, qui développe chaque itération de boucle, des éléments qui sont égaux à l'élément courant$_
et prenons le.Count
de cela. Nous soustrayons ensuite-1
afin de ne pas compter notre élément actuel, et ce nombre est laissé sur le pipeline. La sortie à la fin est implicite.Exemples
la source
CJam, 15 octets
Essayez-le en ligne!
Explication
la source
J, 5 octets
Montez (
/:
) deux fois (^:2
). 0 indexé.Pour l' essayer, tapez
f =: /:^:2
puisf 4 4 0 1 1 2 0 1
dans tryj.tk .la source
/:@/:
avec un nombre d'octets égal.MATL,
1094 octets4 octets économisés grâce à @Luis
Cette solution utilise l'indexation basée sur 1
Essayez-le en ligne
la source
05AB1E, 12 octets
Expliqué
Essayez-le en ligne
la source
Python 2, 67 octets
xnor a enregistré deux octets.
la source
a=input();p=[]\nfor x in a:print sorted(a).index(x)+p.count(x);p+=x,
Haskell, 40 octets
Annotez chaque élément avec son index, puis mappez chaque élément au nombre d'éléments plus petits, en brisant l'égalité sur l'index. Pas de tri.
la source
Julia, 17 octets
1 indexé. Montez (
sortperm
) deux fois. Essayez-le ici.EDIT: Dennis a économisé quatre octets en donnant des noms d'opérateur de trucs! Julia est bizarre.
la source
JavaScript (ES6), 52 octets
Définit
g
comme la fonction de grade, qui renvoie un tableau d'index dont tous les éléments du tableau trié seraient issus du tableau d'origine. Malheureusement, ce que nous voulons, ce sont les indices vers lesquels iront tous les éléments. Heureusement, cela s'avère être la correspondance entre la note et la liste d'origine des indices, qui peut elle-même être considérée comme le résultat du tri de la note, ce qui nous permet de prendre la note de la note pour obtenir le résultat souhaité.la source
Pyth,
109 octets1 octet grâce à Jakube.
Suite de tests.
Il doit y avoir un chemin plus court ...
la source
xL
au lieu desxR
. Ou est-ce que j'oublie quelque chose?Raquette, 117 octets
Je suis éternellement déçu par l'absence d'un builtin pour cela.
la source
Rubis,
5453 octetsEssayez-le en ligne
-1 octet de la mise à niveau vers l'approche de @ Downgoat consistant à utiliser un hachage pour stocker les valeurs au lieu de compter les doublons à chaque fois.
la source
Clojure, 83 octets
Je crée une fonction anonyme qui classe le tableau d'entrée et l'itère deux fois sur l'entrée. Le premier appel renverra la note. Le deuxième appel opère sur la note et renvoie le rang.
la source
Brachylog , 27 octets
Essayez-le en ligne! ou vérifiez tous les cas de test .
Explication
Il s'agit d'une implémentation simple de la relation suivante: chaque entier de la sortie correspondant à un élément de l'entrée est l'indice de cet élément dans l'entrée triée.
la source
Mathematica, 15 octets
la source
Mathematica, 135 octets
la source
Lisp commun, 117 octets
Appliquez deux fois une transformation schwartzienne.
Tester
la source
JavaScript (à l'aide d'une bibliothèque externe) (105 octets)
Lien vers la bibliothèque: https://github.com/mvegh1/Enumerable Explication du code: créez une méthode anonyme qui accepte une liste d'entiers. _.From crée une instance de la bibliothèque qui enveloppe un tableau avec des méthodes spéciales. Sélectionnez mappe chaque élément à un nouvel élément, en prenant la valeur "v", en l'analysant en une chaîne, puis en concaténant l'index "i" de cet élément (cela résout le cas de valeur en double). C'est stocké dans la variable «a». Ensuite, nous renvoyons le résultat de ce qui suit: Mappez chaque élément de 'a' à l'index de cet élément dans la version triée de a (sous forme d'entiers), puis convertis en tableau JS natif
Notez que les nombres négatifs en double semblent s'imprimer dans l'ordre inverse. Je ne sais pas si cela invalide cette solution? Techniquement, 8,10,4, -1, -1,8 devraient être 3,5,2,0,1,4 selon OP, mais mon code imprime 3,5,2,1,0,4 qui, je crois, est toujours techniquement valable?
la source
GNU Core Utils,
3933 octetsProduit une sortie basée sur 1. Ajouter
-v0
après la secondenl
pour obtenir une sortie basée sur 0. (+4 octets)Commandes que nous utilisons:
nl
ajoute des numéros de ligne à chaque ligne de l'entrée.sort -n -k 2
trie par colonne 2 numériquement.cut -f 1
prend la première colonne délimitée par des tabulations, jetant le reste.De plus, l'
-s
option peut être passée àsort
pour demander un tri stable, mais nous n'en avons pas besoin ici. Si deux éléments sont identiques,sort
déterminera leur ordre en retombant dans les autres colonnes, qui dans ce cas est la sortie augmentant de façon monotonenl
. Le tri sera donc stable sans avoir besoin de le spécifier, grâce à l'entrée.la source
Java
149140 octetsGolfé
Merci à @Kevin Cruissjen pour le rasage de 9 octets.
la source
int[] a
etint[] b
. Vous pouvez retirerint
les boucles. Et puisque vous utilisezb.length
deux fois au début, vous pouvez le mettre dans un champ séparé. Donc au total quelque chose comme ça: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 octets ) Hmm, aussi, cela ne semble pas fonctionner ..Arrays.sort(...)
ne retourne rien (c'est unevoid
méthode), alors comment pouvez-vous le comparer avecb[i]
? ..PHP, 88 octets
fonctionne sur des arguments de ligne de commande; imprime une liste indexée 0, séparée par un trait de soulignement. Courez avec
-nr
.panne
la source
MATLAB, 29 octets
La plupart des fonctions intégrées de tri de MATLAB renverront un deuxième tableau facultatif contenant les indices triés. Le
j=
pourrait être supprimé si l'impression des index est acceptable, plutôt que de les renvoyer.la source
CJam , 19 octets
Essayez-le en ligne!
Explication:
la source