Пользовательские интерфейсы Ascii


18

В этом вызове мы отображаем пользовательские интерфейсы Ascii.

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

Каждый такой рисунок состоит из одного элемента , который может содержать подэлементы. Возможные элементы перечислены ниже:

  1. Текстовый элемент. Содержит одну или несколько строк текста.
  2. Коробочный элемент. Содержит один подэлемент, который окружен границами. Границы имеют +s по углам и -s и |по краям.
  3. Горизонтальный список. Содержит один или несколько элементов, которые выровнены по горизонтали.
  4. Вертикальный список. Содержит один или несколько элементов, которые выровнены друг с другом по вертикали и по горизонтали влево.

Каждый элемент - это прямоугольник.

Каждый элемент, в дополнение к его содержимому, имеет свойство, называемое baseline . Базовая линия используется для выравнивания элементов по вертикали: каждый элемент горизонтального списка выравнивается так, что их базовые линии находятся на одной линии. В приведенном ниже примере базовая линия содержит символы aeg. Исходные линии три коробчатых элементов (0-индексированные) 1, 3и 2.

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

Исходные условия определяются по следующим правилам:

  1. Для текстовых элементов первая строка текста является базовой линией, т.е. 0,
  2. Для элементов бокса базовая линия равна 1 + базовая линия субэлемента.
  3. Для горизонтальных списков базовая линия - это максимальная базовая линия в списке ( 3в примере выше).
  4. Для вертикальных списков базовая линия - это базовая линия элемента, которая должна быть указана во входных данных.

вход

Входные данные являются спецификацией интерфейса в некотором формате (например, lists, json). Входные данные примера имеют следующий формат:

  1. Строковый элемент - это строка: "..."
  2. Элемент box - это список, первый элемент которого "b":["b", subelement]
  3. Горизонтальный список - это список, первый элемент которого "h":["h", items...]
  4. Вертикальный список - это список, первым элементом которого является, "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    

2
Милый Иисус ... Это снова и снова.
Волшебная Осьминога Урна

Я не совсем уверен, как работает базовый уровень, не могли бы вы объяснить это дальше?
Стэн Струм

@StanStrum Базовая линия используется для выравнивания элементов в горизонтальном списке по вертикали. Базовые линии предметов должны совпадать, т.е. все они должны быть в одном физическом ряду. Например, в примере swcond первое поле было перемещено вниз, так что буква aнаходится на той же строке e, что и оба на базовой линии своих блоков. Я не совсем уверен, что «базовый уровень» является правильным словом для этого, я знаю только то, что он используется в области типографики для аналогичной цели.
fergusq

@fergusq В первом предложении: «Для текстовых элементов первая строка текста является базовой линией, т. е. 0.», означает ли это, что другие «базовые линии» смещают текст вверх?
Стэн Струм,

@fergusq Базовая линия должна быть правильным словом, IIRC также используется в описаниях для flexbox CSS
только для ASCII

Ответы:


10

Python 3 , 721 694 693 671 661 байт

Редактировать: 27 байтов сохранено благодаря @Арнольду Палмеру и @Step Hen

Редактировать: Сохранено 1 байт

Изменить: 22 байта сохранены благодаря @ Арнольд Палмер

Изменить: сохранено 10 байт

Это может быть, возможно, совсем немного

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]

Попробуйте онлайн


Вы также можете переместить все определения и P,L,M,R,K=[" "],len,max,range,mapв начало программы (переменные вверху), и вне F. Делая это, вы можете уменьшить его как минимум до 711 байтов. (Ссылка TIO слишком велика для публикации).
Арнольд Палмер

@ StepHen Больше нет, я исправил проблему. :-)
Эрик Outgolfer

До 671 . Пришлось использовать tinyurl, так как ссылка TIO была слишком длинной. Я переделал многие из ваших, mapтак как они могли быть заменены обычными материалами для понимания списка. Поскольку я был в состоянии обрезать так много maps, я также удалил Kпеременную, поскольку она стоила 2 байта.
Арнольд Палмер

Молодец. Вы выиграли награду.
Оливер Ни
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.