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 quee
, 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.Respostas:
Python 3 ,
721694693671661 bytesEditar: salvou 27 bytes devido a @Arnold Palmer e @Step Hen
Editar: salvo 1 byte
Edit: salvou 22 bytes graças a @Arnold Palmer
Editar: salvou 10 bytes
Provavelmente isso poderia ser jogado bastante
Experimente online
fonte
P,L,M,R,K=[" "],len,max,range,map
para o topo do programa (variáveis na parte superior) e para fora deF
. Fazendo isso, você pode reduzi-lo a pelo menos 711 bytes. (Link TIO muito grande para postar).map
s, pois eles poderiam ser substituídos por coisas normais de compreensão de lista. Como consegui cortar tantosmap
s, também removi aK
variável, pois estava custando 2 bytes.