Le défi d'aujourd'hui est de dessiner un arbre binaire aussi beau que l' art ascii comme cet exemple:
/\
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/\ /\
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/\ /\ /\ /\
/ \ / \ / \ / \
/ \ / \ / \ / \
/ \ / \ / \ / \
/\ /\ /\ /\ /\ /\ /\ /\
/ \ / \ / \ / \ / \ / \ / \ / \
/\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
Vous recevrez un entier positif en entrée. Cette entrée est la hauteur de l'arbre . L'exemple ci-dessus a une hauteur de six.
Vous pouvez soumettre un programme complet ou une fonction, et vous êtes libre d'utiliser l'une de nos méthodes d'E / S par défaut . Par exemple, l'impression de l'arborescence, le retour d'une chaîne avec des sauts de ligne, le retour d'un tableau de caractères 2D, l'enregistrement de l'arborescence dans un fichier, etc. seraient tous autorisés.
Les espaces de fin sur chaque ligne sont autorisés.
Voici quelques exemples d'entrées et de leurs sorties correspondantes:
1:
/\
2:
/\
/\/\
3:
/\
/ \
/\ /\
/\/\/\/\
4:
/\
/ \
/ \
/ \
/\ /\
/ \ / \
/\ /\ /\ /\
/\/\/\/\/\/\/\/\
5:
/\
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/\ /\
/ \ / \
/ \ / \
/ \ / \
/\ /\ /\ /\
/ \ / \ / \ / \
/\ /\ /\ /\ /\ /\ /\ /\
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
Malheureusement, la sortie augmente de façon exponentielle, il est donc difficile d'afficher des exemples plus grands. Voici un lien vers la sortie pour 8.
Comme d'habitude, c'est un code-golf défi de , donc les failles standard s'appliquent et essayez d'écrire le programme le plus court possible dans la langue que vous choisissez.
Bon golf!
Réponses:
Python 2, 77 octets
Imprime avec des espaces de fin, se terminant par une erreur.
J'ai pris ce code de ma soumission à un défi que j'ai posé sur Anarchy Golf , plus une amélioration d'un octet trouvée par xsot. La valeur codée en dur de 128 a été remplacée par
2**input()
.L'idée est que chaque ligne de la sortie est un segment copié une ou plusieurs fois. La moitié après le fractionnement d'entrée a une copie de chaque segment, le quart après le fractionnement suivant a deux copies, et ainsi de suite, jusqu'à la dernière ligne avec plusieurs segments de
/\
.Chaque segment avait un
/
et\
, avec des espaces entre les deux, ainsi qu'à l'extérieur pour se garnir à la bonne longueur. Le rembourrage extérieur est fait aveccenter
.La variable
s
suit le courant avec de chaque segment et le nombre de segments estS/s
tel que la largeur totale est la largeur de l'arbreS
. Le numéro de lignei
décompte de 2, et chaque fois que la valeurs
est la moitié de celle-ci, une division se produit et la largeur du segment diminue de moitié. Cela se fait via l'expressions/=s/i
. Lorsquei
atteint0
, cela donne une erreur qui termine le programme.Comme anagolf n'autorise que les soumissions de programmes, je n'ai pas exploré la possibilité d'une fonction récursive, qui je pense est probablement plus courte.
la source
V , 32 octets
Essayez-le en ligne!
Hexdump:
la source
Toile , 11 octets
Essayez-le ici!
Explication:
la source
Haskell ,
140 138135 octetsEssayez-le en ligne! Appelez avec
b 5
, renvoie une liste de chaînes.Jolie utilisation d'impression:
(certains) Explication:
e n
génère une chaîne d'n
espacesn!f
tamponne chaque chaîne dans la liste des chaînesf
avec desn
espaces à gauche et à droitef n
dessine un « pic » dans unn
par2n
rectangleb n
dessine l'arbre binaire en concaténant deux arbres plus petits et centre un nouveau pic au-dessus d'euxEdit: -3 octets grâce à Zgarb!
la source
1!f(n-1)
etm!f m
devrait économiser quelques octets.J ,
49 4342 octetsCela se traduit par un verbe qui prend un nombre et renvoie un tableau de caractères 2D. Essayez-le en ligne!
Explication
Je construis d'abord une matrice des valeurs -1, 0 et 1 en itérant un verbe auxiliaire, puis je remplace les nombres par des caractères. Le verbe auxiliaire construit la moitié droite de l'itération suivante, puis la met en miroir horizontalement pour produire le reste. Dans l'explication suivante,
,
concatène les tableaux 2D verticalement et les tableaux 1D horizontalement.la source
JavaScript (ES6), 105 octets
Fonctionne en construisant le résultat de manière récursive à partir du cas de base
/\
. La moitié inférieure est juste le cas précédent avec chaque ligne dupliquée. La moitié supérieure était un peu plus délicate; on dirait que vous voulez prendre le cas précédent et ne garder que les deux côtés mais vous devez également vous soucier de rembourrer les cordes pour doubler la largeur, donc à la place, je fais de la magie regex. En prenant les espaces de tête du cas précédent et en les séparant à chaque point, je peux considérer les espaces avant et après ce point. À chaque correspondance, les espaces avant augmentation de 1 et les espaces après diminution de 1; cela peut être utilisé pour positionner le/
et\
aux bons endroits. Les nouvelles lignes et le rembourrage sont également ajoutés ici; cela prend en charge tout le remplissage, sauf un espace de fin sur chaque ligne et un espace de tête sur la première ligne que je dois ajouter manuellement. (Les espaces en tête sur les lignes suivantes proviennent de la chaîne correspondante).la source
Fusain , 12 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Les longueurs de ligne sont 1, 1, 2, 4, 8 ... 2 ^ (N-2), d'où le calcul gênant.
la source
Stax ,
2019 octetsExécuter et déboguer
la source
Lot, 218 octets
Remarque: la ligne 6 se termine dans un espace. Fonctionne en déplaçant les branches à gauche et à droite de façon appropriée à chaque fois, sauf sur les lignes situées à 2 n de la fin, auquel cas les branches sont plutôt fourchues.
la source
Haxe, 181 octets
Ou, avec des espaces en option:
Je travaillais depuis un moment sur une solution qui créait d'abord un tableau de caractères spatiaux de la bonne taille, puis mettait les chemins bifurqués de plus en plus bas (et plus densément à chaque itération). Il restait cependant plus de 230 octets. L'approche ici est à peu près ce qu'est l'approche Haskell de @ Laikoni. Je ne pouvais pas m'en tirer sans avoir
:String
, car Haxe n'est pas assez intelligent pour identifier que le type de retour sera toujours une chaîne.Ceci n'est qu'une fonction, voici un programme complet pour le tester:
Mettez ce qui précède
Main.hx
, compilez avechaxe -main Main.hx -neko frac.n
et testez avecneko frac.n 4
(remplacez4
par l'ordre souhaité).la source
PHP, 188 octets
Version en ligne
Étendu
la source