Giao diện người dùng Ascii


18

Trong thử thách này, chúng tôi kết xuất giao diện người dùng của Ascii.

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

Mỗi bản vẽ như thế này được tạo thành từ một yếu tố , có thể chứa các phần tử con. Các yếu tố có thể được liệt kê dưới đây:

  1. Yếu tố văn bản. Chứa một hoặc nhiều dòng văn bản.
  2. Phần tử hộp. Chứa một phân khu được bao quanh với biên giới. Các đường viền có +s ở các góc và -s và |ở các cạnh.
  3. Danh sách ngang. Chứa một hoặc nhiều yếu tố được sắp xếp theo chiều ngang.
  4. Danh sách dọc. Chứa một hoặc nhiều phần tử được xếp thẳng hàng với nhau theo chiều dọc và sang trái theo chiều ngang.

Mỗi phần tử là một hình chữ nhật.

Mỗi yếu tố, ngoài nội dung của nó, có một thuộc tính được gọi là đường cơ sở . Đường cơ sở được sử dụng để sắp xếp các phần tử theo chiều dọc: mọi phần tử của danh sách ngang được căn chỉnh sao cho đường cơ sở của chúng nằm trên cùng một dòng. Trong ví dụ dưới đây, đường cơ sở chứa các ký tự aeg. Đường cơ sở của ba yếu tố hộp là (0-lập chỉ mục) 1, 32.

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

Các đường cơ sở được xác định theo các quy tắc sau:

  1. Đối với các thành phần văn bản, dòng văn bản đầu tiên là đường cơ sở, nghĩa là. 0.
  2. Đối với các phần tử hộp, đường cơ sở là 1 + đường cơ sở của lớp con.
  3. Đối với danh sách ngang, đường cơ sở là đường cơ sở tối đa trong danh sách ( 3trong ví dụ trên).
  4. Đối với danh sách dọc, đường cơ sở là đường cơ sở của một yếu tố, phải được chỉ định trong đầu vào.

Đầu vào

Đầu vào là một đặc điểm kỹ thuật của một giao diện ở một số định dạng (ví dụ: list, json). Các ví dụ đầu vào có định dạng sau:

  1. Một phần tử chuỗi là một chuỗi: "..."
  2. Một phần tử hộp là một danh sách mà phần tử đầu tiên là "b":["b", subelement]
  3. Danh sách ngang là danh sách phần tử đầu tiên là "h":["h", items...]
  4. Danh sách dọc là danh sách phần tử đầu tiên là "v"và phần tử thứ hai là số (được lập chỉ mục 0) của phần tử mà đường cơ sở được sử dụng:["v", n, items...]

Đầu ra

Đầu ra phải chứa các thành phần được căn chỉnh bằng các quy tắc tôi đã chỉ định ở trên. Đầu ra có thể là thiết bị xuất chuẩn, một danh sách các chuỗi hoặc bất cứ thứ gì có ý nghĩa.

Chấm điểm

Đây là , các quy tắc thông thường được áp dụng.

Các trường hợp thử nghiệm

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
Jesus ngọt ngào ... Đó là địa chất một lần nữa.
Bạch tuộc ma thuật Urn

Tôi không chắc chắn làm thế nào đường cơ sở hoạt động, bạn có thể giải thích thêm?
Stan Strum

@StanStrum Đường cơ sở được sử dụng để sắp xếp các mục trong danh sách theo chiều ngang. Đường cơ sở của các mặt hàng phải phù hợp, tức là. tất cả chúng nên là cùng một hàng vật lý. Ví dụ, trong ví dụ swcond, hộp đầu tiên đã được di chuyển xuống dưới để chữ cái anằm cùng dòng với nhau e, vì cả hai đều nằm ở đường cơ sở của hộp. Tôi không hoàn toàn chắc chắn nếu "đường cơ sở" là từ chính xác cho điều này, tôi chỉ biết rằng nó được sử dụng trong lĩnh vực typography cho một mục đích tương tự.
fergusq

@fergusq Trong mệnh đề đầu tiên: "Đối với các thành phần văn bản, dòng văn bản đầu tiên là đường cơ sở, tức là 0.", điều này có nghĩa là các "đường cơ sở" khác đang dịch chuyển văn bản lên?
Stan Strum

@fergusq Đường cơ sở phải là từ chính xác, IIRC được sử dụng trong các mô tả cho CSS flexbox
ASCII - chỉ

Câu trả lời:


10

Python 3 , 721 694 693 671 661 byte

Chỉnh sửa: Đã lưu 27 byte do @Arnold Palmer@Step Hen

Chỉnh sửa: Đã lưu 1 byte

Chỉnh sửa: Đã lưu 22 byte nhờ @Arnold Palmer

Biên tập: Đã lưu 10 byte

Điều này có lẽ có thể được chơi golf một chút

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]

Dùng thử trực tuyến


Bạn cũng có thể di chuyển tất cả các định nghĩa và P,L,M,R,K=[" "],len,max,range,maplên đầu chương trình (các biến ở trên cùng) và bên ngoài F. Làm như vậy bạn có thể giảm xuống ít nhất 711 byte. (Liên kết TIO quá lớn để đăng).
Arnold Palmer

@StepHen Không còn nữa, tôi đã khắc phục sự cố. :-)
Erik the Outgolfer

Xuống 671 . Phải sử dụng tinyurl vì liên kết TIO quá dài. Tôi đã làm lại rất nhiều của bạn mapvì chúng có thể được thay thế bằng các công cụ hiểu danh sách bình thường. Bởi vì tôi có thể cắt bớt rất nhiều maps, tôi cũng loại bỏ Kbiến vì nó có giá 2 byte.
Arnold Palmer

Làm tốt lắm. Bạn giành được tiền thưởng.
Oliver Ni
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.