Interfacce utente Ascii


18

In questa sfida, eseguiamo il rendering delle interfacce utente Ascii.

+----------------------+
|+-----------++-------+|
||<- Previous||Next ->||
|+-----------++-------+|
|== The title ==       |
|                      |
|Lorem ipsum dolor     |
|sit amet...           |
|+--------------+      |
||Post a comment|      |
|+--------------+      |
|+-----------------+   |
||User X commented:|   |
||                 |   |
||This is amazing! |   |
|+-----------------+   |
|+-----------------+   |
||User Y commented:|   |
||                 |   |
||lol              |   |
|+-----------------+   |
+----------------------+

Ogni disegno come questo è composto da un elemento , che può contenere sottoelementi. I possibili elementi sono elencati di seguito:

  1. Elemento di testo. Contiene una o più righe di testo.
  2. Elemento scatola. Contiene un sottoelemento circondato da bordi. I bordi hanno +s agli angoli e -s e |ai bordi.
  3. Elenco orizzontale Contiene uno o più elementi allineati orizzontalmente.
  4. Elenco verticale Contiene uno o più elementi allineati uno sull'altro in verticale e a sinistra in orizzontale.

Ogni elemento è un rettangolo.

Ogni elemento, oltre al suo contenuto, ha una proprietà chiamata baseline . La linea di base viene utilizzata per allineare gli elementi verticalmente: ogni elemento di un elenco orizzontale è allineato in modo tale che le loro linee di base siano sulla stessa linea. Nell'esempio seguente, la linea di base contiene caratteri aeg. Le linee di base dei tre elementi scatolari sono (0-indicizzato) 1, 3e 2.

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

Le linee di base sono determinate con le seguenti regole:

  1. Per gli elementi di testo, la prima riga di testo è la linea di base, vale a dire. 0.
  2. Per gli elementi box, la linea di base è 1 + la linea di base del sottoelemento.
  3. Per gli elenchi orizzontali, la linea di base è la linea di base massima nell'elenco ( 3nell'esempio sopra).
  4. Per gli elenchi verticali, la linea di base è la linea di base di un elemento, che deve essere specificato nell'input.

Ingresso

L'input è una specifica di un'interfaccia in qualche formato (es. Liste, json). Gli input di esempio hanno il seguente formato:

  1. Un elemento stringa è una stringa: "..."
  2. Un elemento box è un elenco il cui primo elemento è "b":["b", subelement]
  3. Un elenco orizzontale è un elenco il cui primo elemento è "h":["h", items...]
  4. Un elenco verticale è un elenco che è il primo elemento "v"e il secondo elemento è il numero (indicizzato 0) dell'elemento che viene utilizzato come linea di base:["v", n, items...]

Produzione

L'output deve contenere gli elementi allineati utilizzando le regole specificate sopra. L'output può essere stdout, un elenco di stringhe o qualsiasi altra cosa significativa.

punteggio

Questo è , si applicano le solite regole.

Casi 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    

2
Dolce Gesù ... Sono di nuovo geocità.
Magic Octopus Urn,

Non sono sicuro di come funzioni la linea di base, potresti spiegarlo ulteriormente?
Stan Strum,

@StanStrum La linea di base viene utilizzata per allineare gli elementi in un elenco orizzontale verticalmente. Le linee di base degli articoli devono corrispondere, ad es. dovrebbero essere tutti la stessa riga fisica. Ad esempio, nell'esempio swcond la prima casella è stata spostata verso il basso in modo che la lettera asi trovi sulla stessa riga di e, poiché sono entrambi alla base delle rispettive caselle. Non sono del tutto sicuro che "baseline" sia la parola corretta per questo, so solo che è usato nel campo della tipografia per uno scopo simile.
Fergusq,

@fergusq Nella prima clausola: "Per gli elementi di testo, la prima riga di testo è la linea di base, ovvero 0.", significa che le altre "linee di base" stanno spostando il testo verso l'alto?
Stan Strum,

@fergusq Baseline dovrebbe essere la parola corretta, IIRC è usato anche nelle descrizioni per CSS flexbox
solo ASCII

Risposte:


10

Python 3 , 721 694 693 671 661 byte

Modifica: salvato 27 byte grazie a @Arnold Palmer e @Step Hen

Modifica: 1 byte salvato

Modifica: salvato 22 byte grazie a @Arnold Palmer

Modifica: salvato 10 byte

Questo potrebbe probabilmente essere giocato un po 'a 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]

Provalo online


È inoltre possibile spostare tutte le definizioni e P,L,M,R,K=[" "],len,max,range,mapnella parte superiore del programma (variabili nella parte superiore) e all'esterno di F. In questo modo è possibile farlo scendere ad almeno 711 byte. (Link TIO troppo grande per pubblicare).
Arnold Palmer,

@StepHen Non più, ho risolto il problema. :-)
Erik the Outgolfer

Fino a 671 . Ho dovuto usare tinyurl poiché il collegamento TIO era troppo lungo. Ho rielaborato molti dei tuoi in mapquanto potrebbero essere sostituiti con normali elementi di comprensione dell'elenco. Dato che sono stato in grado di tagliare così tanti messaggi map, ho anche rimosso la Kvariabile poiché costava 2 byte.
Arnold Palmer,

Buon lavoro. Vinci la taglia.
Oliver Ni
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.