Étant donné une liste d'entiers strictement positifs, parcourez chaque nombre distinct et remplacez-en toutes les occurrences par des indices successifs (zéro ou un basés) d'une nouvelle série.
Exemples
[]
→ []
/[]
[42]
→ [0]
/[1]
[7,7,7]
→ [0,1,2]
/[1,2,3]
[10,20,30]
→ [0,0,0]
/[1,1,1]
[5,12,10,12,12,10]
→ [0,0,0,1,2,1]
/[1,1,1,2,3,2]
[2,7,1,8,2,8,1,8,2,8]
→ [0,0,0,0,1,1,1,2,2,3]
/[1,1,1,1,2,2,2,3,3,4]
[3,1,4,1,5,9,2,6,5,3,5,9]
→ [0,0,0,1,0,0,0,0,1,1,2,1]
/[1,1,1,2,1,1,1,1,2,2,3,2]
Réponses:
JavaScript (ES6), 26 octets
1 indexé.
Essayez-le en ligne!
Commenté
la source
-~
auparavant - c'est un joyau absolu.a
pour stocker les valeurs, mais il est requis pour-
/~
l'index afin qu'aucun octet ne soit enregistré.-~
est en fait une alternative couramment utilisée+1
(car il a une priorité différente) dans de nombreuses languesR , 27 octets
Essayez-le en ligne!
Explication:
ave(x,x,FUN=seq)
divise le vecteurx
en sous-vecteurs en utilisant les valeurs dex
comme clés de regroupement. Ensuite, laseq
fonction est appelée pour chaque groupe et chaque résultat est réorganisé dans la position de groupe d'origine.Mieux vaut voir un exemple:
Remarque :
seq(y)
La fonction retourne une séquence1:length(y)
au cas oùy
haslength(y) > 1
, mais renvoie une séquence de1:y[1]
ify
ne contient qu'un seul élément.Ce n'est heureusement pas un problème car dans ce cas R - se plaignant de nombreux avertissements - ne sélectionne que la première valeur qui est d'ailleurs ce que nous voulons :)
la source
ave
auparavant.MATL , 4 octets
Cette solution est basée sur 1
Essayez-le sur MATL Online !
Explication
Utilise
[1,2,3,2]
comme exemplela source
APL (Dyalog Unicode) , 7 octets
Un grand merci à H.PWiz, Adám et dzaima pour toute leur aide dans le débogage et la correction de cela.
Essayez-le en ligne!
Explication
La version non tacite de 10 octets sera plus facile à expliquer en premier
La version tacite fait trois choses
⍵
used in,\⍵
as,\
à droite par lui-même peut implicitement comprendre qu'il est censé fonctionner sur le bon argument.⍵=
, nous remplaçons le⍵
par⊢
, qui représente le bon argument⍵
), nous pouvons supprimer les accolades{}
car les fonctions tacites ne les utilisent pasla source
AWK , 14
Essayez-le en ligne!
Ce qui précède fait une indexation à base unique. Si vous préférez l'indexation à base zéro, c'est un octet supplémentaire:
Essayez-le en ligne!
la source
{print++a[$1]}
sans espace semble fonctionnerJ , 7 octets
Essayez-le en ligne!
1 indexé.
Explication:
K (oK) ,
1110 octets-1 octet grâce à ngn!
Essayez-le en ligne!
la source
='
->=
Python 2 , 48 octets
Essayez-le en ligne!
la source
05AB1E , 4 octets
Essayez-le en ligne! ou comme suite de tests
Explication
la source
C # (Visual C # Interactive Compiler) , 44 octets
Essayez-le en ligne!
la source
[7,7,7]
devrait sortir[0,1,2]
, et non[0,0,0]
.Python 2 ,
4743 octetsEssayez-le en ligne!
Une solution récursive «à base unique».
la source
Gelée , 4 octets
Essayez-le en ligne!
Pour chaque préfixe de la liste d'entrée, il compte le nombre d'occurrences de son dernier élément en lui-même.
la source
;\ċ"
aussi 4.R , 41 octets
Essayez-le en ligne!
Curieusement, le retour d'un indice de base zéro est plus court dans R.
la source
Rubis, 35 octets
C'est assez banal, malheureusement - créez un hachage qui stocke le total pour chaque entrée rencontrée jusqu'à présent.
Quelques autres options amusantes qui n'étaient malheureusement pas assez courtes:
la source
R ,
6243 octets-19 octets grâce à Giuseppe, en supprimant lequel, et le tableau, et seulement de légères modifications à l'implémentation
Original
Je ne peux pas rivaliser avec les connaissances de Giuseppe, donc ma soumission est un peu plus longue que la sienne, mais en utilisant mes connaissances de base, j'ai senti que cette solution était plutôt ingénieuse.
r<-table(x)
compte le nombre de fois que chaque numéro apparaît et le stocke dans r, pour référence futurenames()
obtient les valeurs de chaque entrée unique dans la table, et nous itérons sur ces noms avec une boucle for.La partie restante vérifie quelles entrées sont égales aux itérations et stocke une séquence de valeurs (de 1 au nombre d'entrées de l'itération)
Essayez-le en ligne!
la source
which()
pour enregistrer 7 octets.1:r[i]
m'a donné l'idée de supprimertable()
entièrement:x=z=scan();for(i in x)z[y]=1:sum(y<-x==i);z
43 octets! C'est une belle approche!Haskell , 44 octets
Essayez-le en ligne!
Explication
Parcourt la liste de gauche à droite en conservant la liste
x
des éléments visités, initialement[]
:Pour chaque rencontre d'un
y
compte, tous les éléments égaux de la listex
.la source
(#(0*));(x:r)#g=g x:r# \y->0^abs(y-x)+g y;e#g=e
essayez-le en ligne!Perl 6 , 15 octets
Essayez-le en ligne!
Vous pouvez déplacer le
++
vers avant le%
pour un index basé sur un.Explication:
la source
Haskell ,
4746 octetsEssayez-le en ligne!
Une approche différente de la réponse de BMO qui s'est avérée un peu plus longue. (Et emprunte gentiment leur belle combinaison de test.)
L'idée est de parcourir la liste d'entrée et de garder une trace du nombre de fois où chaque élément s'est produit en mettant à jour une fonction
g
. Non golfé:Deux opportunités de golf intéressantes se sont présentées. D'abord pour la valeur initiale de
g
, une fonction constante qui ignore son argument et renvoie0
:Et d'autre part une expression sur des variables
x
ety
qui donne1
six
égaly
et0
sinon:Il pourrait encore y avoir des moyens plus courts. Quelqu'un a une idée?
la source
0^(x-y)^2
.Java (JDK) , 76 octets
Essayez-le en ligne!
Crédits
la source
for(c=0,i=l;i-->0;)c+=a[l]==a[i]?1:0;
àfor(c=i=0;i<l;)c+=a[l]==a[i++]?1:0;
.Rubis , 34 octets
Essayez-le en ligne!
la source
->a{i=-1;a.map{|v|a[0..i+=1].count v}}
et que je n'ai pas pensé à construire un nouveau tableau, lol. Bon travail.bash,
3724 octetsTIO
si elle est valide, il y a aussi cette variation, comme suggéré par DigitalTrauma
TIO
la source
Perl 5, 11 octets
TIO
explications après commentaire
$_
la variable spéciale de perl contenant la ligne courante lors du bouclage sur l'entrée (-p
ou-n
commutateurs)$h{$_}++
dynamise automatiquement la carte%h
et crée une entrée avec clé$_
et incréments et donne la valeur avant incrément-p
commutateur, le-l
commutateur supprime la fin de ligne en entrée et ajoute la fin de ligne en sortiela source
Pari / GP , 32 octets
Essayez-le en ligne!
la source
Wolfram Language (Mathematica) , 33 octets
Essayez-le en ligne!
la source
Attaché , 23 octets
Essayez-le en ligne!
Explication
la source
C (gcc) ,
6562 octetsEssayez-le en ligne!
-2 octets grâce à ASCII uniquement
Cela semblait trop simple, mais je n'arrivais pas à raccourcir avec une approche différente.
la source
K (ngn / k) , 18 octets
Essayez-le en ligne!
VIEILLE APPROCHE
K (ngn / k) ,
27 2322 octetsEssayez-le en ligne!
ce n'est pas joli ... solution rapide et sale, je vais affiner cela plus tard quand j'aurai la chance de penser à une meilleure approche
explication:
=x
renvoie un dict où les clés sont des éléments de x et les valeurs leurs indices (3 1 4 5 9 2 6!(0 9;1 3;,2;4 8 10;5 11;,6;,7)
)i:
assigner dict ài
#:'
compter les valeurs pour chaque clé (3 1 4 5 9 2 6!2 2 1 3 2 1 1
)!:'
énumérer chaque valeur (3 1 4 5 9 2 6!(0 1;0 1;,0;0 1 2;0 1;,0;,0)
),/.:
extraire des valeurs et aplatir la liste (0 1 0 1 0 0 1 2 0 1 0 0
)x[,/.:i]:
extraire les indices de i, aplatir et attribuer chaque valeur de la liste de droite à ces indicesennuyeux, la liste est mise à jour mais une valeur nulle est retournée par l'affectation, donc je dois retourner la liste après le point-virgule (
;x
)modification: suppression des deux-points superflus
edit2: suppression de l'affectation inutile
la source
Retina 0.8.2 , 30 octets
Essayez-le en ligne! Le lien inclut des cas de test. 1 indexé. Explication: La première partie de l'expression régulière correspond à tour de rôle à chaque entier de la liste. Le groupe de lookbehind correspond à chaque occurrence de cet entier sur cette ligne jusqu'à et y compris l'entier actuel. L'entier est ensuite remplacé par le nombre de correspondances.
la source
Lot, 61 octets
1 indexé. Étant donné que la substitution de variables se produit avant l'analyse, la
set/a
commande finit par incrémenter le nom de variable donné en concaténant la lettrec
avec l'entier de la liste (variables numériques par défaut à zéro dans Batch). Le résultat est ensuite copié dans un autre entier pour faciliter la sortie (plus précisément, il enregistre un octet).la source
Tcl , 48 octets
Essayez-le en ligne!
la source
Japt, 8 octets
Essayez-le ici
la source