В этом вызове мы отображаем пользовательские интерфейсы Ascii.
+----------------------+
|+-----------++-------+|
||<- Previous||Next ->||
|+-----------++-------+|
|== The title == |
| |
|Lorem ipsum dolor |
|sit amet... |
|+--------------+ |
||Post a comment| |
|+--------------+ |
|+-----------------+ |
||User X commented:| |
|| | |
||This is amazing! | |
|+-----------------+ |
|+-----------------+ |
||User Y commented:| |
|| | |
||lol | |
|+-----------------+ |
+----------------------+
Каждый такой рисунок состоит из одного элемента , который может содержать подэлементы. Возможные элементы перечислены ниже:
- Текстовый элемент. Содержит одну или несколько строк текста.
- Коробочный элемент. Содержит один подэлемент, который окружен границами. Границы имеют
+
s по углам и-
s и|
по краям. - Горизонтальный список. Содержит один или несколько элементов, которые выровнены по горизонтали.
- Вертикальный список. Содержит один или несколько элементов, которые выровнены друг с другом по вертикали и по горизонтали влево.
Каждый элемент - это прямоугольник.
Каждый элемент, в дополнение к его содержимому, имеет свойство, называемое baseline . Базовая линия используется для выравнивания элементов по вертикали: каждый элемент горизонтального списка выравнивается так, что их базовые линии находятся на одной линии. В приведенном ниже примере базовая линия содержит символы aeg
. Исходные линии три коробчатых элементов (0-индексированные) 1
, 3
и 2
.
+-+
|c|+-+
+-+|d||f|
|a||e||g|
|b|+-+|h|
+-+ +-+
Исходные условия определяются по следующим правилам:
- Для текстовых элементов первая строка текста является базовой линией, т.е.
0
, - Для элементов бокса базовая линия равна 1 + базовая линия субэлемента.
- Для горизонтальных списков базовая линия - это максимальная базовая линия в списке (
3
в примере выше). - Для вертикальных списков базовая линия - это базовая линия элемента, которая должна быть указана во входных данных.
вход
Входные данные являются спецификацией интерфейса в некотором формате (например, lists, json). Входные данные примера имеют следующий формат:
- Строковый элемент - это строка:
"..."
- Элемент box - это список, первый элемент которого
"b"
:["b", subelement]
- Горизонтальный список - это список, первый элемент которого
"h"
:["h", items...]
- Вертикальный список - это список, первым элементом которого является,
"v"
а вторым элементом является (индексированный 0) номер элемента, для которого используется базовая линия:["v", n, items...]
Выход
Вывод должен содержать элементы, выровненные по правилам, указанным выше. Вывод может быть stdout, список строк или что-либо еще значащим.
счет
Это код-гольф , применяются обычные правила.
Контрольные примеры
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
находится на той же строке e
, что и оба на базовой линии своих блоков. Я не совсем уверен, что «базовый уровень» является правильным словом для этого, я знаю только то, что он используется в области типографики для аналогичной цели.