Dada uma matriz de qualquer profundidade, desenhe seu conteúdo com bordas +-|
ao redor de cada subarray. Esses são os caracteres ASCII para mais, menos e tubo vertical.
Por exemplo, se a matriz for [1, 2, 3]
, desenhe
+-----+
|1 2 3|
+-----+
Para uma matriz aninhada, como [[1, 2, 3], [4, 5], [6, 7, 8]]
, desenhe
+-----------------+
|+-----+---+-----+|
||1 2 3|4 5|6 7 8||
|+-----+---+-----+|
+-----------------+
Para uma matriz irregular, como [[[1, 2, 3], [4, 5]], [6, 7, 8]]
, desenhe
+-------------------+
|+-----------+-----+|
||+-----+---+|6 7 8||
|||1 2 3|4 5|| ||
||+-----+---+| ||
|+-----------+-----+|
+-------------------+
Observe que há mais espaço após o desenho [6, 7, 8]
. Você pode desenhar o conteúdo na linha superior, central ou inferior, mas, conforme a sua escolha, deve permanecer consistente.
Esse desafio foi inspirado no verbo caixa<
de J.
Regras
- Isso é código-golfe, então o código mais curto vence.
- Builtins que resolvem isso não são permitidos.
- A matriz de entrada conterá apenas valores inteiros não negativos ou matrizes. Cada matriz será homogênea, o que significa que seus elementos serão apenas matrizes ou apenas números inteiros, mas nunca uma mistura de ambos.
- Cada sub-matriz pode ser aninhada em qualquer profundidade.
- A saída pode ser uma string ou uma matriz de strings, onde cada string é uma linha de saída.
Casos de teste
[]
++
||
++
[[], []]
+---+
|+++|
|||||
|+++|
+---+
[[], [1], [], [2], [], [3], []]
+-----------+
|++-++-++-++|
|||1||2||3|||
|++-++-++-++|
+-----------+
[[[[[0]]]]]
+---------+
|+-------+|
||+-----+||
|||+---+|||
||||+-+||||
|||||0|||||
||||+-+||||
|||+---+|||
||+-----+||
|+-------+|
+---------+
[[[[[4, 3, 2, 1]]]], [[[3, 2, 1]]], [[2, 1]], [1]]
+---------------------------------+
|+-------------+---------+-----+-+|
||+-----------+|+-------+|+---+|1||
|||+---------+|||+-----+|||2 1|| ||
||||+-------+|||||3 2 1|||+---+| ||
|||||4 3 2 1|||||+-----+|| | ||
||||+-------+|||+-------+| | ||
|||+---------+|| | | ||
||+-----------+| | | ||
|+-------------+---------+-----+-+|
+---------------------------------+
-1
desde que eu também limitei os números inteiros para não serem negativos. Depois, basta limpar a saída desses valores inválidos.Respostas:
Dyalog APL , 56 bytes
Agradecemos ao ngn por ajudar a remover cerca de um terço dos bytes.
TryAPL
Defina a função , execute cada caso de teste e compare com o
]Display
utilitário interno.[1, 2, 3]
[[1, 2, 3], [4, 5], [6, 7, 8]]
[[[1, 2, 3], [4, 5]], [6, 7, 8]]
[]
[[], []]
[[], [1], [], [2], [], [3], []]
[[[[[0]]]]]
[[[[[4, 3, 2, 1]]]], [[[3, 2, 1]]], [[2, 1]], [1]]
Explicação
No geral, essa é uma função anônima
{...}
no topo de um anexo⊂
. O último apenas adiciona outro nível de aninhamento, solicitando que o primeiro adicione um quadro externo.A função anônima com espaço em branco (
⋄
é o separador de instruções):Aqui está novamente, mas com funções utilitárias separadas:
Agora, deixe-me explicar cada função:
CloseBox
pega uma tabela e retorna a mesma tabela, mas com a primeira coluna da tabela anexada à direita da tabela. Assim, dada a tabela 1 por 3XYZ
, essa função retorna a tabela 1 por 4XYZX
, da seguinte forma:⊢
o argumento (lit. o que está à direita) é,
anexado à⊣/
coluna mais à esquerda (lit. a redução esquerda de cada linha)CreateVertical
pega uma tabela e retorna a string que consiste nos caracteres que caberiam|
s nas laterais da tabela, mas com dois+
s anexados para corresponder a duas linhas de-
. Eventualmente, a tabela será rotacionada ciclicamente uma linha para obter uma única+---...
linha acima e abaixo. Assim, dada qualquer tabela de três linhas, essa função retorna da++|||
seguinte forma:'++' ,
duas vantagens acrescentadas a'|' ⍴⍨
um estilo remodelado pela≢
contagem (linhas) do argumentoAddHorizontals
pega uma lista de listas, cria uma tabela, adiciona duas linhas de-
s na parte superior, adiciona os caracteres correspondentes da borda esquerda à esquerda e gira uma linha para a parte inferior, para que a tabela tenha uma borda na parte superior , esquerda e inferior. Da seguinte maneira:1 ⊖
gire uma linha (a linha superior vai para o fundo) daCreateVertical ,
sequência++|||...
anexada (como uma coluna) para'-' ⍪⍣2
menos adicionada duas vezes à parte superior do↑
argumento transformada da lista de listas em tabela{
A função anônima}
: se o argumento for uma lista simples (não aninhada), faça-o em uma tabela de caracteres (assim, dada a lista de 3 elementos1 2 3
, essa função retornará a tabela de 1 a 5 caracteres visualmente idêntica1 2 3
). Se o argumento não for uma lista simples, verifique se os elementos são tabelas de caracteres simples; coloque-os na mesma altura; enquadre cada um na parte superior, inferior e esquerda; combiná-los; e finalmente pegue a primeira coluna e adicione-a à direita. Da seguinte maneira:{
começar a definição de uma função anônima⍵ ≡ ∊⍵:
se o argumento é idêntico ao argumento achatada (ou seja, é uma lista simples), então:⍉
transpor a⍪
em formato de colunas⍉
transpostas⍕ ⍵
argumento Stringified; else:CloseBox
Adicione a coluna mais à esquerda, à direita de⊃ ,/
o divulgado (porque a redução encerra) concatenou-seAddHorizontals¨
add-
s na parte superior e inferior de cada uma das↓ ↑ ↓¨
alturas preenchidas à mesma altura *∇¨ ⍵
dessa função anônima aplicada a cada um dos argumentos e}
termina a definição da função anônima* transforme cada tabela em uma lista de listas, combine as listas de listas (preenchimento com cadeias vazias para preencher linhas curtas) em uma tabela e divida a tabela em uma lista de listas de listas
fonte
JavaScript (ES6),
223203 bytesPorto da solução Ruby da @ MitchSchwartz. Versão anterior que funcionava agrupando recursivamente as matrizes (e, portanto, trabalhava para conteúdo arbitrário, não apenas números inteiros):
Nota: Embora eu esteja usando o operador spread na minha lista de argumentos, para obter a saída desejada, forneça um único parâmetro da matriz original, em vez de tentar espalhar a matriz; isso tem o efeito de agrupar a saída na caixa externa desejada. Infelizmente, a caixa externa me custa 18 bytes e a separação de números inteiros me custa 8 bytes; caso contrário, a seguinte visualização alternativa seria suficiente para 197 bytes:
fonte
Cannot read property 'map' of undefined
para matrizes vazias, como[]
. Pois[1,2,[]]
, o último subarray não é exibido para mim.[1,2,[]]
porque seus exemplos mostram apenas matrizes contendo números inteiros ou matrizes, mas não as duas.Ruby, 104 bytes
Função anônima que espera uma sequência. Por exemplo,
{{{{{4 3 2 1}}}}{{{3 2 1}}}{{2 1}}{1}}
produzVocê pode usar este código para testar:
Isso começa na linha do meio e funciona para o exterior. Primeiro, as instâncias de
}{
são substituídas por|
. Então, enquanto ainda há chaves, todas as{...}
cadeias mais internas são transformadas nas+-
seqüências apropriadas , enquanto os caracteres que não|{}
são transformados em espaços. No final, os aparelhos intermediários são transformados em tubos.fonte
Brainfuck, 423 bytes
Formatado com alguns comentários:
Experimente online.
Espera a entrada formatada como
(((((4 3 2 1))))(((3 2 1)))((2 1))(1))
em uma nova linha à direita e produz a saída do formulário:A idéia básica é calcular qual caractere imprimir com base na profundidade do aninhamento. O formato de saída é tal que o índice de linha da borda superior de uma caixa é igual à profundidade da matriz correspondente, com simetria na linha do meio.
A fita é dividida em nós de 7 células, com cada nó representando uma coluna na saída.
O primeiro loop consome a entrada e inicializa os nós, mantendo o controle de profundidade e se a coluna corresponde a um parêntese (isto é, se a coluna contém uma borda vertical) e ocorrências recolhidas
)(
em nós únicos.O próximo loop gera uma linha por iteração. Dentro desse loop, outro loop percorre os nós e imprime um caractere por iteração; é aqui que a maior parte do trabalho ocorre.
Durante o loop de inicialização, o layout da memória de um nó no início de uma iteração é
x d 0 c 0 0 0
onde
x
é um sinalizador booleano para saber se o caractere anterior era parêntese de fechamento,d
é profundidade (mais um) ec
é o caractere atual.Durante o loop de impressão de caracteres, o layout da memória de um nó no início de uma iteração é
0 0 d1 d2 c p y
onde
d1
indica a profundidade em comparação com o índice de linha da metade superior;d2
é semelhante ad1
mas para a metade inferior;c
é o caractere de entrada para essa coluna, se dígito ou espaço, caso contrário, zero;p
indica fase, ou seja, metade superior, média ou inferior; ey
é uma bandeira que é propagada da esquerda para a direita, acompanhando se chegamos à linha do meio ainda. Observe que, comoy
se torna zero após o processamento de um nó, podemos usar ay
célula do nó anterior para obter mais espaço de trabalho.Essa configuração permite evitar o cálculo explícito da profundidade máxima durante a fase de inicialização; o
y
sinalizador é propagado novamente para atualizar asp
células adequadamente.Há uma
-1
célula à esquerda dos nós para facilitar a navegação e há uma célula à direita dos nós que controla se já imprimimos a última linha.fonte
PHP + HTML, não competindo (
170141135130 bytes)salvou 29 bytes inspirados em SteeveDroz
não competindo porque não há saída ASCII e porque deixei o navegador fazer todo o trabalho interessante
fonte
<b>
tags em vez de<div>
e não precisa especificar a cor doborder
. (Salvando 9 bytes)<b>
, também posso remover owhite-space
atributo, salvando outros 19 bytes. ótimo! E eu posso substituirpadding
pormargin
JavaScript (ES6), 221
Uma função não recursiva retornando uma matriz de seqüências de caracteres (ainda usando uma subfunção recursiva interna)
Isso funciona em 2 etapas.
Etapa 1: crie recursivamente uma representação de seqüência de caracteres da matriz de entrada aninhada. Exemplo:
[[[1, 2, 3], [],[4, 5]], [6, 7, 8]]
->"OOO1 2 3,,4 5C,6 7 8CC"
O
eC
marque abrir e fechar o subarray. Subarrays numéricos simples são renderizados com os elementos separados por espaço, enquanto que se os membros da matriz são subarrays, eles são separados por vírgulas. Essa string acompanha a estrutura multinível da matriz de entrada, enquanto eu posso obter a linha do meio da saída apenas substituindoOC,
por|
. Ao criar recursivamente essa sequência temporária, também encontro o nível máximo de profundidade e inicializo uma matriz de sequências vazias que conterão a metade da parte superior da saída.Nota: a caixa externa é complicada, aninho a entrada dentro de outra matriz externa e solto a primeira linha de saída que não é necessária
Etapa 2: varra a string temp e construa a saída
Agora eu tenho uma matriz de cadeias vazias, uma para cada nível. Examino a string temp, mantendo o controle do nível atual, que aumenta para cada um
O
e diminui para cada umC
. Eu visualizo isso assim:O mais o sobe e desce segue o nível atual
Para cada caractere, adiciono um caractere a cada linha de saída, seguindo as regras:
- se dígito ou espaço, coloque um '-' no nível atual e abaixo, coloque um espaço acima
- caso contrário, coloque um '+' no nível atual, coloque '-' se abaixo e coloque '|' se acima
Durante a varredura temporária, também construo a linha do meio substituindo
OC,
por|
No final desta etapa, tenho a metade superior e a linha do meio, só preciso espelhar a parte superior para obter a metade inferior e pronto
Código menos comentado e com menos golfe
)
Teste
fonte
Ruby,
245241 bytesA sobrecarga necessária para embrulhar tudo em caixas, bem como alinhar tudo, é bem pesada ...
Gera matrizes de strings, com uma string por linha, conforme a especificação. Alinhados na parte inferior em vez dos casos de teste de amostra alinhados na parte superior porque economizam 1 byte.
Experimente online!
fonte
PHP, 404 bytes
Todas as soluções funcionam com profundidade máxima da matriz menor que 10. Para valores maiores, a profundidade deve armazenar em uma matriz e não em uma string.
Expandido
para 425 bytes, podemos fazer isso com o REGEX
Expandido
455 bytes para uma solução recursiva
Expandido
fonte
$j!="]"?:$c--;
->$c-=$j=="]";
(-2). 2)($l=="]"?"":" ")
->" "[$l==$j]
(-5). Provavelmente substituições semelhantes no segundo loop. 3)if($r!=""){$n.=$r;$d.=+$c;}
->$n.=$r;if($r>"")$d.=+$c;
(-3). 4)$l=$j;$j!="["?:$c++;
->$c+="["==$l=$j;
(-5). 5)$x=0
não é necessário (-4). 6)for($y=0;$y<$m;$y++)
->for($y=$m;$y--;)
(-4). 7)join("\n",$z),"\n$n\n".(join("\n",array_reverse($z)));
->join("\n",array_merge($z,[$n],array_reverse($z)));
(-4) 8) espaço em branco desnecessário:foreach($e[0]as$f)
(-1)($j==",")
(-2). 10)if($r>"")$d.=+$c;
->$d.=$r>""?+$c:"";
(-0)$d.=$l?$t;
é obsoleta (-10) 2)$s.=$l?"|":"";return$s;
->return$s."|"[$l];
(-6). 3) aparelho obsoleto{$e=v($v,$t+1,$k+1==$c);}
(-2). 4){$e=$v." "[$k+1==$c];$d.=str_pad("",strlen($e),$t+1);}
->$d.=str_pad("",strlen($e=$v." "[$k+1==$c]),$t+1);
(-5).