Étant donné un tableau éventuellement imbriqué et non vide d'entiers positifs à un chiffre (non garanti unique), affichez la représentation ASCII sous forme d'arbre, en utilisant les caractères de dessin de boîte ┌ ┴ ┐ ─ │ ┬ ┼
. (Celles-ci ont été copiées à partir de la page de code 437, mais vous pouvez utiliser n'importe quelle représentation équivalente).
Chaque entier du tableau doit être une feuille de l'arbre. Les éléments situés au même niveau profondément dans le tableau doivent être présents au même niveau de l'arborescence. Tous les éléments doivent être séparés par suffisamment d'espaces pour être distincts (à vous de déterminer la largeur, au moins un espace entre les deux).
Par exemple, pour un tableau donné [[1, [2]], [3, [4, 5]]]
, affichez l'arborescence suivante
┌─┴─┐
┌┴┐ ┌┴─┐
1 │ 3 ┌┴┐
2 4 5
Pour le tableau, [1, 2, 3]
l'arbre pourrait ressembler à
┌─┼─┐
1 2 3
Mais le tableau [[1, 2, 3]]
ressemblerait
│
┌─┼─┐
1 2 3
Bien que le tableau [1, [1, [1, [1]]]]
puisse ressembler
┌─┴┐
1 ┌┴─┐
1 ┌┴┐
1 │
1
À titre d’exemple plus complexe, [1, [[[2, 3], 4], 5]]
pourrait être
┌┴───┐
1 ┌─┴┐
┌─┴┐ 5
┌┴┐ 4
2 3
ou plusieurs autres variantes.
- L'entrée et la sortie peuvent être fournies par n'importe quelle méthode pratique .
- Vous pouvez l'imprimer sur STDOUT ou le renvoyer en tant que résultat de fonction.
- Un programme complet ou une fonction sont acceptables.
- N'importe quelle quantité d'espace blanc étranger est acceptable, tant que les caractères s'alignent correctement.
- Les failles standard sont interdites.
- Il s'agit de code-golf, donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.
la source
[1,[[[2,3],4],5]]
pourrait être un cas de test intéressant car il doit avoir la racine s'étendre artificiellement pour que le sous-arbre droit n'entre pas en collision avec le sous-arbre gauche.1
est un tableau de 3 éléments:[2,3]
,4
, et5
. Mais 4 et 5 ne sont pas adjacents.[1, [[[2, 3]], [4], 5]]
me ressemble .Réponses:
Python 3 ,
400393390 octetsRenvoie une liste de chaînes de haut en bas.
EDIT 1: découpé 7 octets en évitant la duplication de
┴┼
(sauvegarde nette de 2 octets), en supprimant 0 de la chaîne, en changeant la façon dont les caractères de dessin sont sélectionnés┬┌┐
(utilisez<
au lieu de==
) et en remplaçant unL(z)
manquant pare
EDIT 2: -2 octets grâce aux ovs et -1 octet grâce à Kevin Cruijssen
Essayez-le en ligne!
Non golfé
Construit un arbre à partir des feuilles, une couche à la fois.
la source
S,*K=' ┴┼│123456789'
.e==1
peut êtree<2
de sauvegarder un octet (je ne pense pas qu'il puisse jamais être 0, car le défi indique que l'entrée n'est pas vide - et les entrées vides auraient déjà échoué àmax(map(L,z))
dans ce cas de toute façon.)Nettoyer ,
544506 octetsLes échappements sont utilisés pour éviter UTF-8 invalide sur SE / TIO mais comptés comme un octet car ils sont des littéraux valides
Essayez-le en ligne!
Prend entrée au format
L[I 3, L[I 4, I 5], I 2]..
Relie les arbres de bas en haut, de gauche à droite, puis ajuste les distances de droite à gauche.
Prettifié, sorte de:
la source
Fusain ,
127123 octetsEssayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Modifiez la direction de dessin par défaut vers le haut, car nous ne dessinons rien vers la droite.
La première étape consiste à convertir la représentation de tableau imbriqué dans une représentation d'index qui est une liste de toutes les entrées ainsi que les indices des sous - réseaux, par exemple pour l'entrée
q=[1, [[[2, 3]], [4], 5]]
du5
estq[1][2]
et donc la liste que nous voulons est1, 2
. Nous commençons par une seule entrée à traiter qui est une liste contenant une liste des indices actuels (c'est-à-dire aucun jusqu'à présent) et l'entrée d'origine.Faites une boucle sur les tableaux lorsque nous les traitons. (Idéalement, le charbon de bois continuera à parcourir une liste si vous appuyez dessus pendant l'itération.)
Obtenez le tableau suivant à traiter.
Est-ce en fait un scalaire plutôt qu'un tableau?
Si c'est le cas, alors la liste que nous avions appartient en fait à la liste finale des listes d'indices.
Sinon, passez en boucle sur chaque élément de ce tableau ...
... et enregistrez-le avec sa nouvelle liste d'index jusqu'à présent pour un traitement ultérieur. L'index maximum du tableau est également enregistré, ce qui est utilisé pour caser le dernier élément du tableau.
Nous sommes maintenant prêts à parcourir la liste des listes d'index. Cependant, la liste n'est pas dans l'ordre lexicographique, nous ne pouvons donc pas l'itérer directement.
Trouvez l'élément suivant dans l'ordre lexicographique.
Retirez-le de la liste.
Aller à la position du scalaire dans la sortie. Nous pouvons calculer cela étant donné que nous pouvons compter le nombre de scalaires que nous produisons et nous connaissons également le nombre d'entrées dans sa liste d'index.
Imprimez en fait le scalaire.
Faites une boucle sur les entrées de la liste d'index. Encore une fois, ce n'est pas une simple itération, car les entrées viennent par paires, et nous devons également pouvoir sortir de la boucle.
Extrayez le prochain index de la liste.
Si ce n'est pas le premier élément de la liste ...
... puis imprimez
┐
ou┬
selon qu'il s'agit du dernier élément de la liste ...... et imprimez suffisamment de
─
s pour remplir jusqu'à l'entrée précédente à ce niveau ...... et effacez la variable pour sortir de la boucle puisque nous avons terminé ici.
Sinon, s'il s'agit (du premier élément) d'une liste à plusieurs éléments, imprimez le
┌┴
, en laissant le curseur au-dessus de┴
pour traiter le parent de ce niveau.Sinon, s'il s'agit d'une liste à 1 élément, il suffit d'imprimer un
│
et de monter d'une ligne pour traiter avec le parent de ce niveau.la source