Dada una lista no entera de enteros, genera una lista de listas que contienen los enteros en cada nivel de anidación, comenzando con el nivel menos anidado, con los valores en su orden original en la lista de entrada cuando se leen de izquierda a derecha. Si dos o más listas están en el mismo nivel de anidación en la lista de entrada, deben combinarse en una sola lista en la salida. La salida no debe contener listas vacías; los niveles de anidamiento que contienen solo listas deben omitirse por completo.
Puede suponer que todos los enteros están en el rango (inclusive) [-100, 100]
. No hay una longitud máxima o profundidad de anidamiento para las listas. No habrá listas vacías en la entrada; cada nivel de anidamiento contendrá al menos un número entero o lista.
La entrada y la salida deben estar en la lista / matriz / enumerable / iterable / etc de su idioma nativo. formato, o en cualquier formato razonable e inequívoco si su idioma carece de un tipo de secuencia.
Ejemplos
[1, 2, [3, [4, 5], 6, [7, [8], 9]]] => [[1, 2], [3, 6], [4, 5, 7, 9], [8]]
[3, 1, [12, [14, [18], 2], 1], [[4]], 5] => [[3, 1, 5], [12, 1], [14, 2, 4], [18]]
[2, 1, [[5]], 6] => [[2, 1, 6], [5]]
[[54, [43, 76, [[[-19]]]], 20], 12] => [[12], [54, 20], [43, 76], [-19]]
[[[50]], [[50]]] => [[50, 50]]
Cases[#,_?AtomQ,{i}]~Table~{i,Depth@#}~DeleteCases~{}&
Cases[#,_?AtomQ,{i}]~Table~{i,Depth@#}/.{}->Nothing&
, 2 bytes más cortosPython 2, 78 bytes
fuente
Retina , 79
Yo sé los expertos Retina campo de esto más, pero aquí es un comienzo:
Pruébalo en línea.
fuente
Mathematica
55 6462 bytesfuente
JavaScript,
11280 bytesGracias Neil por ayudar a reducir 32 bytes.
fuente
!=null
comonull
es falso de todos modos. Elb=
también es innecesario. Después de eliminar eso, puede mover el.filter(a=>x)
al&&b
que luego reduce la función externa a una llamada a la función interna que luego puede en línea. Me quedo con esto:f=(a,b=[],c=0)=>a.map(d=>d[0]?f(d,b,c+1):b[c]=[...b[c]||[],d])&&b.filter(d=>d)
.d[0]?
evaluaríafalse
si era igual a0
, que está dentro del rango[-100,100]
. Y también lo haríad=>d
d===+d
embargo, elegí, ya que ahorra 2 bytes en la verificación nula.[...,[[...]]]
) correctamented=>d
está bien, yad
que siempre es un conjunto o nulo en ese punto, pero es un punto justo con respectod[0]
, aunque siempred.map
habrá algo verdadero para un conjunto pero falso para un número.Jalea, 24 bytes
Pruébalo en línea!
Si se permitieran listas separadas por una nueva línea, esto podría reducirse a 14 bytes .
Pruébalo en línea!
fuente
Python,
10899 bytesEsto me parece un poco largo, pero no podría acortar una línea, y si intento usar en
or
lugar deif
, obtengo listas vacías en los resultados.Pruébalo en línea
Editar: guardado 9 bytes gracias a Stack Overflow
fuente
filter(None,o)
para eliminar listas vacías que se encuentran en el nivel de anidación más externo deo
.Python 3, 109 bytes
Como siempre, estúpidos Python 2 características como la comparación de
int
s ylist
s media que Python 3 viene detrás. Oh bien...fuente
Perl, 63 bytes
Se espera entrada en
@i
, salida producida en@o
. (Espero que esto sea aceptable).Ejemplo:
Salida:
fuente
Clojure, 119 bytes
(116 con seq? Y entrada como listas, una modificación trivial)
Mejor pensado:
Cuando se llama con dos argumentos (el nivel actual y una colección), crea un mapa desordenado de un elemento como
{level: value}
, o llamaf
recursivamente si se ve un no número (presumiblemente una colección).Estos minimapas se fusionan en una sola
sorted-map
y las colisiones clave se manejan porconcat
función.vals
Devuelve los valores del mapa desde el primer nivel hasta el último.Si un número es el único en su nivel, sigue siendo un
vec
, otros se convierten en listas porconcat
.Si la entrada fuera un en
list
lugar devec
entoncesnumber?
podría ser reemplazada porseq?
, curiosamente el vector noseq?
lo es, pero lo essequential?
. Pero soy demasiado vago para implementar esa versión, rehacer ejemplos, etc.fuente
Raqueta 259 bytes
Sin golf:
Pruebas:
Salida:
fuente
MATL , 37 bytes
Pruébalo en línea!
Funciona con la versión actual (13.0.0) del lenguaje / compilador.
Esto produce la salida como líneas de valores separados por espacios, donde cada línea corresponde al mismo nivel de anidación, y los diferentes niveles de anidación están separados por nuevas líneas.
fuente