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]