Dado um número inteiro n, enumere todas as possíveis árvores binárias completas com n nós internos. (Árvores binárias completas têm exatamente 2 filhos em cada nó interno). A estrutura da árvore deve ser gerada como uma travessia de pré-ordem da árvore, com 1 representando um nó interno e 0 representando um nó externo (Nulo).
Aqui estão alguns exemplos para os primeiros n:
0:
0
1:
100
2:
11000
10100
3:
1110000
1101000
1100100
1011000
1010100
Este é um código de golfe com o prêmio indo para o menor número de caracteres. As árvores devem ser produzidas uma por linha para stdout. O programa deve ler n na linha de comando ou stdin.
code-golf
combinatorics
binary-tree
Kyle Butt
fonte
fonte
Respostas:
Perl -
12579 caracteresA contagem inclui 4 caracteres para as
-ln
opções " ". Toma n de stdin.Nova abordagem construtiva:
Forme a solução para n substituindo um novo nó interno ("100") para cada folha ("0"), por sua vez, em cada árvore da solução para n-1.
(Devo esse conceito às soluções de outros que usam o nó interno para substituir [100-> 0] a folha para verificar seqüências geradas seqüencialmente, e acredito que vi - depois de escrever minha resposta com base nesse conceito - esse mesmo 0- > 100 método de construção na edição intermediária de alguém.)
Abordagem recursiva anterior:
Recursivo não destruído:
fonte
PHP
(142)(138)(134)(113)É executado a partir da linha de comando, ou seja, "php golf.php 1" gera "100".
EDIT: Corte 4 caracteres com um método alternativo, construindo as strings a partir de 0 em vez de retornando a partir de $ n. Usa PHP 5.3 para o operador ternário reduzido; caso contrário, são necessários mais 2 caracteres.
EDIT 2: salvou mais 4 caracteres com algumas alterações nos loops.
EDIÇÃO 3: Eu estava tentando uma abordagem diferente e finalmente a obtive abaixo do método antigo.
Todas as árvores podem ser consideradas representações binárias de números inteiros entre 4 ^ n (ou 0, quando n = 0) e 2 * 4 ^ n. Essa função percorre esse intervalo e obtém a sequência binária de cada número e a reduz repetidamente, substituindo "100" por "0". Se a sequência final for "0", é uma árvore válida, portanto, faça a saída.
fonte
Ruby,
9994928987 caracteresA entrada é lida a partir de stdin.
Editar 1: E / S alteradas (consulte os comentários do Lowjacker)
Editar 2: algoritmo alterado.
Edit 3: A versão agora segue a terceira abordagem (usando a idéia de migimaru).
Editar 4: Novamente dois caracteres. Obrigado a migimaru.
fonte
*?\n
, porqueputs
imprime cada elemento da matriz em sua própria linha.Rubi 1.9
(80)(79)Usando a abordagem construtiva não recursiva usada pelo DCharness.
EDIT: salvou 1 caractere.
fonte
Haskell 122 chars
Como o IO é uma parte não trivial do código em haskell, talvez alguém possa usar uma solução semelhante em outro idioma. Passeios essencialmente aleatórios em um quadrado do canto inferior esquerdo para o canto superior direito, se a diagonal for cruzada. Equivalente ao seguinte:
fonte
Golfscript, 60
83Eu criei um modo golfscript para o Emacs para trabalhar nisso, se alguém estiver interessado.
fonte