Dada uma matriz não vazia, possivelmente aninhada, de números inteiros positivos de um dígito (não garantido exclusivo), imprima a representação de arte ASCII como uma árvore, usando os caracteres de desenho de caixa ┌ ┴ ┐ ─ │ ┬ ┼
. (Eles foram copiados da Página 437 do Código, mas você pode usar qualquer representação equivalente).
Todo número inteiro da matriz deve ser uma folha da árvore. Elementos com o mesmo nível na matriz devem estar presentes no mesmo nível da árvore. Todos os elementos devem ser separados por espaços em branco suficientes para serem distintos (depende de você determinar a largura, o mínimo de um espaço entre eles).
Por exemplo, dada matriz [[1, [2]], [3, [4, 5]]]
, produz a seguinte árvore
┌─┴─┐
┌┴┐ ┌┴─┐
1 │ 3 ┌┴┐
2 4 5
Para matriz, [1, 2, 3]
a árvore pode parecer
┌─┼─┐
1 2 3
Mas a matriz [[1, 2, 3]]
pareceria
│
┌─┼─┐
1 2 3
Embora a matriz [1, [1, [1, [1]]]]
possa parecer
┌─┴┐
1 ┌┴─┐
1 ┌┴┐
1 │
1
Como um exemplo mais complicado, [1, [[[2, 3], 4], 5]]
poderia ser
┌┴───┐
1 ┌─┴┐
┌─┴┐ 5
┌┴┐ 4
2 3
ou várias outras variações.
- A entrada e a saída podem ser fornecidas por qualquer método conveniente .
- Você pode imprimi-lo em STDOUT ou retorná-lo como resultado de uma função.
- Um programa completo ou uma função são aceitáveis.
- Qualquer quantidade de espaço em branco estranho é aceitável, desde que os caracteres sejam alinhados adequadamente.
- As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
fonte
[1,[[[2,3],4],5]]
pode ser um caso de teste interessante, pois precisa ter a raiz estendida artificialmente para que a subárvore direita não colide com a subárvore esquerda.1
de um conjunto de 3 elementos:[2,3]
,4
, e5
. Mas 4 e 5 não são adjacentes.[1, [[[2, 3]], [4], 5]]
me parece .Respostas:
Python 3 ,
400393390 bytesRetorna uma lista de cadeias de cima para baixo.
EDIT 1: Aparado 7 bytes, evitando a duplicação de
┴┼
(economia líquida de 2 bytes), cortando 0 de uma sequência, alterando a maneira como os caracteres de desenho são selecionados┬┌┐
(use em<
vez de==
) e substituindo um queL(z)
eu perdi pore
EDIT 2: -2 bytes graças a ovs e -1 byte graças a Kevin Cruijssen
Experimente online!
Ungolfed
Constrói uma árvore a partir das folhas, uma camada de cada vez.
fonte
S,*K=' ┴┼│123456789'
.e==1
pode sere<2
para salvar um byte (eu não acho que isso nunca pode ser 0, uma vez que o desafio afirma a entrada é não vazio - e entradas vazias já teria falhado nomax(map(L,z))
., nesse caso, de qualquer maneira)Limpo ,
544506 bytesEscapes são usados para evitar UTF-8 inválido no SE / TIO, mas contados como um byte, pois são literais válidos
Experimente online!
Recebe entrada no formato
L[I 3, L[I 4, I 5], I 2]..
Conecta as árvores de baixo para cima, da esquerda para a direita, e ajusta as distâncias da direita para a esquerda.
Pretificado, mais ou menos:
fonte
Carvão ,
127123 bytesExperimente online! Link é a versão detalhada do código. Explicação:
Altere a direção do desenho padrão para cima, pois não desenhamos nada à direita.
O primeiro passo é converter a representação de matriz aninhada em uma representação de índice, que é uma lista de todas as entradas juntamente com os índices das sub-matrizes, por exemplo, para a entrada
q=[1, [[[2, 3]], [4], 5]]
the5
isq[1][2]
e, portanto, a lista que queremos1, 2
. Começamos com uma única entrada para processar, que é uma lista que contém uma lista dos índices atuais (ou seja, nenhum até agora) e a entrada original.Passe pelas matrizes enquanto as processamos. (Convenientemente, o Charcoal continuará a iterar sobre uma lista se você pressionar durante a iteração.)
Obter a próxima matriz para processar.
Isso é realmente um escalar e não uma matriz?
Nesse caso, a lista que tínhamos realmente pertence à lista final de listas de índices.
Caso contrário, faça um loop sobre cada elemento nesta matriz ...
... e salve-a com sua nova lista de índices até o momento para processamento adicional. O índice máximo da matriz também é salvo, o qual é usado para casos especiais do último elemento da matriz.
Agora estamos prontos para percorrer a lista de listas de índices. No entanto, a lista não está em ordem lexicográfica, portanto, não podemos iterá-la diretamente.
Encontre o próximo elemento em ordem lexicográfica.
Remova-o da lista.
Pule para a posição do escalar na saída. Podemos calcular isso, pois podemos manter a contagem do número de escalares que produzimos e também sabemos o número de entradas em sua lista de índices.
Na verdade, imprima o escalar.
Passe pelas entradas na lista de índices. Novamente, essa não é uma iteração simples, porque as entradas vêm em pares e também precisamos ser capazes de sair do loop.
Extraia o próximo índice da lista.
Se este não for o primeiro elemento da lista ...
... imprima
┐
ou┬
dependendo se esse é o último elemento da lista ...... e imprima
─
s suficientes para preencher a entrada anterior neste nível ...... e limpe a variável para sair do loop, pois terminamos aqui.
Caso contrário, se este for (o primeiro elemento de) uma lista de vários elementos, imprima o
┌┴
, deixando o cursor acima do┴
para lidar com o pai desse nível.Caso contrário, se esta for uma lista de 1 elemento, basta imprimir a
│
e mover uma linha para cima para lidar com o pai desse nível.fonte