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]
fuente

Respuestas:
Wolfram Language (Mathematica) ,
4120 bytesPruébalo en línea! Ignora las muchas advertencias, todo al final funciona.
Cómo funciona
Para una lista de profundidad 2 como
{{1,2},{3},{4,5,6}},Tuplesgenerará la lista{{1,3,4},{1,3,5},{1,3,6},{2,3,4},{2,3,5},{2,3,6}}correspondiente a todas las formas de elegir un elemento{1,2}y elegir un elemento{3}y elegir un elemento{4,5,6}.Si hacemos
Flattenesto, obtenemos todos los elementos con las frecuencias correctas, porque elegir un elemento de uno de ellos{1,2},{3}o{4,5,6}es equivalente a elegir un elemento de todos ellos, y luego elegir cuál mantener.Usamos
//@para aplicar esto en todos los niveles de la entrada. En el proceso, Mathematica se queja mucho, porque está convirtiendo átomos como17enTuples[17], lo que realmente no se supone que sea una cosa. Pero estos se simplifican al resultado correcto más adelante (Tupleses un placer tratarloTuples[17]como una lista de longitud 1, incluso si tiene una cabeza distintaList), por lo que la queja es irrelevante.fuente
Python 2 ,
10510299 bytesPruébalo en línea!
fuente
Jalea ,
98 bytesPruébalo en línea!
Cómo funciona
fuente
Jalea , 10 bytes
Pruébalo en línea!
fuente
Python 2 , 128 bytes
Pruébalo en línea!
Puerto de mi respuesta de gelatina.
-12 gracias a Jonathan Frech .
fuente
type(i)==intpuede seri*0<[].0<[]... ytype(i)==listpuede seri*0>0;)C (gcc) ,
234223 bytesPruébalo en línea!
Explicación:
fuente
Python 2 ,
144139 bytesPruébalo en línea!
fuente
JavaScript (ES6),
132131 bytesMostrar fragmento de código
fuente