Considere el proceso de "escoger" una lista anidada. La selección se define de la siguiente manera:
- Si el argumento es una lista, tome un elemento de la lista al azar (de manera uniforme) y selecciónelo.
- Si el argumento no es una lista, simplemente devuélvalo.
Un ejemplo de implementación en Python:
import random
def pick(obj):
if isinstance(obj, list):
return pick(random.choice(obj))
else:
return obj
Para simplificar, asumimos que las listas anidadas solo contienen enteros o listas anidadas adicionales.
Dada cualquier lista, es posible crear una versión aplanada que no se puede distinguir pick
, es decir, elegir de ella produce los mismos resultados, con la misma probabilidad.
Por ejemplo, "aplanar" la lista
[1, 2, [3, 4, 5]]
produce la lista
[1, 1, 1, 2, 2, 2, 3, 4, 5]
. La razón por la que el aplanamiento simplemente no es válido es porque los elementos de las sublistas tienen una probabilidad menor de ser elegidos, por ejemplo, en la lista [1, [2, 3]]
el 1 tiene una probabilidad de 2/4 = 1/2 de ser elegido, mientras que 3 y 4 tienen un 1/4 oportunidad cada uno.
También tenga en cuenta que elegir de una lista singleton es equivalente a elegir de su elemento, y que elegir de una lista vacía no tiene sentido.
El reto
Dada una lista anidada de enteros no negativos, devuelve una lista aplanada de enteros no negativos a partir de la cual la selección produce los mismos resultados con la misma probabilidad.
Este es el código de golf , por lo que gana la respuesta válida más corta (medida en bytes).
Especificaciones
- Las entradas
[2, 3, 4]
,[2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4]
y[2, [3, 3], [[4]]]
son equivalentes (es decir, deberían dar resultados equivalentes). - Las salidas
[2, 2, 2, 2, 3, 3, 3, 3]
y[2, 3]
son equivalentes (es decir, cualquiera de las dos podría salir). - Puede suponer que solo los números en el rango inclusivo 1-100 estarán presentes en las listas.
- Puede suponer que la entrada de nivel superior será una lista,
2
es decir, no es una entrada válida. - Se puede utilizar cualquier representación razonable de listas anidadas, por ejemplo:
[1, [2, 3]]
,1 {2 3}
,"[ 1 [ 2 3 ] ]"
, etc. - En lugar de una lista, puede generar un conjunto múltiple o una asignación, o, dado que solo se permiten números en el rango 1-100, una lista de enteros de longitud 100 que representan cantidades.
Casos de prueba
Tenga en cuenta que las salidas enumeradas son solo una posibilidad válida; ver especificaciones para lo que constituye una entrada o salida válida.
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]