Dada uma lista não plana de números inteiros, produza uma lista de listas contendo os números inteiros em cada nível de aninhamento, começando com o nível menos aninhado, com os valores em sua ordem original na lista de entrada quando lidos da esquerda para a direita. Se duas ou mais listas estiverem no mesmo nível de aninhamento na lista de entrada, elas deverão ser combinadas em uma única lista na saída. A saída não deve conter nenhuma lista vazia - os níveis de aninhamento que contêm apenas listas devem ser ignorados completamente.
Você pode assumir que os números inteiros estão todos no intervalo (inclusive) [-100, 100]
. Não há comprimento máximo ou profundidade de aninhamento para as listas. Não haverá listas vazias na entrada - cada nível de aninhamento conterá pelo menos um número inteiro ou lista.
A entrada e a saída devem estar na lista nativa / array / enumerable / iterable / etc do seu idioma. ou em qualquer formato razoável e inequívoco, se o seu idioma não possuir um tipo de sequência.
Exemplos
[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 mais curtoPython 2, 78 bytes
fonte
Retina , 79
Eu sei que os especialistas em Retina jogarão mais isso, mas aqui está um começo:
Experimente online.
fonte
Mathematica
55 6462 bytesfonte
JavaScript,
11280 bytesObrigado Neil por ajudar a eliminar 32 bytes.
fonte
!=null
quenull
é falso de qualquer maneira. Ob=
também é desnecessário. Depois de removido, você pode mover o.filter(a=>x)
para o&&b
que reduz a função externa para uma chamada para a função interna, que pode ser incorporada. Eu estou à esquerda com este: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]?
avaliariafalse
se era igual a0
, que está dentro da faixa[-100,100]
. E assim seriad=>d
d===+d
embora, uma vez que salva 2 bytes na verificação nula.[...,[[...]]]
) adequadamente #d=>d
está OK, poisd
sempre é um array ou nulo nesse ponto, mas é um ponto justod[0]
, embora sempre exista algod.map
que seja verdadeiro para um array, mas falso para um número.Gelatina, 24 bytes
Experimente online!
Se listas separadas por nova linha fossem permitidas, isso poderia ser reduzido para 14 bytes .
Experimente online!
fonte
Python,
10899 bytesIsso me parece um pouco demorado, mas eu não conseguia diminuir o prazo de uma linha e, se eu tentar usar em
or
vez deif
, recebo listas vazias nos resultados.Experimente online
Editar: salvou 9 bytes graças ao estouro de pilha
fonte
filter(None,o)
para remover listas vazias que estão no nível de aninhamento mais externo deo
.Python 3, 109 bytes
Como sempre, estúpido Python 2 características como comparar
int
s elist
s média que Python 3 sai por trás. Ah bem...fonte
Perl, 63 bytes
A entrada é esperada em
@i
, a saída produzida em@o
. (Espero que isso seja aceitável).Exemplo:
Saída:
fonte
Clojure, 119 bytes
(116 com seq? E entrada como listas, uma modificação trivial)
Melhor intenção:
Quando chamado com dois argumentos (o nível atual e uma coleção), ele cria um mapa não ordenado de um elemento
{level: value}
, ou chamaf
recursivamente se um número não (presumivelmente uma coleção) é visto.Esses mini-mapas são então mesclados em uma única
sorted-map
e as principais colisões são tratadas porconcat
função.vals
retorna os valores do mapa do primeiro nível ao último.Se um número é o único em seu nível, ele permanece sendo um
vec
, outros são convertidos em listas porconcat
.Se a entrada era um em
list
vez devec
entãonumber?
poderia ser substituída porseq?
, estranhamente o vetor não é,seq?
mas ésequential?
. Mas tenho preguiça de implementar essa versão, refazer exemplos etc.fonte
Raquete 259 bytes
Ungolfed:
Teste:
Saída:
fonte
MATL , 37 bytes
Experimente online!
Funciona com a versão atual (13.0.0) do idioma / compilador.
Isso produz a saída como linhas de valores separados por espaço, onde cada linha corresponde ao mesmo nível de aninhamento e diferentes níveis de aninhamento são separados por novas linhas.
fonte