Considera il processo di "raccolta" di un elenco nidificato. La raccolta è definita come segue:
- Se l'argomento è un elenco, prendi un elemento dall'elenco in modo casuale (uniformemente) e scegli da quello.
- Se l'argomento non è un elenco, è sufficiente restituirlo.
Un'implementazione di esempio in Python:
import random
def pick(obj):
if isinstance(obj, list):
return pick(random.choice(obj))
else:
return obj
Per semplicità, supponiamo che gli elenchi nidificati contengano solo numeri interi o ulteriori elenchi nidificati.
Dato qualsiasi elenco, è possibile creare una versione appiattita che è indistinguibile da pick
, vale a dire prelevandola da essa produce gli stessi risultati, con la stessa probabilità.
Ad esempio, "spianare" l'elenco
[1, 2, [3, 4, 5]]
restituisce l'elenco
[1, 1, 1, 2, 2, 2, 3, 4, 5]
. Il motivo per cui semplicemente l'appiattimento non è valido è perché gli elementi delle sotto-liste hanno una probabilità inferiore di essere scelti, ad es. Nella lista [1, [2, 3]]
1 ha una probabilità di 2/4 = 1/2 di essere scelta mentre 3 e 4 hanno entrambi un 1/4 possibilità ciascuno.
Si noti inoltre che la selezione da un elenco singleton equivale alla selezione dal suo elemento e che il prelievo da un elenco vuoto non ha alcun significato.
La sfida
Dato un elenco nidificato di numeri interi non negativi, restituisce un elenco appiattito di numeri interi non negativi da cui il prelievo produce gli stessi risultati con la stessa probabilità.
Questo è code-golf , quindi vince la risposta valida più breve (misurata in byte).
specificazioni
- Gli input
[2, 3, 4]
,[2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4]
e[2, [3, 3], [[4]]]
sono equivalenti (cioè dovrebbero dare risultati equivalenti). - Le uscite
[2, 2, 2, 2, 3, 3, 3, 3]
e[2, 3]
sono equivalenti (cioè uno dei due potrebbe essere prodotto). - Puoi presumere che negli elenchi siano presenti solo numeri compresi nell'intervallo compreso tra 1 e 100.
- Si può presumere che l'input di livello superiore sarà un elenco, ovvero che
2
non sia un input valido. - È possibile utilizzare qualsiasi ragionevole rappresentazione di liste nidificate, ad esempio:
[1, [2, 3]]
,1 {2 3}
,"[ 1 [ 2 3 ] ]"
, etc. - Invece di un elenco, è possibile generare un multiset o un mapping oppure, poiché sono consentiti solo numeri nell'intervallo 1-100, un elenco di numeri interi di lunghezza 100 che rappresentano le quantità.
Casi test
Si noti che le uscite elencate sono solo una possibilità valida; vedere le specifiche per ciò che costituisce un input o output valido.
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]