아스키 사용자 인터페이스 정렬 된 하나

이 과제에서는 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가 |있습니다.
  3. 가로 목록. 가로로 정렬 된 하나 이상의 요소를 포함합니다.
  4. 수직 목록. 서로 수직으로 수평으로 정렬 된 하나 이상의 요소를 포함합니다.

모든 요소는 사각형입니다.

각 요소에는 내용 외에도 baseline 이라는 속성이 있습니다. 기준선은 요소를 수직으로 정렬하는 데 사용됩니다. 가로 목록의 모든 요소는 기준선이 동일한 선에 있도록 정렬됩니다. 아래 예에서 기준선은 문자를 포함합니다 aeg. 세 상자 요소의 기준선은 (0- 인덱싱 됨 1) 32입니다.

   +-+
   |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|
+-+   +-+

["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



답변

파이썬 3 , 721 694 693 671 661 바이트

편집 : @Arnold Palmer@Step Hen 로 인해 27 바이트가 저장되었습니다 .

편집 : 1 바이트 저장

편집 : @Arnold Palmer 덕분에 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]

온라인으로 사용해보십시오


답변