Inspiré d'une question récente sur SO ...
Écrivez une fonction pour imprimer un arbre binaire au format suivant:
3
/ \
1 5
\ / \
2 4 6
- La sortie doit être composée d'une ligne de nœuds, suivie d'une ligne de
/
et de\
caractères indiquant les relations, suivie d'une ligne de nœuds, etc. - Vous pouvez supposer que tous les nœuds sont représentables comme un seul caractère.
- Les nœuds adjacents au niveau le plus bas doivent être séparés par au moins un espace, les nœuds plus haut doivent être séparés le cas échéant.
- Les nœuds avec deux enfants doivent être placés précisément au milieu de leurs enfants directs.
- Les barres obliques de relation doivent être à mi-chemin entre le parent et l'enfant approprié (arrondissez comme vous le souhaitez).
Contribution:
L'entrée sera fournie comme argument à votre fonction. Je ne spécifierai pas la structure exacte de l'arbre, mais il doit être utilisable comme un arbre binaire réel. Aucun "arbre n'est représenté dans mon programme comme des chaînes ressemblant par coïncidence à la sortie attendue".
Vous pouvez imprimer sur un flux de sortie ou renvoyer une chaîne contenant la sortie, votre choix.
Points pour le code le plus court, mais je préférerais de loin une solution longue fonctionnant pleinement qu'une courte fonctionnant à 90%.
Mise à jour pour la prime:
Pour la prime, je (Optimizer) fais de légers changements:
- L'entrée peut provenir de STDIN, ARGV ou d'un argument de fonction.
- La sortie doit être sur STDOUT (ou
console.log
pour JS) - Vous pouvez supposer que l'entrée est sous forme de tableau, par exemple.
[1,2,3]
ou[1 2 3]
Mise à jour 2 - L'arbre binaire doit en fait être un arbre de recherche binaire. Comme je ne l'ai pas mentionné initialement, je vais permettre aux utilisateurs de traiter la conversion d'un tableau normal en un tableau d'arbre de recherche binaire comme un programme distinct et le nombre d'octets final ne sera que pour que le programme prenne le tableau en argument et l'imprime comme un arbre binaire.
30000,1000,499999
Réponses:
Fortran 77-1085 caractères
L'arbre est représenté dans le tableau d'entrée
t
de la manière habituelle, racine à 1, racine-> gauche à 2, racine-> droite à 3 racine-> gauche-> gauche à 4 ...La sortie doit tenir dans un terminal conventionnel jusqu'à 5 niveaux de profondeur.
J'utilise exactement une barre oblique entre chaque paire de nœuds, ce qui semble assez idiot près du sommet une fois qu'il y a quatre niveaux ou plus. J'ai autorisé jusqu'à trois nœuds de chiffres.
Programme complet avec commentaires et échafaudage de lancement:
Sortie avec entrée équivalente à l'exemple:
la source
CJam,
10099 octetsL'entrée doit être une liste de caractères, sans aucun caractère de contrôle ascii. Les nœuds vides sont indiqués par un espace. Il doit également s'agir d'un arbre binaire parfait avec exactement 2 n -1 nœuds.
Exemple:
Ou utilisez simplement des chaînes:
Production:
Explication
Script de conversion
Il accepte des caractères ou des nombres à un chiffre.
Exemples (tous sont les mêmes):
Production:
C'est une construction d'arbre cartésienne simple.
la source
Python 2, 411 octets
Remarque: le premier niveau d'indentation est de 1 espace, le second d'un onglet.
Appelez
f
avec une liste de chaînes ou de caractères à un caractèreNone
, par ex.f(['1',None,'3'])
. La liste ne peut pas être vide.Cela devrait obéir aux règles de la prime.
Script de conversion:
Convertit et tableau au format utilisé par l'imprimante d'arbre binaire. Exemple:
-
Exemples:
Pour les exécuter, vous devez nommer le fichier principal
bt.py
et le fichier convertisseurconv.py
.la source
['1','2','3','4','5','6','7','8','9']
tableau n'est pas ce que vous avez montré. Il doit avoir3
comme enfant droit2
dont un enfant droit1
est un élément racine.APL, 125 caractères
Exemple:
Testé ici.
la source
Rubis, 265 octets
La version @proudhaskeller, 269 octets
Explication
La version verbeuse:
Exemple
donne:
(Je n'ai pas encore écrit le script de conversion.)
la source