La tâche
Écrivez un programme ou une fonction dont l'entrée est une liste / tableau X d'entiers, et dont la sortie est une liste d'ensembles d'entiers Y , de telle sorte que pour chaque élément e dans chaque ensemble Y [ i ], X [ e ] = i , et de telle sorte que le nombre total d'éléments dans les ensembles en Y est égal au nombre d'éléments dans X .
(Il s'agit essentiellement de la même opération que l'inversion d'une table de hachage / dictionnaire, sauf si elle est appliquée aux tableaux à la place.)
Exemples
Ces exemples supposent une indexation basée sur 1, mais vous pouvez utiliser une indexation basée sur 0 à la place si vous préférez.
X Y
[4] [{},{},{},{1}]
[1,2,3] [{1},{2},{3}]
[2,2,2] [{},{1,2,3}]
[5,5,6,6] [{},{},{},{},{1,2},{3,4}]
[6,6,5,5] [{},{},{},{},{3,4},{1,2}]
Clarifications
- Vous pouvez représenter un ensemble sous forme de liste, si vous le souhaitez. Si vous le faites, l'ordre de ses éléments n'a pas d'importance, mais vous ne pouvez pas répéter les éléments.
- Vous pouvez utiliser n'importe quel format d'E / S non ambigu raisonnable; par exemple, vous pouvez séparer les éléments d'un ensemble par des espaces et les ensembles eux-mêmes par des sauts de ligne.
- Y doit être finement long et au moins suffisamment long pour avoir tous les éléments de X comme index de tableau. Il peut cependant être plus long que l'élément maximal de X (les éléments supplémentaires seraient des ensembles vides).
- Les éléments de X seront tous des indices de tableau valides, c'est-à-dire des entiers non négatifs si vous utilisez une indexation basée sur 0, ou des entiers positifs si vous utilisez une indexation basée sur 1.
Condition de victoire
En tant que défi de code-golf , plus c'est court, mieux c'est.
[5,5,6,6]
et[6,6,5,5]
peuvent être identiques?[5,5,6,6]
et[6,6,5,5]
ne peut pas avoir une sortie identique, mais la sortie pour[5,5,6,6]
aurait aussi pu, par exemple,[{},{},{},{},{2,1},{4,3}]
.[{0},{0},{0},{0},{1,2},{3,4}]
une sortie valide pour[5,5,6,6]
?Réponses:
MATL , 8 octets
L'entrée est un vecteur colonne, avec
;
comme séparateur (par exemple[2;2;2]
). La sortie est la représentation sous forme de chaîne d'un tableau de cellules de vecteurs de ligne (par exemple{[]; [1 2 3]}
). Un vecteur ligne d'un seul élément est identique à un nombre (il{1; 2; 3}
serait donc affiché à la place de{[1]; [2]; [3]}
).Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
La plupart du travail est effectué par la fonction d'ordre supérieur de Matlab
accumarray
, qui regroupe les éléments dans la deuxième entrée en fonction des valeurs correspondantes dans la première, et applique une fonction spécifiée à chaque groupe. Dans ce cas@(x){sort(x).'}
, la fonction est la sortie des éléments triés dans chaque groupe et le regroupement des résultats de tous les groupes dans un tableau de cellules.la source
Python, 69 octets
Utilise l'indexation basée sur 0.
la source
Gelée ,
75 octetsEssayez-le en ligne!
Comment ça marche
la source
Gelée , 8 octets
Essayez-le en ligne!
Comment ça marche
la source
Mathematica, 36 octets
Explication
Pour chaque
n
in{1, 2, ..., Max@#}
, oùMax@#
est le plus grand entier de la liste d'entrée, calcule lePosition
s oùn
apparaît dans la liste d'entrée#
. PuisquePosition[{6,6,5,5},5]
(par exemple) retourne{{3},{4}}
, on passe alorsApply
Join
à tous les éléments au niveau{1}
du résultat.la source
Haskell , 45 octets
s
prend une liste d'entiers et retourne une liste de listes. 1-indexé pour garder les entrées du scénario de test non modifiées (bien que la sortie obtienne des listes vides supplémentaires).Essayez-le en ligne!
Ce sont des compréhensions de listes imbriquées assez simples. Le seul léger ajustement profite de l'option pour faire une liste plus longue en utilisant
sum
au lieu demaximum
.la source
PHP, 55 octets
0 indexé.
la source
R,
684947 octetsÉtonnamment, beaucoup plus simple que les solutions plus longues. Prend un vecteur
x
de STDIN, crée un vecteur de1
àmax(x)
, génère implicitement une liste de longueurmax(x)
et vérifie quels indicesx
correspondent à ceux de la nouvelle liste. Imprime implicitement la sortie.Ancienne version:
Approche légèrement différente de l'autre réponse R. Prend un vecteur pour STDIN, crée une liste avec une longueur égale à la valeur maximale dans l'entrée. Boucle sur l'entrée et ajoute l'index au bon endroit.
Utilise l'indexation basée sur 1.
la source
Python 2 ,
918685 octetsJe programme sur mon téléphone mais j'ai vraiment aimé ce défi. Je peux certainement jouer au golf plus loin.
Essayez-le en ligne!
la source
Gelée , 9 octets
Ensembles vides indexés 1 représentés comme
0
, ensembles d'un élément représentés comme desN
ensembles d'éléments multiples représentés comme[M,N,...]
Essayez-le en ligne!
Comment?
la source
JavaScript (ES6),
6462 octetsEnregistré 2 octets grâce à @SteveBennett
Prend une entrée indexée 0. Renvoie une liste d'ensembles séparés par des virgules.
Cas de test
Afficher l'extrait de code
Version alternative, 53 octets
Si une sortie simplifiée telle que
'||||3,2|1,0'
acceptable, nous pouvons simplement faire:la source
`{${o.join`},{`}}`
est légal ES2015."{" + o.join("},{") + "}"
, si cela le rend plus clair.join`
est équivalent àjoin('
. Je ne savais pas que tu pouvais faire ça.array.join` `
. Super déroutant ici parce que vous l'incorporez dans une chaîne de modèle, et encore plus confus, la chaîne de jonction est},{
, qui ressemblait par hasard à une partie de la chaîne de modèle ... et est juste bizarre et laide de toute façon. :)Bash , 109 octets
Dommage qu'il n'y ait pas de valeur maximale intégrée pour le tableau.
Essayez-le en ligne!
la source
Mathematica 62 octets
Je le ferai pour toi
Essayez-le en ligne (collez simplement le code avec ctrl-v et appuyez sur Maj + Entrée)
n'oubliez pas de coller la liste d'entrée à la fin comme dans l'exemple ci-dessus
la source
AppendTo
. Aussi,{j,1,Length[#1]}
pourrait-être{j,Length@#}
, ou encore plus court,{j,Tr[1^#]}
.Tr[1^#]
est une astuce assez courante pour enregistrer un octet par-dessus l'utilisationLength
.Perl 6 ,
36 3229 octetsEssayez-le
Essayez-le
Essayez-le
Étendu:
Renvoie des index à base zéro, pour obtenir 1, utiliser l'opérateur croisé (
X
) combiné avec+
op . (33 octets)Pour qu'il retourne les Set s, ajoutez-
set
y simplement (total de 37 octets)la source
R,
8072 octets1 indexé,
X
extrait de stdin. Renvoie une liste de vecteurs des indices, avecNULL
comme ensemble vide.Essayez-le en ligne!
ancienne version:
Essayez-le en ligne!
la source
Y=list();
marche aussi bienfew
J'ai réussi05AB1E , 10 octets
Essayez-le en ligne!
la source
Röda , 51 octets
C'est un portage de la réponse Python d'Uriel .
Une autre version (88 octets):
Essayez-le en ligne!
Les deux sont indexés sur 1.
la source
PowerShell, 81 octets
Essayez-le en ligne!
1 indexé.
la source
Marque GNU ,
214213208204 octetsE / S: tableau d'entrée via des arguments, sortie vers stdout, un par ligne, séparés par des espaces.
Explication
L'ordre des indices dans les ensembles est inversé car il
P
s'appelle récursivement avant la mise à jourA$2
(appel exécuté dans l'évaluation du côté droit).la source
make
-il un moyen de faire de l'arithmétique elle-même? Faire appel à des programmes externes pour le faire ressemble un peu à de la triche, car vous pourriez probablement mettre beaucoup plus d'algorithme dans ces programmes et vous retrouver avec un programme plus court.bc
etgrep
. Je pourrais aussi utilisertest
et$?
.dc
a une syntaxe terser, mais franchement, tous ces sentiments sont les mêmes.Lisp commun, 91 octets
Indexation basée sur 1, renvoie les ensembles sous forme de listes.
Essayez-le en ligne!
la source
k , 13 octets
Ceci est indexé 0.
Essayez-le en ligne!
la source