Interfaces de usuario Ascii

18

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:

  1. Elemento de texto Contiene una o más líneas de texto.
  2. Elemento de caja Contiene un subelemento rodeado de bordes. Los bordes tienen +s en las esquinas -ys y |en los bordes.
  3. Lista horizontal Contiene uno o más elementos que están alineados horizontalmente.
  4. 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, 3y 2.

   +-+   
   |c|+-+
+-+|d||f|
|a||e||g|
|b|+-+|h|
+-+   +-+

Las líneas de base se determinan con las siguientes reglas:

  1. Para elementos de texto, la primera línea de texto es la línea de base, es decir. 0.
  2. Para elementos de cuadro, la línea base es 1 + la línea base del subelemento.
  3. Para listas horizontales, la línea base es la línea base máxima en la lista ( 3en el ejemplo anterior).
  4. 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:

  1. Un elemento de cadena es una cadena: "..."
  2. Un elemento de cuadro es una lista cuyo primer elemento es "b":["b", subelement]
  3. Una lista horizontal es una lista cuyo primer elemento es "h":["h", items...]
  4. 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 , 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    
fergusq
fuente
2
Dulce Jesús ... Son geocities de nuevo.
Urna mágica del pulpo
No estoy muy seguro de cómo funciona la línea de base, ¿podría explicarlo más?
Stan Strum
@StanStrum La línea de base se usa para alinear los elementos en una lista horizontal verticalmente. Las líneas de base de los elementos deben coincidir, es decir. todos deberían ser la misma fila física. Por ejemplo, en el segundo ejemplo, el primer cuadro se ha movido hacia abajo para que la letra aesté en la misma línea e, 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.
fergusq
@fergusq En la primera cláusula: "Para los elementos de texto, la primera línea de texto es la línea de base, es decir, 0.", ¿significa esto que las otras "líneas de base" están desplazando el texto hacia arriba?
Stan Strum
@fergusq La línea de base debe ser la palabra correcta, IIRC también se usa en las descripciones para CSS flexbox
solo ASCII

Respuestas:

10

Python 3 , 721 694 693 671 661 bytes

Editar: 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

L,M,R,e=len,max,range,lambda t:([list(r)+[" "]*(M(map(L,t.split("\n")))-L(r))for r in t.split("\n")],0)if str==type(t)else b(t)if"h">t[0]else h(t)if"v">t[0]else v(t);F=lambda t:"\n".join(map("".join,e(t)[0]))
def h(t):
	t=[e(r)for r in t[1:]];Z=M(s[1]for s in t);X=M(L(s[0])-s[1]for s in t)+Z;u=[[]for i in R(X)]
	for a,b in t:u=[u[j]+[Z-b<=j<L(a)+Z-b and a[j-Z+b][i]or" "for i in R(L(a[0]))]for j in R(X)]
	return u,Z
def b(t):t,b=e(t[1]);u=[["+",*"-"*L(t[0]),"+"]];return u+[["|"]+r+["|"]for r in t]+u,1+b
def v(t):w=[e(r)for r in t[2:]];return[a[i]+[" "]*(M(L(a[0])for a,d in w)-L(a[i]))for a,c in w for i in R(L(a))],sum(L(x[0])for x in w[:t[1]])+w[t[1]][1]

Pruébalo en línea

Halvard Hummel
fuente
También puede mover todas las definiciones P,L,M,R,K=[" "],len,max,range,mapa la parte superior del programa (variables en la parte superior) y fuera de F. Al hacerlo, puede reducirlo a al menos 711 bytes. (Enlace TIO demasiado grande para publicar).
Arnold Palmer
@StepHen Ya no, he solucionado el problema. :-)
Erik the Outgolfer
Abajo a 671 . Tuve que usar tinyurl ya que el enlace TIO era demasiado largo. Volví a trabajar muchos de tus mapcorreos electrónicos ya que podrían reemplazarse con cosas normales de comprensión de listas. Como pude recortar tantos maps, también eliminé la Kvariable ya que costaba 2 bytes.
Arnold Palmer
Buen trabajo. Tú ganas la recompensa.
Oliver Ni