Classez une liste d'entiers

21

Vous obtenez une liste non vide d'entiers positifs, par exemple

[6 2 9 7 2 6 5 3 3 4]

Vous devez classer ces nombres en fonction de leur valeur, mais comme d'habitude dans les classements, s'il y a égalité, tous les nombres liés obtiennent le même rang et un nombre approprié de rangs est ignoré. Le résultat attendu pour la liste ci-dessus serait donc

[3 9 1 2 9 3 5 7 7 6]

Par exemple, la valeur la plus élevée dans l'entrée était 9, donc cela devient un 1(premier rang). La troisième valeur la plus élevée est 6, donc les deux 6s deviennent 3, et le rang 4est entièrement ignoré.

Règles

Vous pouvez utiliser n'importe quel format de liste plat pratique et sans ambiguïté pour l'entrée et la sortie. Le premier / plus petit rang dans la sortie doit toujours être 1 .

Vous pouvez écrire un programme ou une fonction et utiliser l'une de nos méthodes standard de réception d'entrée et de sortie.

Vous pouvez utiliser n'importe quel langage de programmation , mais notez que ces failles sont interdites par défaut.

Il s'agit de , donc la réponse valide la plus courte - mesurée en octets - l'emporte.

Cas de test

[8] -> [1]
[1 15] -> [2 1]
[18 14 11] -> [1 2 3]
[11 16 14 8] -> [3 1 2 4]
[15 15 15 15 15] -> [1 1 1 1 1]
[10 2 5 4 15 5] -> [2 6 3 5 1 3]
[5 5 10 10 5 11 18] -> [5 5 3 3 5 2 1]
[2 4 9 4 17 9 17 16] -> [8 6 4 6 1 4 1 3]
[11 17 19 17 10 10 15 3 18] -> [6 3 1 3 7 7 5 9 2]
[2 11 4 8 3 3 12 20 4 18] -> [10 4 6 5 8 8 3 1 6 2]
[12 6 10 2 19 19 6 19 8 6 18] -> [5 8 6 11 1 1 8 1 7 8 4]
[5 6 14 19 13 5 19 9 19 9 9 19] -> [11 10 5 1 6 11 1 7 1 7 7 1]
[9 2 12 3 7 11 15 11 6 8 11 17 11] -> [8 13 3 12 10 4 2 4 11 9 4 1 4]
[3 5 15 7 18 5 3 9 11 2 18 1 10 19] -> [11 9 4 8 2 9 11 7 5 13 2 14 6 1]
[6 11 4 19 14 7 13 16 10 12 7 9 7 10 10] -> [14 6 15 1 3 11 4 2 7 5 11 10 11 7 7]
[11 20 11 1 20 16 11 11 4 8 9 7 11 14 10 14] -> [6 1 6 16 1 3 6 6 15 13 12 14 6 4 11 4]
[4 7 15 2 3 2 3 1 14 2 10 4 7 6 11 2 18] -> [9 6 2 13 11 13 11 17 3 13 5 9 6 8 4 13 1]
[5 1 17 7 1 9 3 6 9 7 6 3 2 18 14 4 18 16] -> [12 17 3 8 17 6 14 10 6 8 10 14 16 1 5 13 1 4]
[5 6 8 10 18 13 20 10 7 1 8 19 20 10 10 18 7 2 1] -> [16 15 11 7 4 6 1 7 13 18 11 3 1 7 7 4 13 17 18]
[12 17 8 2 9 7 15 6 19 5 13 16 14 20 10 11 18 4 3 1] -> [9 4 13 19 12 14 6 15 2 16 8 5 7 1 11 10 3 17 18 20]
Martin Ender
la source
1
Étroitement liés. La différence est que ce défi garantit que l'entrée est triée, ce qui signifie que la plupart des réponses reposent sur une forme de indexOffonction. Je pense que pour les entrées non triées, il existe des alternatives plus courtes dans de nombreuses langues.
Martin Ender
Je suis désolé, mais je pense que c'est trop proche du lien de Lynn. Les différences sont minimes: les valeurs sont tronquées, vous ne pouvez pas supposer une entrée déjà triée et la moitié de la sortie a son ordre inversé. La réponse acceptée à la question liée fonctionne presque. Avec un minimum d'effort, quelqu'un pourrait le faire fonctionner. En tant que tel, je maintiens qu'il s'agit d'un doublon.
Ismael Miguel
Je ne suis pas d'accord, ce n'est clairement pas un doublon.
Timtech
Je suis d'accord avec timtech, ce défi est plus simple, mais pas en double.
tuskiomi

