Nesse desafio, renderizamos interfaces de usuário Ascii.
+----------------------+
|+-----------++-------+|
||<- Previous||Next ->||
|+-----------++-------+|
|== The title == |
| |
|Lorem ipsum dolor |
|sit amet... |
|+--------------+ |
||Post a comment| |
|+--------------+ |
|+-----------------+ |
||User X commented:| |
|| | |
||This is amazing! | |
|+-----------------+ |
|+-----------------+ |
||User Y commented:| |
|| | |
||lol | |
|+-----------------+ |
+----------------------+
Cada desenho como este é feito de um elemento , que pode conter subelementos. Os possíveis elementos estão listados abaixo:
- Elemento de texto. Contém uma ou mais linhas de texto.
- Elemento de caixa. Contém um subelemento cercado por bordas. As bordas têm
+
s nos cantos-
es e|
nas bordas. - Lista horizontal. Contém um ou mais elementos alinhados horizontalmente.
- Lista vertical. Contém um ou mais elementos alinhados um sobre o outro verticalmente e à esquerda horizontalmente.
Todo elemento é um retângulo.
Cada elemento, além de seu conteúdo, possui uma propriedade chamada linha de base . A linha de base é usada para alinhar os elementos verticalmente: todos os elementos de uma lista horizontal são alinhados de modo que suas linhas de base estejam na mesma linha. No exemplo abaixo, a linha de base contém caracteres aeg
. As linhas de base dos três elementos de caixa são (0-indexada) 1
, 3
e 2
.
+-+
|c|+-+
+-+|d||f|
|a||e||g|
|b|+-+|h|
+-+ +-+
As linhas de base são determinadas com as seguintes regras:
- Para elementos de texto, a primeira linha do texto é a linha de base, ou seja.
0
. - Para elementos de caixa, a linha de base é 1 + a linha de base do subelemento.
- Para listas horizontais, a linha de base é a linha de base máxima na lista (
3
no exemplo acima). - Para listas verticais, a linha de base é a linha de base de um elemento, que deve ser especificada na entrada.
Entrada
A entrada é uma especificação de uma interface em algum formato (por exemplo, lists, json). As entradas de exemplo têm o seguinte formato:
- Um elemento de string é uma string:
"..."
- Um elemento de caixa é uma lista que é o primeiro elemento
"b"
:["b", subelement]
- Uma lista horizontal é uma lista que é o primeiro elemento
"h"
:["h", items...]
- Uma lista vertical é uma lista que é o primeiro elemento
"v"
e o segundo elemento é o número (indexado 0) do elemento que é a linha de base:["v", n, items...]
Resultado
A saída deve conter os elementos alinhados usando as regras especificadas acima. A saída pode ser stdout, uma lista de strings ou qualquer outra coisa significativa.
Pontuação
Isso é código-golfe , as regras usuais se aplicam.
Casos de teste
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
esteja na mesma linha que e
, pois ambas estão na linha de base de suas caixas. Não tenho certeza absoluta se "linha de base" é a palavra correta para isso, sei apenas que ela é usada no campo da tipografia para uma finalidade semelhante.