W tym wyzwaniu renderujemy interfejsy użytkownika Ascii.
+----------------------+
|+-----------++-------+|
||<- Previous||Next ->||
|+-----------++-------+|
|== The title == |
| |
|Lorem ipsum dolor |
|sit amet... |
|+--------------+ |
||Post a comment| |
|+--------------+ |
|+-----------------+ |
||User X commented:| |
|| | |
||This is amazing! | |
|+-----------------+ |
|+-----------------+ |
||User Y commented:| |
|| | |
||lol | |
|+-----------------+ |
+----------------------+
Każdy taki rysunek składa się z jednego elementu , który może zawierać podelementy. Możliwe elementy są wymienione poniżej:
- Element tekstowy. Zawiera jeden lub więcej wierszy tekstu.
- Element pudełkowy. Zawiera jeden podelement otoczony granicami. Granice mają
+
s na rogach i-
s oraz|
na krawędziach. - Lista pozioma. Zawiera jeden lub więcej elementów, które są wyrównane w poziomie.
- Lista pionowa. Zawiera jeden lub więcej elementów, które są wyrównane względem siebie w pionie i do lewej w poziomie.
Każdy element jest prostokątem.
Każdy element, oprócz swojej zawartości, ma właściwość o nazwie linia bazowa . Linia bazowa służy do wyrównywania elementów w pionie: każdy element listy poziomej jest wyrównany w taki sposób, że ich linie bazowe znajdują się w tej samej linii. W poniższym przykładzie linia bazowa zawiera znaki aeg
. Linie podstawowe trzech elementów skrzynkowych są (0-indeksowane) 1
, 3
i 2
.
+-+
|c|+-+
+-+|d||f|
|a||e||g|
|b|+-+|h|
+-+ +-+
Wartości bazowe są ustalane według następujących zasad:
- W przypadku elementów tekstowych pierwszy wiersz tekstu jest linią bazową, tj.
0
. - W przypadku elementów pudełkowych linia bazowa wynosi 1 + linia bazowa podelementu.
- W przypadku list poziomych linia bazowa jest maksymalną linią bazową na liście (
3
w powyższym przykładzie). - W przypadku list pionowych linia bazowa jest linią bazową elementu, którą należy określić na wejściu.
Wejście
Dane wejściowe to specyfikacja interfejsu w pewnym formacie (np. Listy, json). Przykładowe dane wejściowe mają następujący format:
- Element ciąg jest ciągiem:
"..."
- Element box to lista, której pierwszym elementem jest
"b"
:["b", subelement]
- Lista pozioma to lista, której pierwszym elementem jest
"h"
:["h", items...]
- Lista pionowa jest listą, której jest pierwszy element,
"v"
a drugim elementem jest (indeksowany 0) numer elementu, którego podstawa jest używana:["v", n, items...]
Wynik
Dane wyjściowe muszą zawierać elementy wyrównane przy użyciu reguł określonych powyżej. Wyjściem może być standardowe wyjście, lista ciągów znaków lub cokolwiek innego znaczącego.
Punktacja
To jest golf golfowy , obowiązują zwykłe zasady.
Przypadki testowe
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
w tej samej linii coe
, ponieważ oba znajdują się na linii podstawowej swoich pól. Nie jestem do końca pewien, czy „baseline” jest właściwym słowem do tego, wiem tylko, że jest ono używane w dziedzinie typografii do podobnego celu.Odpowiedzi:
Python 3 ,
721694693671661 bajtówEdycja: Zapisano 27 bajtów dzięki @Arnold Palmer i @Step Hen
Edycja: Zapisano 1 bajt
Edytować: Zaoszczędź 22 bajty dzięki @Arnold Palmer
Edycja: Zapisano 10 bajtów
Prawdopodobnie można to trochę pograć w golfa
Wypróbuj online
źródło
P,L,M,R,K=[" "],len,max,range,map
na górę programu (zmienne u góry) i pozaF
. W ten sposób możesz sprowadzić go do co najmniej 711 bajtów. (Link TIO jest zbyt duży, aby opublikować).map
ponieważ można je zastąpić zwykłymi listami. Ponieważ byłem w stanie przyciąć tak wielemap
s, usunąłem równieżK
zmienną, ponieważ kosztowała 2 bajty.