Entrada
Uma matriz que pode conter matrizes ou números inteiros positivos, consecutivos e ascendentes. As matrizes podem ter qualquer número de matrizes dentro delas, e assim por diante. Nenhuma matriz estará vazia.
Saída
Essa matriz simplificada
Como simplificar uma matriz
Usaremos a matriz [1, [2, 3], [[4]], [[[5, 6], 7, [[[8]]]], 9]]
como nosso exemplo.
Primeiro, verificamos a profundidade dos valores aninhados. Aqui estão as profundidades e os números nessas profundidades:
0 1
1 2 3 9
2 4 7
3 5 6
5 8
Construímos a matriz de saída pegando os números na matriz original, agrupando-os pela profundidade em que estão aninhados e, em seguida, aninhando os grupos nas profundidades das profundidades originais de seus elementos. Organize os números em ordem crescente e profundidade crescente.
Então, nossa produção é [1, [2, 3, 9], [[4, 7]], [[[5, 6]]], [[[[[8]]]]]]
Exemplos
[1, [2, 3], [[4]], [[[5, 6], 7, [[[8]]]], 9]] -> [1, [2, 3, 9], [[4, 7]], [[[5, 6]]], [[[[[8]]]]]]
[[[1]], [2, [3]], 4, [5, [6, [7, [8], [9, [[10]]]]]]] -> [4, [2, 5], [[1, 3, 6]], [[[7]]], [[[[8, 9]]]], [[[[[[10]]]]]]]
[1] -> [1]
[1, [2], [[3]], [[[4]]], [[[[5]]]]] -> [1, [2], [[3]], [[[4]]], [[[[5]]]]]
[1, [[[[2], 3]]] [[4]]] -> [1, [[4]], [[[3]]], [[[[2]]]]]
fonte
8
na linhaSo, our output is.....
. No entanto, você o corrigiu no snippet de exemplos.[1, [2, 3, 9], [[4, 7]], [[[5, 6]]], [[[[]]]], [[[[[8]]]]]]
?Respostas:
Gelatina , 8 bytes
A saída é um nível por linha, com linhas vazias para níveis sem elementos. Experimente online!
Como funciona
fonte
JavaScript (ES6),
139109 bytesExplicação usando a entrada de exemplo:
v
é um método auxiliar que retorna as matrizes (com parâmetro1
) ou valores (sem parâmetro). Começamos coma = [1, [2, 3], [[4]], [[[5, 6], 7, [[[8]]]], 9]]
, que não é vazio. Nós filtramos as matrizes, dando[1]
. Em seguida, recorremos a nós mesmos às matrizes concatenadas juntas, ou seja[2, 3, [4], [[5, 6], 7, [[[8]]]], 9]
, o resultado[2, 3, 9, [4, 7], [[5, 6]], [[[[8]]]]]
. Mais uma vez filtramos as matrizes, o que nos dá o segundo termo de nossa saída[2, 3, 9]
, no entanto, temos que ter cuidado para não inserir uma matriz vazia aqui. Ainda resta envolver as matrizes[4, 7], [[5, 6]], [[[[8]]]]
dentro das matrizes e anexá-las à saída, resultando em[1, [2, 3, 9], [[4, 7]], [[[5, 6]]], [[[[[8]]]]]]
.fonte
filter
. Talvez comece comF=(x,y)=>x.filter(y)
[].concat(...v(1))
com segurançav(1)
para salvar 14 bytes. Provavelmente também existem algumas outras coisas, mas estou tendo dificuldade em acompanhar os parênteses aninhados na minha cabeça.[].concat(...v(1))
é uma fera muito diferentev(1)
, caso contrário eu não faria isso! Para um exemplo simples, considerea = [2, [3], [[4]]]
entãov(1) = [[3], [[4]]]
mas[].concat(...v(1)) = [3, [4]]
.05AB1E ,
27262521 bytesExperimente online! (ligeiramente modificado porque
.g
ainda não está no TIO)Explicação
A estratégia principal é fazer um loop sobre cada nível possível da matriz aninhada e imprimir qualquer dígito em uma linha, mantendo os não dígitos (listas) em uma lista um nível menos aninhado.
fonte
Perl, 52 bytes
Apenas uma sub-rotina recursiva. (incomum para uma resposta Perl, eu sei ..)
Chame assim:
Cada linha da saída corresponde a um nível de profundidade da matriz (daí a linha vazia no exemplo acima).
Ele pode ser transformado em um programa completo por apenas mais alguns bytes: adicione
-n
flag e umeval
(dentro@{ }
para transformar a entrada em uma matriz e não uma matrizref) para transformar a entrada em uma matriz Perl:Minha abordagem anterior era um pouco mais longa (65 bytes), mas ainda interessante, então deixarei aqui:
fonte
JavaScript (ES6) 121
144 152Editar Muito revisado, 1 byte salvou thx Patrick Roberts e 21 mais apenas revisando o código
Função recursiva trabalhando em matrizes de entrada e saída. Não fazer, como o pedido de ter elementos em profundidade 1 como elementos individuais na matriz de saída (enquanto que os níveis maiores são agrupadas como um elemento):
[l1,l1, [l2...], [[l3...]] ]
. Enquanto isso seria mais direto:[ [l1...], [[l2...]], [[[l3...]]] ]
Nova linha adicionada para facilitar a leitura.
Algumas notas: a linha 2 é avaliada repetidamente a cada chamada recursiva, mas apenas a última iteração no final da recursão é útil.
O manuseio especial quando
d==0
na linha 2 cuida da anomalia para elementos de nível 1.A
n
função recursiva lida com a matriz aninhada na saídaTeste
fonte
v[0]
vez dev.map
. Economiza 1 byte.JavaScript (ES6) 168 bytes
Demo
fonte
PHP, 145 bytes
Demolir
fonte
Pitão,
1916 bytesExperimente online. Suíte de teste.
Observe o espaço à esquerda. Produz níveis em linhas como a resposta Perl.
Explicação
Q
.f
itensT
de filtro deQ
:s
um está comI
dentição ligadaT
.p
rintT
mais um espaço+
…d
.s
hum os itens. Isso remove uma camada de matrizes de cada item. Se não sobrar nenhum, rende0
.=
o resultado aQ
.W
Enquanto o resultado não estiver vazio, imprima a string vaziak
e uma nova linha.fonte
Haskell,
124123 bytesComo Haskell não suporta listas mistas (números inteiros e lista de números inteiros) por padrão, eu defino um tipo de lista personalizado
L
. Exemplo de uso:Nota: leva algum tempo para executar, porque percorre todas as Ints positivas (32 ou 64 bits) para procurar um nível de ninho tão profundo. Além disso: o tipo de lista personalizada não pode ser impresso por padrão; portanto, se você quiser ver o resultado como no exemplo acima, precisará adicionar
deriving Show
àdata
declaração (->data L=I Int|R[L] deriving Show
). Como não é necessário retornar uma lista L de uma função, não conto os bytes.Como funciona:
Editar O @BlackCap salvou um byte alternando
>>=
para ado
notação. Obrigado!fonte
h l=R$do d<-[1..];[i|(e,i)<-0#l,d==e]!d
JavaScript (ES6),
127137134 bytesPega uma matriz como entrada e retorna uma string.
Casos de teste
Mostrar snippet de código
fonte