Réponses:

13

Solution de contournement dans Excel pour les règles stupides concernant les entrées de souris sur l'échange de pile de golf de code: (WESRRMICGSE) 28 octets

rank(RC[1],r1c1:r1024:c1024)

Entrez la liste en tant que csv ( 10,23,34,2,) dans le compilateur après avoir entré la source. pas de guillemets, pas de crochets, virgule de fin.

WESRRMICGSE est exactement comme la programmation dans Excel, sauf que vous pouvez omettre le signe '=' initial pour enregistrer un octet. La différence de fonctionnalité vient du fait que WESRRMICGSE fera glisser la formule vers le bas pour copier le code automatiquement et fournir différentes sorties fournies avec une seule entrée entière. fourni une liste en entrée, cette liste va dans la colonne B (colonne d'entrée), et la formule est automatiquement décomposée pour correspondre au nombre d'entrées. (par exemple: l'entrée 34,21,45 «ferait glisser» la formule vers le bas de 2 cellules, pour un total de 3 cellules avec la formule).

Edit: je ne m'attendais pas à ce que cette réponse soit populaire. Hou la la!

tuskiomi
la source
21
Le nom de la langue est un peu désagréable ...
Conor O'Brien
À quelles règles faites-vous référence et à quel point sont-elles idiotes?
Luis Mendo
3
@LuisMendo les règles déclarées ici: meta.codegolf.stackexchange.com/questions/10199/… Je pense que la règle est idiote parce que j'ai pris 5 minutes pour écrire un «interprète» qui contourne exactement ce dont ils parlent. Plus cette langue peut être utilisée dans les défis, plus la règle devient idiote. Je vais être sûr d'inclure cela dans le lien.
tuskiomi
9

Python 2, 41 octets

lambda l:map(sorted(l+[l])[::-1].index,l)

Pour chaque valeur, recherchez son index dans la liste triée par ordre décroissant. Pour que la plus grande valeur donne 1 au lieu de 0, nous utilisons un élément supplémentaire "infini" de la liste elle-même, car Python 2 traite les listes comme plus grandes que les nombres.

Une solution plus directe est de 42 octets et fonctionne également en Python 3.

lambda l:[1+sum(y<x for x in l)for y in l]

Pour chaque élément, compte le nombre d'éléments plus petits, en ajoutant 1 pour passer à 1 indexé.

xnor
la source
8

Gelée , 5 octets

ṢṚiЀ

Essayez-le en ligne!

Comment ça marche

ṢṚiЀ  Main link. Argument: A (array)

ṢṚ     Sort and reverse A.
  iЀ  Find the index of each n in A in the previous result.
Dennis
la source
7

R, 24 25 20 octets

Utilise la fonction de classement standard avec la méthode des liens "min" sur le vecteur nié. catajouté pour le sortir vers STDOUT. Un enregistré grâce à @Guiseppe

cat(rank(-scan(),,"mi"))

Exemple

> cat(rank(-scan(),,"mi"))
1: 9 2 12 3 7 11 15 11 6 8 11 17 11
14: 
Read 13 items
8 13 3 12 10 4 2 4 11 9 4 1 4
> 
MickyT
la source
Je pense que vous devez l'envelopper catpour que ce soit un programme complet.
Alex A.
@AlexA. Je me posais des questions à ce sujet. Serait-il juste de dire que c'est une fonction à part entière et dans ce cas, ce serait rank(-a,,'min')ok où a est la liste entrée sous forme vectorielle?
MickyT
Dans ce cas, nous le considérerions comme un extrait de code, car il suppose qu'une variable existe déjà dans l'espace de noms. Pour en faire une soumission de fonction appropriée, vous auriez besoin function(a)rank(-a,,'min').
Alex A.
peut être raccourci à juste au "mi"lieu de "min".
Giuseppe
@AlexA. pourquoi faut-il l'envelopper cat? Si la soumission avait été faite function(a)rank(-a,,'mi'), elle serait considérée comme suffisante et la sortie du programme est identique àrank(-scan(),,'mi')
Mark
4

PowerShell v2 +, 43 41 octets

($a=$args)|%{@($a|sort -d).indexof($_)+1}

Développé indépendamment, mais je vois que c'est le même algorithme que la solution Python @ xnor , donc / hausser les épaules.

Prend les entrées sous forme d'arguments de ligne de commande individuels (c'est-à-dire une liste séparée par des espaces). La sortie (formatage par défaut) est une nouvelle ligne entre les éléments.

Pour chaque élément de la liste d'entrée, il s'agit de sortla liste d'entrée dans l' -dordre croissant, prend l' .indexOf()élément en cours et ajoute 1. Notez le tableau explicite cast@(...) afin de prendre en compte une entrée à un chiffre. Les nombres résultants sont laissés sur le pipeline et la sortie est implicite.

Sauvegardé 2 octets grâce à @Matt!

Exemple

PS C:\Tools\Scripts\golfing> .\rank-the-integers.ps1 6 2 9 7 2 6 5 3 3 4
3
9
1
2
9
3
5
7
7
6
AdmBorkBork
la source
Y a-t-il une raison qui sort -dn'a pas fonctionné pour vous? C'est sans ambiguïté pour moi.
Matt
@Matt Odd. Sur mon ISE Win8.1, il indique cela -Descendinget -Debugest ambigu. Mais dans le shell droit sur Win8.1 et le shell et ISE sur Win10, cela fonctionne bien. Ce ne serait pas la première fois que mon installation particulière de Win8.1 est maladroite ...: - / Merci pour le golf!
AdmBorkBork
Cela ne fonctionnait-il pas également pour tous les cas de test? $args|%{@($args|sort -d).indexof($_)+1}il est plus court mais je n'ai pas bien regardé pour voir si ça marche
Matt
@Matt Cela ne fonctionne pas car le second $argsfonctionne comme entrée pour le bloc de script de la boucle {...}, comme si vous utilisiez un filterou function.
AdmBorkBork
3

Octave, 15 octets

@(x)sum(x<x')+1

Port de ma réponse MATL à Octave. Il fonctionne également dans Matlab R2016b.

Le code définit une fonction anonyme. Pour l'appeler, affectez-le à une variable. Essayez-le chez Ideone .

Luis Mendo
la source
3

JavaScript (ES6), 38 36 octets

a=>a.map(e=>a.map(d=>r+=e<d,r=1)&&r)

Edit: sauvé 2 octets grâce à @ETHproductions.

Neil
la source
.mapFTW ;-)a=>a.map(e=>a.map(d=>r+=e<d,r=1)&&r)
ETHproductions
3
@ETHproductions Pourquoi devez-vous toujours gâcher mon plaisir?
Neil
2

Gelée , 5 octets

<S‘ð€

TryItOnline!

Comment?

<S‘ð€ - Main link: listOfValues
   ð  - dyadic chain separation
    € - for each
<     - less than (vectorises) - yields a list of 1s and 0s
 S    - sum - yields number of values the current value is less than (those that beat it)
  ‘   - increment - the place of a value is the number that beat it plus 1.
Jonathan Allan
la source
Dans quelle mesure est-ce similaire au code J que j'allais soumettre? 1+(+/@:<)"0 1~
Dane
Cela ressemble (utilise une réduction pour additionner?), Mais cela ne devrait en aucun cas vous empêcher de poster votre code!
Jonathan Allan
Je suppose que je me demandais plus ce que "la séparation de chaîne dyadique" et "pour chacun" font dans un langage inspiré de J.
Dane
Ah, bien de votre explication, je pense que votre code ressemble plus >€µS‘ou vraiment <@€µS‘( @inverse les arguments à l' <opérateur). Le J ~est implicite dans la chaîne à gauche de la µ, qui est une séparation monadique (plutôt que dyadique) et <vectorise si le ou les arguments sont (sont) des listes.
Jonathan Allan
2

Perl 6 ,  42  26 octets

Trouver le premier index :kdans une [R,]liste triée inversée

{map {[R,](.sort).first(*==$^a,:k)+1},@$_}

Comptez les valeurs plus grandes et ajoutez-en une

{map {1+.grep(*>$^a)},@$_}
Brad Gilbert b2gills
la source
2

JavaScript, 87 49 octets

f=a=>a.slice().map(function(v){return a.sort(function(a,b){return b-a}).indexOf(v)+1 })

a=>[...a].map(v=>a.sort((a,b)=>b-a).indexOf(v)+1)

Merci Conor O'Brien et ETHproductions!

Oliver
la source
1
Vous pouvez utiliser une fonction anonyme dans la carte, par exemple v=>a.sort((a,b)=>b-a).indexOf(v)+1.
Conor O'Brien
Vous n'avez pas besoin .slice()du tout, car .mapfonctionne sur une copie du tableau.
ETHproductions
Et notre politique de site est que la fonction n'a pas besoin d'être nommée, vous pouvez donc également supprimer le début f=.
Conor O'Brien
@ETHproductions Si j'enlève une tranche, en passant en [18,13,18]retour [1,1,2]au lieu de[1, 3, 1]
Oliver
Oh, c'est bizarre ... Je suppose que c'est parce que a.sort()stocke le tableau trié a. Mais vous pouvez changer a.slice()pour [...a]sauver quelques octets.
ETHproductions
2

Mathematica, 44 octets 42 octets 40 octets

xPosition[SortBy[x,-#&],#][[1,1]]&/@x

est le caractère à usage privé de 3 octets U+F4A1( page de documentation de Wolfram )

Edit: Merci à JHM pour les économies d'octets.

ngenisis
la source
1
Échec pour le cas de test {10,2,5,4,15,5}(la sortie ne doit {2,6,3,5,1,3}pas l' être {2,5,3,4,1,3}. Notez que cela 4doit être ignoré car il y a deux 5s dans l'entrée).
JungHwan Min
Dûment corrigé.
ngenisis
1
-2 octets par commutation xet #(se débarrasser efficacement des parenthèses): xPosition[SortBy[x,-#&],#][[1,1]]&/@x.
JungHwan Min
2

Pyke, 6 octets

FQS_@h

Essayez-le ici!

F      - for i in input():
 QS    -     sorted(input())
   _   -    reversed(^)
    @  -   i.find(^)
     h -  ^+1 (not required if allowed to start from 0)
Bleu
la source
2

J , 14 8 octets

1+1#.</~

Comment?

1+1#.</~ - Consumes and returns a list of integers
       ~ - Use the same list for both inputs
     </  - Create a table of less-than comparisons
  1#.    - Treat each row like digits of a base-one number, returning a list of integers
1+       - Increment the results

Solution précédente

1+(+/@:<)"0 1~
Danois
la source
Bonjour, j'ai trouvé une version plus courte pour 8 octets 1+1#.</~. La sommation par ligne est effectuée à l'aide de la conversion de base 1. Une autre alternative est 1+\:~i.]également de 8 octets.
miles
Agréable! Voulez-vous publier votre propre réponse? Sinon, je vais inclure l'amélioration de base-un.
Dane
2
Non, je suis d'accord avec juste suggérer des économies d'octets. N'hésitez pas à les utiliser
miles
1

Haskell, 28 octets

f l=[1+sum[1|y<-l,y>x]|x<-l]

Juste quelques listes de compréhension.

xnor
la source
20 secondes trop tard. J'étais sur le point de poster la même réponse.
nimi
1

Wonder , 28 octets

@(->@+1:0iO#0rev sort#I#1)#0

Usage:

(@(->@+1:0iO#0rev sort#I#1)#0)[6 2 9 7 2 6 5 3 3 4]

Mappez sur le tableau d'entrée avec une fonction qui ajoute 1 au premier index de l'élément dans une version triée décroissante de l'entrée.

Mama Fun Roll
la source
1

Dyalog APL , 7 octets

⊢⍳⍨⍒⊃¨⊂

arguments'

⍳⍨ indices dans

les indices qui trieraient l'argument en ordre décroissant

⊃¨ chacun choisi

l'argument entier

TryAPL en ligne!

Adam
la source
1

Mathematica, 37 octets

Min@Position[-Sort@-#,i]~Table~{i,#}&

Une fonction pure qui classera son entrée, selon les règles du problème. Ex:

Min@Position[-Sort@-#, i]~Table~{i, #} &[{6, 2, 9, 7, 2, 6, 5, 3, 3, 4}]
(*{3, 9, 1, 2, 9, 3, 5, 7, 7, 6}*)
J. Antonio Perez
la source
1

Méduse , 15 octets

p`&& ~i
  >/+`<

Essayez-le en ligne!

Explication

Il ne semble pas encore y avoir un bon moyen de trouver l'index d'une valeur dans une liste dans Jellyfish, donc cela utilise l'approche de compter le nombre de valeurs plus grandes que la valeur actuelle et d'incrémenter le résultat. Cela se fait en grande partie en construisant une fonction unaire qui calcule cette valeur pour un élément donné.

     `<

Cela crée une version filetée de l'opérateur de comparaison, donc si vous lui donnez un entier et une liste, il renverra une liste de résultats de comparaison entre cet entier et chaque élément de la liste.

     ~i
     `<

Cela recense l'argument de droite de la fonction précédente avec la liste d'entrée. Le résultat est donc une fonction unaire qui prend un entier et vous donne la liste des résultats de comparaison avec l'entrée du programme.

   & ~i
   /+`<

Ici, /+c'est la réduction par addition, ce qui signifie que c'est simplement une fonction "additionner cette liste". &compose ceci sur la fonction précédente, nous avons donc maintenant une fonction unaire qui compte combien de valeurs dans l'entrée sont plus grandes que cet entier.

  && ~i
  >/+`<

Nous composons également la fonction d'incrémentation sur ceci.

 `&& ~i
  >/+`<

Enfin, nous enfilons également cette fonction, afin qu'elle soit automatiquement appliquée à chaque entier d'une liste qui lui est passée. En raison de la disposition du code, iil se trouve que l'entrée est également utilisée pour cette fonction, de sorte que cela calcule la sortie souhaitée.

p`&& ~i
  >/+`<

Enfin, cela imprime le résultat.

Martin Ender
la source
1

brainfuck, 124 octets

->,[>>>+>,]<[-<+]+[-->[<[<<<<]>>>+>[>[>>]<[[<<+<<]>+>[->>>>]]<+>>>]+[-<<+]->]<[<
<<<]>+.,>>[>[>->+>>]<<[-<<<<]>-]+[->+]+>>>>]

Formaté:

->
,[>>>+>,]
<[-<+]
+
[
  -->
  [
    <[<<<<]
    >>>+>
    [
      >[>>]
      <
      [
        [<<+<<]
        >+>[->>>>]
      ]
      <+> >>
    ]
    +[-<<+]
    ->
  ]
  <[<<<<]
  >+.,>>
  [
    >[>->+>>]
    <<[-<<<<]
    >-
  ]
  +[->+]
  +>>>>
]

Ceci est conçu pour les implémentations brainfuck 8 bits. L'entrée et la sortie se font via des valeurs d'octets .

Essayez-le en ligne.

Pour chaque élément, cela compte le nombre d'éléments supérieur à celui-ci, puis imprime le résultat plus un. Ceci est accompli en incrémentant tous les éléments jusqu'à ce que l'élément actuel soit égal à zéro, en mettant à jour le résultat chaque fois qu'un autre élément devient nul avant l'élément actuel.

La bande est divisée en nœuds à 4 cellules,

b c 0 0

c est l'élément et best un indicateur de navigation qui est négatif pour l'élément actuel, sinon un.

Le résultat et une copie de l'élément courant sont conservés à gauche du tableau.

Mitch Schwartz
la source
1

Java, 215 octets

public class G{public static void L(int[]A){int[]r=new int[A.length];for(int i=0;i<A.length;i++){int c=1;for(int j=0;j<A.length;j++){if(A[j]>A[i])c++;}r[i]=c;}for(int i=0;i<r.length;i++)System.out.print(r[i]+",");}}

Explication:

Très explicite.

Fondamentalement, pour chaque entier du tableau, il vérifie combien sont plus grands que lui, puis imprime le nouveau tableau avec les classements.

Je suis désolé, ce n'est pas très concis, mais c'est mon premier essai sur l'un d'entre eux et je n'ai pas vu d'entrée pour Java. Je suis sûr qu'il peut être joué plus bas.

Il peut être exécuté simplement en faisant référence à la méthode statique et en passant un tableau. Je ne pensais pas qu'il était nécessaire d'écrire la fonction principale, mais si c'est le cas, je le ferai à l'avenir.

Henri
la source
Pouvez-vous supprimer une partie de cet espace? Comme c'est le cas, ce n'est pas du tout un golf. (c.-à-d. les espaces r = new)
Rɪᴋᴇʀ
@EasterlyIrk Oui, désolé, je n'ai pas l'habitude de faire ça. Je pense que je me suis débarrassé de tous les espaces inutiles.
Henry
Pouvez-vous nommer le "rankNumbersGolf" quelque chose de plus court comme "G" ou quelque chose?
Rɪᴋᴇʀ
@EasterlyIrk Oui, merci.
Henry
Je ne java pas bien, mais pouvez-vous supprimer certains espaces dans les trois for (?
Rɪᴋᴇʀ
0

PHP, 101 octets

Il doit y avoir un moyen plus court.

function f(&$a){for($r=1;$v++<max($a);$r+=$n,$n=0)foreach($a as$k=>$w)if($w===$v){$a[$k]="$r";$n++;}}

la fonction prend l'entrée comme un tableau d'entiers, écrase la variable d'entrée avec les rangs sous forme de chaînes numériques.

Usage: $a=[1,2,4,2,2,3];f($a);print_r($a);

Titus
la source
0

Rubis, 45 40 octets

->a{a.map{|x|a.sort.reverse.index(x)+1}}
Lee W
la source
Comment cela s'appelle-t-il? Je n'arrive pas à faire correspondre les cas de test, il semble y avoir un bug avec des rangs égaux. Par exemple, [10, 2, 5, 4, 15, 5]me donne la sortie [2, 5, 3, 4, 1, 3]quand elle devrait être [2, 6, 3, 5, 1, 3]- je pense que pour résoudre ce problème, vous supprimez simplement le .uniq- économisant 5 octets!
Neil Slater
Je semble avoir mal lu la question. Merci d'avoir repéré ça!
Lee W
0

Clojure, 48 44 octets

Mise à jour: utilisation forau lieu demap

#(for[i %](+(count(filter(partial < i)%))1))

Filtre simplement chaque valeur plus petite que la valeur actuelle, compte la longueur de la liste et incrémente d'une unité.

NikoNyrh
la source
0

PHP, 84 octets

function r($l){$s=$l;rsort($s);foreach($l as$n)$r[]=array_search($n,$s)+1;return$r;}

Utilisation: transmettez la fonction r à votre tableau d'entiers et elle renverra le tableau correspondant d'entiers classés.

Passer les tests ici.

Progrock
la source
0

K (oK) , 11 octets

Solution:

1+(x@>x)?x:

Essayez-le en ligne!

Exemples:

1+(x@>x)?x:6 2 9 7 2 6 5 3 3 4
3 9 1 2 9 3 5 7 7 6
1+(x@>x)?x:5 6 14 19 13 5 19 9 19 9 9 19
11 10 5 1 6 11 1 7 1 7 7 1

Explication:

Position de recherche de la liste d'origine dans la liste triée, puis ajoutez-en une.

1+(x@>x)?x: / the solution
         x: / save input as x
  (  >x)    / return indices of x sorted in descending order
   x@       / apply these indices to x (thus sort x)
        ?   / lookup right in left
1+          / add one
streetster
la source