Antarmuka Pengguna Ascii

18

Dalam tantangan ini, kami membuat antarmuka pengguna Ascii.

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

Setiap gambar seperti ini terbuat dari satu elemen , yang dapat berisi sub bagian. Elemen yang mungkin tercantum di bawah ini:

  1. Elemen teks. Berisi satu atau lebih baris teks.
  2. Elemen kotak. Berisi satu subelemen yang dikelilingi dengan perbatasan. Perbatasan memiliki +s di sudut dan -s dan |di tepi.
  3. Daftar horisontal. Berisi satu atau lebih elemen yang disejajarkan secara horizontal.
  4. Daftar vertikal. Berisi satu atau lebih elemen yang disejajarkan satu sama lain secara vertikal dan ke kiri secara horizontal.

Setiap elemen adalah persegi panjang.

Setiap elemen, selain kontennya, memiliki properti yang disebut garis dasar . Baseline digunakan untuk menyelaraskan elemen secara vertikal: setiap elemen dari daftar horizontal disejajarkan sedemikian rupa sehingga garis dasarnya berada pada garis yang sama. Dalam contoh di bawah ini, garis dasar berisi karakter aeg. Garis dasar dari tiga elemen kotak adalah (0-diindeks) 1, 3dan 2.

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

Baseline ditentukan dengan aturan berikut:

  1. Untuk elemen teks, baris teks pertama adalah garis dasar, yaitu. 0.
  2. Untuk elemen kotak, garis dasar adalah 1 + garis dasar subelemen.
  3. Untuk daftar horizontal, garis dasar adalah garis dasar maksimum dalam daftar ( 3dalam contoh di atas).
  4. Untuk daftar vertikal, garis dasar adalah garis dasar elemen, yang harus ditentukan dalam input.

Memasukkan

Input adalah spesifikasi antarmuka dalam beberapa format (mis. Daftar, json). Input contoh memiliki format berikut:

  1. Elemen string adalah string: "..."
  2. Elemen kotak adalah daftar, elemen pertama adalah "b":["b", subelement]
  3. Daftar horizontal adalah daftar yang elemen pertamanya adalah "h":["h", items...]
  4. Daftar vertikal adalah daftar yang merupakan elemen pertama "v"dan elemen kedua adalah (0-diindeks) jumlah elemen yang digunakan baseline:["v", n, items...]

Keluaran

Output harus mengandung elemen yang diluruskan menggunakan aturan yang saya sebutkan di atas. Outputnya bisa stdout, daftar string atau apa pun yang bermakna.

Mencetak gol

Ini , aturan yang biasa berlaku.

Uji kasus

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    
fergusq
sumber
2
Ya Tuhan ... Ini geocities lagi.
Magic Octopus Mm
Saya tidak begitu yakin bagaimana baseline bekerja, bisakah Anda menjelaskannya lebih lanjut?
Stan Strum
@StanStrum Baseline digunakan untuk menyelaraskan item dalam daftar horizontal secara vertikal. Garis dasar item harus cocok, yaitu. mereka semua harus menjadi barisan fisik yang sama. Misalnya, dalam contoh swcond, kotak pertama telah dipindahkan ke bawah sehingga surat itu aberada di baris yang sama e, karena keduanya berada di garis dasar kotak mereka. Saya tidak sepenuhnya yakin apakah "garis dasar" adalah kata yang tepat untuk ini, saya hanya tahu itu digunakan dalam bidang tipografi untuk tujuan yang sama.
fergusq
@fergusq Pada klausa pertama: "Untuk elemen teks, baris pertama teks adalah garis dasar, yaitu. 0", apakah ini berarti "garis dasar" lainnya menggeser teks ke atas?
Stan Strum
@fergusq Baseline harus menjadi kata yang benar, IIRC juga digunakan dalam deskripsi untuk CSS flexbox
ASCII-only

Jawaban:

10

Python 3 , 721 694 693 671 661 byte

Sunting: Disimpan 27 byte karena @Arnold Palmer dan @Langkah Hen

Sunting: Disimpan 1 byte

Sunting: Disimpan 22 byte berkat @Arnold Palmer

Sunting: Disimpan 10 byte

Ini mungkin bisa golf sedikit

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]

Cobalah online

Halvard Hummel
sumber
Anda juga dapat memindahkan semua definisi dan P,L,M,R,K=[" "],len,max,range,mapke atas program (variabel di atas), dan di luar F. Dengan melakukan itu, Anda bisa mendapatkannya hingga setidaknya 711 byte. (TIO tautan terlalu besar untuk dikirim).
Arnold Palmer
@ LANGKAH Tidak lagi, saya sudah memperbaiki masalahnya. :-)
Erik the Outgolfer
Turun ke 671 . Harus menggunakan tinyurl karena tautan TIO terlalu panjang. Saya mengerjakan ulang banyak dari Anda mapkarena mereka dapat diganti dengan hal-hal pemahaman daftar normal. Karena saya dapat memangkas begitu banyak map, saya juga menghapus Kvariabel karena harganya 2 byte.
Arnold Palmer
Kerja bagus. Anda memenangkan hadiah.
Oliver Ni