En este desafío, representamos las interfaces de usuario Ascii.
+----------------------+
|+-----------++-------+|
||<- Previous||Next ->||
|+-----------++-------+|
|== The title == |
| |
|Lorem ipsum dolor |
|sit amet... |
|+--------------+ |
||Post a comment| |
|+--------------+ |
|+-----------------+ |
||User X commented:| |
|| | |
||This is amazing! | |
|+-----------------+ |
|+-----------------+ |
||User Y commented:| |
|| | |
||lol | |
|+-----------------+ |
+----------------------+
Cada dibujo como este está hecho de un elemento , que puede contener subelementos. Los posibles elementos se enumeran a continuación:
- Elemento de texto Contiene una o más líneas de texto.
- Elemento de caja Contiene un subelemento rodeado de bordes. Los bordes tienen
+
s en las esquinas-
ys y|
en los bordes. - Lista horizontal Contiene uno o más elementos que están alineados horizontalmente.
- Lista vertical Contiene uno o más elementos que están alineados unos sobre otros verticalmente y hacia la izquierda horizontalmente.
Cada elemento es un rectángulo.
Cada elemento, además de su contenido, tiene una propiedad llamada línea base . La línea de base se usa para alinear los elementos verticalmente: cada elemento de una lista horizontal está alineado de modo que sus líneas de base estén en la misma línea. En el ejemplo a continuación, la línea base contiene caracteres aeg
. Las líneas de base de los tres elementos de caja son (0-indexada) 1
, 3
y 2
.
+-+
|c|+-+
+-+|d||f|
|a||e||g|
|b|+-+|h|
+-+ +-+
Las líneas de base se determinan con las siguientes reglas:
- Para elementos de texto, la primera línea de texto es la línea de base, es decir.
0
. - Para elementos de cuadro, la línea base es 1 + la línea base del subelemento.
- Para listas horizontales, la línea base es la línea base máxima en la lista (
3
en el ejemplo anterior). - Para las listas verticales, la línea base es la línea base de un elemento, que debe especificarse en la entrada.
Entrada
La entrada es una especificación de una interfaz en algún formato (por ejemplo, listas, json). Las entradas de ejemplo tienen el siguiente formato:
- Un elemento de cadena es una cadena:
"..."
- Un elemento de cuadro es una lista cuyo primer elemento es
"b"
:["b", subelement]
- Una lista horizontal es una lista cuyo primer elemento es
"h"
:["h", items...]
- Una lista vertical es una lista que es el primer elemento
"v"
y el segundo elemento es el número (indexado a 0) del elemento que se utiliza esa línea base:["v", n, items...]
Salida
La salida debe contener los elementos alineados usando las reglas que especifiqué anteriormente. La salida puede ser estándar, una lista de cadenas o cualquier otra cosa significativa.
Puntuación
Este es el código de golf , se aplican las reglas habituales.
Casos de prueba
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 4
["h", "a * b = ", ["v", 0, "a + a + ... + a", "\\_____________/", " b times"]]
a * b = a + a + ... + a
\_____________/
b times
a
esté en la misma líneae
, ya que ambos están en la línea de base de sus cuadros. No estoy completamente seguro de si "línea de base" es la palabra correcta para esto, solo sé que se usa en el campo de la tipografía para un propósito similar.Respuestas:
Python 3 ,
721694693671661 bytesEditar: se guardaron 27 bytes debido a @Arnold Palmer y @Step Hen
Editar: guardado 1 byte
Editar: Guardado 22 bytes gracias a @Arnold Palmer
Editar: guardado 10 bytes
Esto probablemente podría jugarse bastante golf
Pruébalo en línea
fuente
P,L,M,R,K=[" "],len,max,range,map
a la parte superior del programa (variables en la parte superior) y fuera deF
. Al hacerlo, puede reducirlo a al menos 711 bytes. (Enlace TIO demasiado grande para publicar).map
correos electrónicos ya que podrían reemplazarse con cosas normales de comprensión de listas. Como pude recortar tantosmap
s, también eliminé laK
variable ya que costaba 2 bytes.