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]

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!


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


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.

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
> 

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

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 .


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.


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

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)},@$_}

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!


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.


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)

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~

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

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.


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!


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}*)

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.


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.


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.


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


0

Rubis, 45 40 octets

->a{a.map{|x|a.sort.reverse.index(x)+1}}

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



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.



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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.