O desafio de hoje é desenhar uma árvore binária tão bela arte ascii como este exemplo:
/\
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/\ /\
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/\ /\ /\ /\
/ \ / \ / \ / \
/ \ / \ / \ / \
/ \ / \ / \ / \
/\ /\ /\ /\ /\ /\ /\ /\
/ \ / \ / \ / \ / \ / \ / \ / \
/\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
Você receberá um número inteiro positivo como entrada. Esta entrada é a altura da árvore . O exemplo acima tem uma altura de seis.
Você pode enviar um programa completo ou uma função e pode usar qualquer um dos nossos métodos de E / S padrão . Por exemplo, imprimir a árvore, retornar uma string com novas linhas, retornar uma matriz 2d, salvar a árvore em um arquivo, etc., seria permitido.
Espaços à direita em cada linha são permitidos.
Aqui estão alguns exemplos de entradas e suas saídas correspondentes:
1:
/\
2:
/\
/\/\
3:
/\
/ \
/\ /\
/\/\/\/\
4:
/\
/ \
/ \
/ \
/\ /\
/ \ / \
/\ /\ /\ /\
/\/\/\/\/\/\/\/\
5:
/\
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/\ /\
/ \ / \
/ \ / \
/ \ / \
/\ /\ /\ /\
/ \ / \ / \ / \
/\ /\ /\ /\ /\ /\ /\ /\
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
Infelizmente, a saída cresce exponencialmente, por isso é difícil mostrar exemplos maiores. Aqui está um link para a saída para 8.
Como de costume, esse é um desafio do código-golfe , portanto, brechas comuns se aplicam e tente escrever o programa mais curto possível no idioma que você escolher.
Feliz golfe!
Respostas:
Python 2, 77 bytes
Imprime com espaços à direita, terminando com erro.
Levei esse código da minha submissão a um desafio que eu colocava no Anarchy Golf , além de uma melhoria de um byte encontrada pelo xsot. O valor codificado de 128 foi alterado para
2**input()
.A ideia é que cada linha da saída seja um segmento copiado uma ou mais vezes. A metade após a divisão de entrada possui uma cópia de cada segmento, o trimestre após a divisão seguinte tem duas cópias, e assim por diante, até a última linha com muitos segmentos de
/\
.Cada segmento tinha um
/
e\
, com espaços intermediários, bem como do lado de fora, para preencher o comprimento certo. O preenchimento externo é feito comcenter
.A variável
s
rastreia a corrente com cada segmento e o número de segmentos éS/s
para que a largura total seja a largura da árvoreS
. O número da linhai
é reduzido em 2 e, sempre que o valors
é metade dele, ocorre uma divisão e a largura do segmento diminui pela metade. Isto é feito através da expressãos/=s/i
. Quandoi
chega0
, isso gera um erro que finaliza o programa.Como o anagolf só permite envios de programas, não explorei a possibilidade de uma função recursiva, que eu acho que provavelmente é mais curta.
fonte
V , 32 bytes
Experimente online!
Hexdump:
fonte
Tela , 11 bytes
Experimente aqui!
Explicação:
fonte
Haskell ,
140 138135 bytesExperimente online! Call with
b 5
, retorna uma lista de strings.Uso bonito da impressão:
(alguns) Explicação:
e n
gera uma sequência den
espaçosn!f
preenche cada string na lista de stringsf
comn
espaços esquerdo e direitof n
desenha um "pico" em umn
por2n
rectângulob n
desenha a árvore binária concatenando duas árvores menores e centraliza um novo pico acima delasEdit: -3 bytes graças ao Zgarb!
fonte
1!f(n-1)
em!f m
devo salvar alguns bytes.J ,
49 4342 bytesIsso avalia um verbo que pega um número e retorna uma matriz de caracteres 2D. Experimente online!
Explicação
Primeiro construo uma matriz dos valores -1, 0 e 1 iterando um verbo auxiliar e, em seguida, substituo os números por caracteres. O verbo auxiliar constrói a metade direita da próxima iteração e espelha horizontalmente para produzir o restante. Na explicação a seguir,
,
concatena matrizes 2D verticalmente e matrizes 1D horizontalmente.fonte
JavaScript (ES6), 105 bytes
Funciona construindo o resultado recursivamente a partir do caso base
/\
. A metade inferior é apenas o caso anterior, com cada linha duplicada. A metade superior foi um pouco mais complicada; parece que você quer pegar o caso anterior e manter apenas os dois lados, mas também precisa se preocupar em preencher as cordas para dobrar a largura, então, em vez disso, faço mágica regex. Tomando os espaços à esquerda do caso anterior e dividindo a cada ponto, posso considerar os espaços antes e depois desse ponto. Em cada partida, os espaços antes aumentam em 1 e os espaços após diminuem em 1; isso pode ser usado para posicionar o/
e\
nos lugares corretos. As novas linhas e preenchimento também são adicionados aqui; isso cuida de todo o preenchimento, exceto um espaço à direita em cada linha e um espaço à esquerda na primeira linha, que devo adicionar manualmente. (Os espaços iniciais nas linhas subseqüentes vêm da sequência correspondente).fonte
Carvão , 12 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Os comprimentos das linhas são 1, 1, 2, 4, 8 ... 2 ^ (N-2), portanto, o cálculo estranho.
fonte
Stax ,
2019 bytesExecute e depure
fonte
Lote, 218 bytes
Nota: A linha 6 termina em um espaço. Funciona movendo os galhos para a esquerda e para a direita de cada vez, exceto em linhas a 2 n do final. Nesse caso, os galhos são bifurcados.
fonte
Haxe, 181 bytes
Ou, com algum espaço em branco opcional:
Eu estava trabalhando por um tempo em uma solução que criou primeiro uma matriz de caracteres de espaço do tamanho certo e depois, iterativamente, colocou os caminhos bifurcados cada vez mais baixos (e mais densamente a cada iteração). Permaneceu 230 + bytes, no entanto. A abordagem aqui é basicamente o que é a abordagem Haskell de @ Laikoni. Eu não poderia me safar por não ter
:String
, porque Haxe não é inteligente o suficiente para identificar que o tipo de retorno sempre será uma String.Esta é apenas uma função, aqui está um programa completo para testá-lo:
Coloque o item acima
Main.hx
, compilehaxe -main Main.hx -neko frac.n
e teste comneko frac.n 4
(substitua4
pela ordem desejada).fonte
PHP, 188 bytes
Versão Online
Expandido
fonte