Dans ce défi, nous rendons les interfaces utilisateur Ascii.
+----------------------+
|+-----------++-------+|
||<- Previous||Next ->||
|+-----------++-------+|
|== The title == |
| |
|Lorem ipsum dolor |
|sit amet... |
|+--------------+ |
||Post a comment| |
|+--------------+ |
|+-----------------+ |
||User X commented:| |
|| | |
||This is amazing! | |
|+-----------------+ |
|+-----------------+ |
||User Y commented:| |
|| | |
||lol | |
|+-----------------+ |
+----------------------+
Chaque dessin comme celui-ci est composé d'un élément , qui peut contenir des sous-éléments. Les éléments possibles sont listés ci-dessous:
- Élément de texte. Contient une ou plusieurs lignes de texte.
- Élément de boîte. Contient un sous-élément entouré de bordures. Les bordures ont
+
s aux coins et-
s et|
aux bords. - Liste horizontale. Contient un ou plusieurs éléments alignés horizontalement.
- Liste verticale. Contient un ou plusieurs éléments alignés verticalement et à gauche horizontalement.
Chaque élément est un rectangle.
Chaque élément, en plus de son contenu, possède une propriété appelée baseline . La ligne de base est utilisée pour aligner les éléments verticalement: chaque élément d'une liste horizontale est aligné de telle sorte que leurs lignes de base sont sur la même ligne. Dans l'exemple ci-dessous, la ligne de base contient des caractères aeg
. Les lignes de base des trois éléments de boîtier sont (0 indexée) 1
, 3
et 2
.
+-+
|c|+-+
+-+|d||f|
|a||e||g|
|b|+-+|h|
+-+ +-+
Les lignes de base sont déterminées avec les règles suivantes:
- Pour les éléments de texte, la première ligne de texte est la ligne de base, c'est-à-dire.
0
. - Pour les éléments de boîte, la ligne de base est 1 + la ligne de base du sous-élément.
- Pour les listes horizontales, la ligne de base est la ligne de base maximale dans la liste (
3
dans l'exemple ci-dessus). - Pour les listes verticales, la ligne de base est la ligne de base d'un élément, qui doit être spécifiée dans l'entrée.
Contribution
L'entrée est une spécification d'une interface dans un certain format (par exemple, listes, json). Les exemples d'entrées ont le format suivant:
- Un élément de chaîne est une chaîne:
"..."
- Un élément box est une liste qui est le premier élément
"b"
:["b", subelement]
- Une liste horizontale est une liste dont le premier élément est
"h"
:["h", items...]
- Une liste verticale est une liste qui est le premier élément
"v"
et le deuxième élément est le numéro (indexé 0) de l'élément qui utilise la ligne de base:["v", n, items...]
Production
La sortie doit contenir les éléments alignés en utilisant les règles que j'ai spécifiées ci-dessus. La sortie peut être stdout, une liste de chaînes ou tout autre élément significatif.
Notation
C'est du code-golf , les règles habituelles s'appliquent.
Cas de test
1
["b", ["v", 0, ["h", ["b", "<- Previous"], ["b", "Next ->"]], "== The title ==\n\nLorem ipsum dolor\nsit amet...", ["b", "Post a comment"], ["b", "User X commented:\n\nThis is amazing!"], ["b", "User Y commented:\n\nlol"]]]
+----------------------+
|+-----------++-------+|
||<- Previous||Next ->||
|+-----------++-------+|
|== The title == |
| |
|Lorem ipsum dolor |
|sit amet... |
|+--------------+ |
||Post a comment| |
|+--------------+ |
|+-----------------+ |
||User X commented:| |
|| | |
||This is amazing! | |
|+-----------------+ |
|+-----------------+ |
||User Y commented:| |
|| | |
||lol | |
|+-----------------+ |
+----------------------+
2
["h", ["b", ["v", 0, "a", "b"]], ["b", ["v", 2, "c", "d", "e"]], ["b", ["v", 1, "f", "g", "h"]]]
+-+
|c|+-+
+-+|d||f|
|a||e||g|
|b|+-+|h|
+-+ +-+
3
["h", ["b", ["v", 0, ["b", ["h", "a\nb", "c"]], "d", "e", ["h", ["h", "f"], ["b", ["h", "g"]], "h"]]], ["b", "ijk\nl\nmn\no"], ["v", 2, ["b", "pqrst"], ["b", "uv\nw"], ["b", "x"]], ["b", ["b", ["b", "yz"]]]]
+-----+
|pqrst|
+-----+
+--+
|uv|
|w | +------+
+-----+ +--+ |+----+|
|+--+ |+---++-+ ||+--+||
||ac| ||ijk||x| |||yz|||
||b | ||l |+-+ ||+--+||
|+--+ ||mn | |+----+|
|d ||o | +------+
|e |+---+
| +-+ |
|f|g|h|
| +-+ |
+-----+
4
["h", "a * b = ", ["v", 0, "a + a + ... + a", "\\_____________/", " b times"]]
a * b = a + a + ... + a
\_____________/
b times
a
trouve sur la même ligne que e
, car elles se trouvent toutes les deux sur la ligne de base de leurs cases. Je ne suis pas tout à fait sûr si "baseline" est le mot correct pour cela, je sais seulement qu'il est utilisé dans le domaine de la typographie dans un but similaire.