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,
2es 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]