Étant donné un entier n, énumérer tous les arbres binaires complets possibles avec n nœuds internes. (Les arbres binaires complets ont exactement 2 enfants sur chaque nœud interne). La structure arborescente doit être sortie en tant que parcours de précommande de l'arbre, 1 représentant un nœud interne et 0 représentant un nœud externe (Null).
Voici des exemples pour les premiers n:
0:
0
1:
100
2:
11000
10100
3:
1110000
1101000
1100100
1011000
1010100
Il s'agit d'un golf de code avec le prix allant au moins de personnages. Les arbres doivent être sortis un par ligne vers stdout. Le programme doit lire n à partir de la ligne de commande ou stdin.
code-golf
combinatorics
binary-tree
Kyle Butt
la source
la source
Réponses:
Perl -
12579 caractèresLe nombre comprend 4 caractères pour les
-ln
options " ". Prend n de stdin.Nouvelle approche constructive:
Former la solution pour n en substituant un nouveau nœud interne ("100") pour chaque feuille ("0"), à son tour, dans chaque arbre de la solution pour n-1.
(Je dois ce concept à d'autres solutions qui utilisent le nœud interne pour remplacer la feuille [100-> 0] pour vérifier les chaînes générées séquentiellement, et je crois avoir vu - après avoir écrit ma réponse basée sur ce concept - ce même 0- > 100 méthode de construction dans l'édition intermédiaire de quelqu'un.)
Approche récursive précédente:
Récursif non golfé:
la source
PHP
(142)(138)(134)(113)S'exécute à partir de la ligne de commande, c'est-à-dire que "php golf.php 1" génère "100".
EDIT: Coupez 4 caractères avec une autre méthode, en construisant les chaînes à partir de 0 plutôt que récursif à partir de $ n. Utilise PHP 5.3 pour l'opérateur ternaire raccourci; sinon, 2 caractères supplémentaires sont nécessaires.
EDIT 2: enregistrement de 4 caractères supplémentaires avec quelques modifications des boucles.
EDIT 3: J'essayais une approche différente et je l'ai finalement obtenue en dessous de l'ancienne méthode.
Tous les arbres peuvent être considérés comme des représentations binaires d'entiers compris entre 4 ^ n (ou 0, lorsque n = 0) et 2 * 4 ^ n. Cette fonction parcourt cette plage et obtient la chaîne binaire de chaque nombre, puis la réduit à plusieurs reprises en remplaçant "100" par "0". Si la chaîne finale est "0", alors c'est un arbre valide, alors sortez-le.
la source
Ruby,
9994928987 caractèresL'entrée est lue depuis stdin.
Edit 1: IO modifié (voir les commentaires de Lowjacker)
Edit 2: algorithme modifié.
Edit 3: La version adopte désormais la troisième approche (en utilisant l'idée de migimaru).
Edit 4: Encore deux personnages. Merci à migimaru.
la source
*?\n
, carputs
imprime chaque élément du tableau sur sa propre ligne.Rubis 1,9
(80)(79)En utilisant l'approche non récursive et constructive utilisée par DCharness.
EDIT: 1 caractère enregistré.
la source
Haskell 122 caractères
Étant donné que l'IO est une partie non triviale du code dans haskell, peut-être que quelqu'un peut utiliser une solution similaire dans une autre langue. Marche essentiellement aléatoire dans un carré du bas à gauche vers le haut à droite en s'arrêtant si la diagonale est traversée. Équivalent à ce qui suit:
la source
Golfscript, 60
83J'ai construit un mode golfscript pour Emacs pour y travailler, si quelqu'un est intéressé.
la source