Étant donné un tableau de n'importe quelle profondeur, dessinez son contenu avec des bordures +-|
autour de chaque sous- tableau . Ce sont les caractères ASCII pour les tuyaux plus, moins et verticaux.
Par exemple, si le tableau est [1, 2, 3]
, dessinez
+-----+
|1 2 3|
+-----+
Pour un tableau imbriqué tel que [[1, 2, 3], [4, 5], [6, 7, 8]]
, dessinez
+-----------------+
|+-----+---+-----+|
||1 2 3|4 5|6 7 8||
|+-----+---+-----+|
+-----------------+
Pour un tableau irrégulier tel que [[[1, 2, 3], [4, 5]], [6, 7, 8]]
, dessinez
+-------------------+
|+-----------+-----+|
||+-----+---+|6 7 8||
|||1 2 3|4 5|| ||
||+-----+---+| ||
|+-----------+-----+|
+-------------------+
Notez qu'il y a plus d'espace après le dessin [6, 7, 8]
. Vous pouvez soit dessiner le contenu sur la ligne supérieure, centrale ou inférieure, mais selon votre choix, vous devez rester cohérent.
Ce défi a été inspiré par le verbe boîte<
de J.
Règles
- C'est le code-golf donc le code le plus court l'emporte.
- Les buildins qui résolvent ce problème ne sont pas autorisés.
- Le tableau d'entrée ne contiendra que des valeurs entières non négatives ou des tableaux. Chaque tableau sera homogène, ce qui signifie que ses éléments seront soit uniquement des tableaux ou uniquement des entiers, mais jamais un mélange des deux.
- Chaque sous-réseau peut être imbriqué à n'importe quelle profondeur.
- La sortie peut être soit sous forme de chaîne, soit sous forme de tableau de chaînes, chaque chaîne étant une ligne de sortie.
Cas de test
[]
++
||
++
[[], []]
+---+
|+++|
|||||
|+++|
+---+
[[], [1], [], [2], [], [3], []]
+-----------+
|++-++-++-++|
|||1||2||3|||
|++-++-++-++|
+-----------+
[[[[[0]]]]]
+---------+
|+-------+|
||+-----+||
|||+---+|||
||||+-+||||
|||||0|||||
||||+-+||||
|||+---+|||
||+-----+||
|+-------+|
+---------+
[[[[[4, 3, 2, 1]]]], [[[3, 2, 1]]], [[2, 1]], [1]]
+---------------------------------+
|+-------------+---------+-----+-+|
||+-----------+|+-------+|+---+|1||
|||+---------+|||+-----+|||2 1|| ||
||||+-------+|||||3 2 1|||+---+| ||
|||||4 3 2 1|||||+-----+|| | ||
||||+-------+|||+-------+| | ||
|||+---------+|| | | ||
||+-----------+| | | ||
|+-------------+---------+-----+-+|
+---------------------------------+
-1
comme j'ai également limité les entiers à être non négatifs. Il suffirait alors de nettoyer la sortie pour ces valeurs non valides.Réponses:
Dyalog APL , 56 octets
Merci à ngn d'avoir aidé à supprimer environ un tiers des octets.
TryAPL
Définissez la fonction , puis exécutez chaque scénario de test et comparez-le à l'
]Display
utilitaire intégré .[1, 2, 3]
[[1, 2, 3], [4, 5], [6, 7, 8]]
[[[1, 2, 3], [4, 5]], [6, 7, 8]]
[]
[[], []]
[[], [1], [], [2], [], [3], []]
[[[[[0]]]]]
[[[[[4, 3, 2, 1]]]], [[[3, 2, 1]]], [[2, 1]], [1]]
Explication
Dans l'ensemble, il s'agit d'une fonction anonyme
{...}
au sommet d'une enceinte⊂
. Ce dernier ajoute simplement un autre niveau d'imbrication invitant le premier à ajouter un cadre extérieur.La fonction anonyme avec espace blanc (
⋄
est le séparateur d'instructions):Le voici à nouveau, mais avec des fonctions utilitaires séparées:
Maintenant, laissez-moi vous expliquer chaque fonction:
CloseBox
prend une table et renvoie la même table, mais avec la première colonne de la table ajoutée à droite de la table. Ainsi, étant donné le tableau 1 par 3XYZ
, cette fonction renvoie le tableau 1 par 4XYZX
, comme suit:⊢
l'argument (lit. ce qui est à droite) est,
ajouté à⊣/
la colonne la plus à gauche (lit. la réduction gauche de chaque rangée)CreateVertical
prend une table et renvoie la chaîne a composée des caractères qui correspondraient à|
s sur les côtés de la table, mais avec deux+
s ajoutés pour correspondre à deux lignes de-
. Finalement, le tableau subira une rotation cyclique d'une ligne pour obtenir une seule+---...
ligne au-dessus et en dessous. Ainsi, étant donné n'importe quelle table à trois lignes, cette fonction renvoie++|||
, comme suit:'++' ,
deux points positifs ajoutés à'|' ⍴⍨
un montant remodelé par≢
le décompte (lignes ') de l'argumentAddHorizontals
prend une liste de listes, en fait un tableau, ajoute deux lignes de-
s en haut, ajoute les caractères de bord gauche correspondants à gauche, puis fait pivoter une ligne vers le bas, de sorte que le tableau ait une bordure en haut , gauche et bas. Comme suit:1 ⊖
faire pivoter une ligne (la ligne du haut va vers le bas) deCreateVertical ,
la chaîne++|||...
ajoutée (en tant que colonne) au'-' ⍪⍣2
moins ajouté deux fois en haut de↑
l'argument transformé de liste de listes en table{
La fonction anonyme}
: si l'argument est une liste simple (non imbriquée), transformez-la en une table de caractères (donc, étant donné la liste à 3 éléments1 2 3
, cette fonction renvoie la table de caractères 1 par cinq visuellement identique1 2 3
). Si l'argument n'est pas une simple liste, assurez-vous que les éléments sont de simples tables de caractères; les garnir à hauteur égale; encadrez chacun en haut, en bas et à gauche; les combiner; et enfin prendre la toute première colonne et l'ajouter à droite. Comme suit:{
commencer la définition d'une fonction anonyme⍵ ≡ ∊⍵:
si l'argument est identique à l'argument aplati (c'est-à-dire qu'il s'agit d'une simple liste), puis:⍉
transposer l' argument stratifié transposé en⍪
colonnes ; else: ajoutez la colonne la plus à gauche à droite de⍉
⍕ ⍵
CloseBox
⊃ ,/
lesAddHorizontals¨
ajouts concaténés divulgués (car la réduction englobe)-
en haut et en bas de chacun des↓ ↑ ↓¨
rembourrés à hauteur égale * de∇¨ ⍵
cette fonction anonyme appliquée à chacun des arguments mettent}
fin à la définition de la fonction anonyme* Lit. faire de chaque table une liste de listes, combiner les listes de listes (remplissage avec des chaînes vides pour remplir des lignes courtes) en une table, puis diviser la table en une liste de listes de listes
la source
JavaScript (ES6),
223203 octetsPort de la solution Ruby de @ MitchSchwartz. Version précédente qui fonctionnait en encapsulant récursivement les tableaux (et fonctionnait donc pour du contenu arbitraire, pas seulement des entiers):
Remarque: Bien que j'utilise l'opérateur d'étalement dans ma liste d'arguments, pour obtenir la sortie souhaitée, fournissez un seul paramètre du tableau d'origine plutôt que d'essayer de répartir le tableau; cela a pour effet d'envelopper la sortie dans la boîte extérieure souhaitée. Malheureusement, la boîte extérieure me coûte 18 octets, et la séparation de l'espace des entiers me coûte 8 octets, sinon la visualisation alternative suivante suffirait pour 197 octets:
la source
Cannot read property 'map' of undefined
pour les tableaux vides tels que[]
. Pour[1,2,[]]
, le dernier sous-tableau ne s'affiche pas pour moi.[1,2,[]]
car vos exemples affichent uniquement des tableaux contenant des nombres entiers ou des tableaux, mais pas les deux.Rubis, 104 octets
Fonction anonyme qui attend une chaîne. Par exemple,
{{{{{4 3 2 1}}}}{{{3 2 1}}}{{2 1}}{1}}
produitVous pouvez utiliser ce code pour tester:
Cela commence à partir de la rangée du milieu et fonctionne vers l'extérieur. Tout d'abord, les instances de
}{
sont remplacées par|
. Ensuite, alors qu'il y a encore des accolades, toutes les{...}
chaînes les plus internes sont transformées en+-
séquences appropriées tandis que les caractères autres que ceux-ci|{}
sont transformés en espaces. À la fin, les entretoises intermédiaires sont transformées en tuyaux.la source
Brainfuck, 423 octets
Formaté avec quelques commentaires:
Essayez-le en ligne.
Attend une entrée formatée comme
(((((4 3 2 1))))(((3 2 1)))((2 1))(1))
avec un retour à la ligne de fin et produit une sortie du formulaire:L'idée de base est de calculer le caractère à imprimer en fonction de la profondeur d'imbrication. Le format de sortie est tel que l'index de ligne de la bordure supérieure d'une boîte est égal à la profondeur du tableau correspondant, avec une symétrie sur la ligne du milieu.
La bande est divisée en nœuds à 7 cellules, chaque nœud représentant une colonne dans la sortie.
La première boucle consomme l'entrée et initialise les nœuds, en gardant une trace de la profondeur et si la colonne correspond à une parenthèse (c'est-à-dire si la colonne contient une bordure verticale), et en réduisant les occurrences de
)(
en nœuds uniques.La boucle suivante génère une ligne par itération. Dans cette boucle, une autre boucle traverse les nœuds et imprime un caractère par itération; c'est là que la plupart du travail a lieu.
Lors de la boucle d'initialisation, la disposition mémoire d'un nœud au début d'une itération est
x d 0 c 0 0 0
où
x
est un indicateur booléen indiquant si le caractère précédent était une parenthèse fermante,d
est la profondeur (plus un) etc
est le caractère actuel.Pendant la boucle d'impression des caractères, la disposition de la mémoire d'un nœud au début d'une itération est
0 0 d1 d2 c p y
où
d1
indique la profondeur par rapport à l'indice de rang pour la moitié supérieure;d2
est similaire àd1
mais pour la moitié inférieure;c
est le caractère d'entrée pour cette colonne si chiffre ou espace, sinon zéro;p
indique la phase, c'est-à-dire la moitié supérieure, la moitié médiane ou la moitié inférieure; ety
est un drapeau qui se propage de gauche à droite, en gardant une trace de si nous avons encore atteint la rangée du milieu. Notez que depuisy
devient zéro après le traitement d'un nœud, nous pouvons utiliser lay
cellule du nœud précédent pour gagner plus d'espace de travail.Cette configuration nous permet d'éviter de calculer explicitement la profondeur maximale pendant la phase d'initialisation; l'
y
indicateur est propagé en arrière pour mettre à jour lesp
cellules en conséquence.Il y a une
-1
cellule à gauche des nœuds pour faciliter la navigation, et il y a une cellule à droite des nœuds qui permet de savoir si nous avons encore imprimé la dernière ligne.la source
PHP + HTML, non concurrent (
170141135130 octets)enregistré 29 octets inspiré par SteeveDroz
pas en compétition car ce n’est pas une sortie ascii et parce que je laisse le navigateur faire tout le travail intéressant
la source
<b>
balises au lieu de<div>
et vous n'avez pas besoin de spécifier la couleur duborder
. (Économie de 9 octets)<b>
, je peux également supprimer l'white-space
attribut, économisant encore 19 octets. génial! Et je peux remplacerpadding
parmargin
JavaScript (ES6), 221
Une fonction non récursive renvoyant un tableau de chaînes (utilisant toujours une sous-fonction récursive à l'intérieur)
Cela fonctionne en 2 étapes.
Étape 1: créez récursivement une représentation sous forme de chaîne du tableau d'entrée imbriqué. Exemple:
[[[1, 2, 3], [],[4, 5]], [6, 7, 8]]
->"OOO1 2 3,,4 5C,6 7 8CC"
O
etC
marquez le sous-tableau ouvert et fermé. Les sous-tableaux numériques simples sont rendus avec les éléments séparés par un espace, tandis que si les membres du tableau sont des sous-tableaux, ils sont séparés par des virgules. Cette chaîne garde une trace de la structure à plusieurs niveaux du tableau d'entrée, tandis que je peux obtenir la ligne du milieu de la sortie en remplaçant simplementOC,
par|
. Lors de la construction récursive de cette chaîne temporaire, je trouve également le niveau de profondeur maximum et initialise un tableau de chaînes vides qui contiendra la moitié supérieure de la sortie.Remarque: la boîte externe est délicate, j'imbrique l'entrée dans un autre tableau externe, puis j'ai supprimé la première ligne de sortie qui n'est pas nécessaire
Étape 2: scannez la chaîne temporaire et générez la sortie
Maintenant, j'ai un tableau de chaînes vides, une pour chaque niveau. Je scanne la chaîne de temp, en gardant une trace du niveau actuel, qui augmente pour chacun
O
et diminue pour chacunC
. Je visualise ceci comme ça:Le plus le monte et descend suit le niveau actuel
Pour chaque caractère, j'ajoute un caractère à chaque ligne de sortie, en suivant les règles:
- si chiffre ou espace, mettez un '-' au niveau actuel et en dessous, mettez un espace au dessus
- sinon, mettez un '+' au niveau actuel, mettez un «-» si ci-dessous et mettez un «|» si au-dessus
Pendant le scan temporaire, je construis également la rangée du milieu en remplaçant
OC,
par|
À la fin de cette étape, j'ai la moitié supérieure et la rangée du milieu, je n'ai qu'à refléter le haut pour obtenir la moitié inférieure et j'ai terminé
Moins de golf, code commenté
)
Tester
la source
Rubis,
245241 octetsLes frais généraux nécessaires pour tout emballer dans des boîtes ainsi que tout aligner sont assez lourds ...
Génère des tableaux de chaînes, avec une chaîne par ligne, conformément aux spécifications. Aligné en bas au lieu des exemples de cas de test alignés en haut car il enregistre 1 octet.
Essayez-le en ligne!
la source
PHP, 404 octets
Toutes les solutions fonctionnent avec une profondeur maximale du tableau inférieure à 10. pour des valeurs supérieures, la profondeur doit être stockée dans un tableau et non dans une chaîne.
Étendu
pour 425 octets, nous pouvons le faire avec REGEX
Étendu
455 octets pour une solution récursive
Étendu
la source
$j!="]"?:$c--;
->$c-=$j=="]";
(-2). 2)($l=="]"?"":" ")
->" "[$l==$j]
(-5). Substitutions très probablement similaires dans la deuxième boucle. 3)if($r!=""){$n.=$r;$d.=+$c;}
->$n.=$r;if($r>"")$d.=+$c;
(-3). 4)$l=$j;$j!="["?:$c++;
->$c+="["==$l=$j;
(-5). 5)$x=0
n'est pas nécessaire (-4). 6)for($y=0;$y<$m;$y++)
->for($y=$m;$y--;)
(-4). 7)join("\n",$z),"\n$n\n".(join("\n",array_reverse($z)));
->join("\n",array_merge($z,[$n],array_reverse($z)));
(-4) 8) espaces inutiles:foreach($e[0]as$f)
(-1)($j==",")
(-2). 10)if($r>"")$d.=+$c;
->$d.=$r>""?+$c:"";
(-0)$d.=$l?$t;
est obsolète (-10) 2)$s.=$l?"|":"";return$s;
->return$s."|"[$l];
(-6). 3) accolades obsolètes{$e=v($v,$t+1,$k+1==$c);}
(-2). 4){$e=$v." "[$k+1==$c];$d.=str_pad("",strlen($e),$t+1);}
->$d.=str_pad("",strlen($e=$v." "[$k+1==$c]),$t+1);
(-5).