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]
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}}
,Tuples
generará 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
Flatten
esto, 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 como17
enTuples[17]
, lo que realmente no se supone que sea una cosa. Pero estos se simplifican al resultado correcto más adelante (Tuples
es 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)==int
puede seri*0<[]
.0<[]
... ytype(i)==list
puede 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