In dieser Herausforderung rendern wir ASCII-Benutzeroberflächen.
+----------------------+
|+-----------++-------+|
||<- Previous||Next ->||
|+-----------++-------+|
|== The title == |
| |
|Lorem ipsum dolor |
|sit amet... |
|+--------------+ |
||Post a comment| |
|+--------------+ |
|+-----------------+ |
||User X commented:| |
|| | |
||This is amazing! | |
|+-----------------+ |
|+-----------------+ |
||User Y commented:| |
|| | |
||lol | |
|+-----------------+ |
+----------------------+
Jede Zeichnung wie diese besteht aus einem Element , das Unterelemente enthalten kann. Die möglichen Elemente sind nachfolgend aufgeführt:
- Textelement. Enthält eine oder mehrere Textzeilen.
- Kastenelement. Enthält ein mit Rahmen umgebenes Unterelement. Die Ränder haben
+
s an den Ecken und-
s und|
an den Rändern. - Horizontale Liste. Enthält ein oder mehrere Elemente, die horizontal ausgerichtet sind.
- Vertikale Liste. Enthält ein oder mehrere Elemente, die vertikal übereinander und horizontal nach links ausgerichtet sind.
Jedes Element ist ein Rechteck.
Jedes Element verfügt zusätzlich zu seinem Inhalt über eine Eigenschaft namens baseline . Die Grundlinie wird verwendet, um die Elemente vertikal auszurichten: Jedes Element einer horizontalen Liste wird so ausgerichtet, dass sich ihre Grundlinien auf derselben Linie befinden. Im folgenden Beispiel enthält die Grundlinie Zeichen aeg
. Die Grundlinien der drei Kastenelemente (0-indizierte) 1
, 3
und 2
.
+-+
|c|+-+
+-+|d||f|
|a||e||g|
|b|+-+|h|
+-+ +-+
Die Baselines werden nach folgenden Regeln ermittelt:
- Bei Textelementen ist die erste Textzeile die Grundlinie, d. H.
0
. - Bei Box-Elementen ist die Grundlinie 1 + die Grundlinie des Unterelements.
- Bei horizontalen Listen ist die Grundlinie die maximale Grundlinie in der Liste (
3
im obigen Beispiel). - Bei vertikalen Listen ist die Grundlinie die Grundlinie eines Elements, die in der Eingabe angegeben werden muss.
Eingang
Die Eingabe ist eine Spezifikation einer Schnittstelle in einem bestimmten Format (z. B. Listen, JSON). Die Beispieleingaben haben das folgende Format:
- Ein String-Element ist ein String:
"..."
- Ein box-Element ist eine Liste, deren erstes Element ist
"b"
:["b", subelement]
- Eine horizontale Liste ist eine Liste, deren erstes Element ist
"h"
:["h", items...]
- Eine vertikale Liste ist eine Liste, deren erstes Element
"v"
und deren zweites Element die (0-indizierte) Nummer des Elements ist, dessen Grundlinie verwendet wird:["v", n, items...]
Ausgabe
Die Ausgabe muss die Elemente enthalten, die gemäß den oben angegebenen Regeln ausgerichtet wurden. Die Ausgabe kann stdout, eine Liste von Zeichenfolgen oder irgendetwas anderes sein, was von Bedeutung ist.
Wertung
Dies ist Code-Golf , es gelten die üblichen Regeln.
Testfälle
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
in derselben Zeile wie befindet e
, da sich beide in der Grundlinie ihrer Felder befinden. Ich bin mir nicht ganz sicher, ob "Grundlinie" das richtige Wort dafür ist, ich weiß nur, dass es auf dem Gebiet der Typografie für einen ähnlichen Zweck verwendet wird.