Considérez le processus de "sélection" d'une liste imbriquée. Le prélèvement est défini comme suit:
- Si l'argument est une liste, prenez un élément de la liste au hasard (uniformément) et choisissez-le.
- Si l'argument n'est pas une liste, renvoyez-le simplement.
Un exemple d'implémentation en Python:
import random
def pick(obj):
if isinstance(obj, list):
return pick(random.choice(obj))
else:
return obj
Pour simplifier, nous supposons que les listes imbriquées ne contiennent que des entiers ou d'autres listes imbriquées.
Étant donné n'importe quelle liste, il est possible de créer une version aplatie qui ne se distingue pas pick
, c'est-à-dire que sa cueillette donne les mêmes résultats, avec la même probabilité.
Par exemple, "aplatir" la liste
[1, 2, [3, 4, 5]]
donne la liste
[1, 1, 1, 2, 2, 2, 3, 4, 5]
. La simple raison pour laquelle l'aplatissement n'est pas valide est parce que les éléments des sous-listes ont une probabilité plus faible d'être choisis, par exemple, dans la liste, [1, [2, 3]]
le 1 a 2/4 = 1/2 chance d'être choisi tandis que 3 et 4 ont tous deux 1/4 chance chacun.
Notez également que la sélection dans une liste singleton est équivalente à la sélection dans son élément, et que la sélection dans une liste vide n'a aucune signification.
Le défi
Étant donné une liste imbriquée d'entiers non négatifs, renvoyez une liste aplatie d'entiers non négatifs à partir de laquelle la sélection donne les mêmes résultats avec la même probabilité.
Il s'agit de code-golf , donc la réponse valide la plus courte (mesurée en octets) l'emporte.
Caractéristiques
- Les entrées
[2, 3, 4]
,[2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4]
et[2, [3, 3], [[4]]]
sont équivalentes (ils devraient donner des résultats équivalents). - Les sorties
[2, 2, 2, 2, 3, 3, 3, 3]
et[2, 3]
sont équivalentes (c'est-à-dire que l'une ou l'autre pourrait être sortie). - Vous pouvez supposer que seuls les nombres compris entre 1 et 100 seront présents dans les listes.
- Vous pouvez supposer que l'entrée de niveau supérieur sera une liste, c'est
2
-à- dire qu'elle n'est pas une entrée valide. - Vous pouvez utiliser une représentation raisonnable des listes imbriquées, par exemple:
[1, [2, 3]]
,1 {2 3}
,"[ 1 [ 2 3 ] ]"
, etc. - Au lieu d'une liste, vous pouvez générer un multiset ou un mappage, ou, puisque seuls les nombres compris entre 1 et 100 sont autorisés, une liste de 100 entiers de longueur représentant des quantités.
Cas de test
Notez que les sorties répertoriées ne sont qu'une seule possibilité valide; voir les spécifications pour ce qui constitue une entrée ou une sortie valide.
format:
input -> output
[3] -> [3]
[1, [1, 1]] -> [1]
[1, [2, 3]] -> [1, 1, 2, 3]
[2, 3, [4, [5, 5, 6], 6, 7]] -> [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7]
[[1, 1, 2], [2, 3, 3]] -> [1, 2, 3]
[[1, 1, 2], [2, 3, 3, 3]] -> [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3]
la source
Réponses:
Wolfram Language (Mathematica) ,
4120 octetsEssayez-le en ligne! Ignorez les nombreux avertissements, tout fonctionne à la fin.
Comment ça fonctionne
Pour une liste de profondeur 2 telle que
{{1,2},{3},{4,5,6}}
,Tuples
va générer la liste{{1,3,4},{1,3,5},{1,3,6},{2,3,4},{2,3,5},{2,3,6}}
correspondant à toutes les façons de choisir un élément{1,2}
et de choisir un élément{3}
et de choisir un élément{4,5,6}
.Si nous le faisons
Flatten
, alors nous obtenons tous les éléments avec les fréquences correctes, parce que choisir un élément de l' un de{1,2}
,{3}
ou{4,5,6}
équivaut à choisir un élément de tous, puis choisir celui à garder.Nous utilisons
//@
pour appliquer cela à tous les niveaux de l'entrée. Dans le processus, Mathematica se plaint beaucoup, car il transforme des atomes comme17
enTuples[17]
, ce qui n'est vraiment pas censé être une chose. Mais ceux-ci simplifient le bon résultat plus tard (Tuples
est heureux de traiterTuples[17]
comme une liste de longueur 1, même si elle a une tête autre queList
), de sorte que la plainte n'est pas pertinente.la source
Python 2 ,
10510299 octetsEssayez-le en ligne!
la source
Gelée ,
98 octetsEssayez-le en ligne!
Comment ça fonctionne
la source
Gelée , 10 octets
Essayez-le en ligne!
la source
Python 2 , 128 octets
Essayez-le en ligne!
Port de ma réponse Jelly.
-12 merci à Jonathan Frech .
la source
type(i)==int
possiblei*0<[]
.0<[]
... ettype(i)==list
peut l'êtrei*0>0
;)C (gcc) ,
234223 octetsEssayez-le en ligne!
Explication:
la source
Python 2 ,
144139 octetsEssayez-le en ligne!
la source
JavaScript (ES6),
132131 octetsAfficher l'extrait de code
la source