Інтерфейси користувача 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. Вертикальний список. Містить один або кілька елементів, які розташовані одна над одною вертикально і ліворуч по горизонталі.

Кожен елемент - це прямокутник.

Кожен елемент, крім свого вмісту, має властивість, яку називають базовою лінією . Базова лінія використовується для вирівнювання елементів по вертикалі: кожен елемент горизонтального списку вирівнюється таким чином, щоб їх основні лінії знаходилися на одній лінії. У наведеному нижче прикладі базова лінія містить символи aeg. Вихідні лінії три коробчатих елементів (0-індексовані) 1, 3і 2.

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

Визначаються базові лінії за такими правилами:

  1. Для текстових елементів перший рядок тексту є базовим, тобто. 0.
  2. Для елементів коробки базова лінія дорівнює 1 + базовій лінії підрядки.
  3. Для горизонтальних списків базовою лінією є максимальна базова лінія у списку ( 3у прикладі вище).
  4. Для вертикальних списків базовою лінією є базовий рядок елемента, який повинен бути вказаний у вході.

Вхідні дані

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

  1. Елемент рядка - це рядок: "..."
  2. Елемент поля - це список, першим елементом якого є "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
Солодкий Ісусе ... Це географічні місця знову.
Magic Octopus Urn

Я не зовсім впевнений, як працює базовий рівень, ви могли б пояснити це далі?
Стен Струм

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

@fergusq На першому пункті: "Для текстових елементів перший рядок тексту є базовою лінією, тобто 0.", це означає, що інші "базові лінії" зміщують текст вгору?
Стен Струм

@fergusq Baseline має бути правильним словом, IIRC він використовується і в описах для CSS flexbox
лише для ASCII

Відповіді:


10

Пітона 3 , 721 694 693 671 661 байт

Редагувати: Збережено 27 байт завдяки @Arnold Palmer та @Step Hen

Редагувати: збережено 1 байт

Редагувати: Збережено 22 байти завдяки @Arnold Palmer

Редагувати: збережено 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 Більше не я виправив проблему. :-)
Ерік Аутгольфер

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

Хороша робота. Ви виграєте виграш.
Олівер Ні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.