การเชื่อมต่อผู้ใช้ 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, และ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|
+-+   +-+

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

ฉันไม่แน่ใจว่าพื้นฐานทำงานอย่างไรคุณช่วยอธิบายเพิ่มเติมได้ไหม
Stan Strum

@StanStrum พื้นฐานจะใช้ในการจัดตำแหน่งรายการในรายการแนวนอน เส้นเขตแดนของรายการควรตรงกันเช่น พวกเขาควรจะเป็นแถวที่มีอยู่จริง ตัวอย่างเช่นในตัวอย่าง swcond ช่องแรกถูกเลื่อนลงเพื่อให้ตัวอักษรaอยู่ในบรรทัดเดียวกันขณะeที่ทั้งคู่อยู่ที่พื้นฐานของกล่อง ฉันไม่แน่ใจว่า "baseline" เป็นคำที่ถูกต้องสำหรับเรื่องนี้หรือไม่ฉันรู้เพียงว่ามันถูกใช้ในด้านการพิมพ์เพื่อจุดประสงค์ที่คล้ายกัน
fergusq

@fergusq ในประโยคแรก: "สำหรับองค์ประกอบข้อความบรรทัดแรกของข้อความคือพื้นฐานคือ 0. " นี่หมายความว่า "เส้นเขตแดน" อื่น ๆ จะขยับข้อความขึ้นมา?
Stan Strum

@fergusq Baseline ควรเป็นคำที่ถูกต้อง IIRC มันถูกใช้ในคำอธิบายสำหรับ CSS flexbox ด้วย
ASCII- เท่านั้น

คำตอบ:


10

Python 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 ใหญ่เกินไปสำหรับโพสต์)
Arnold Palmer

@ ขั้นตอนไม่ได้อีกต่อไปฉันได้แก้ไขปัญหาแล้ว :-)
Erik the Outgolfer

ลงไปที่ 671 ต้องใช้ tinyurl เนื่องจากลิงก์ TIO ยาวเกินไป ฉันทำใหม่จำนวนมากของคุณmapเนื่องจากพวกเขาสามารถถูกแทนที่ด้วยรายการความเข้าใจปกติ เนื่องจากฉันสามารถตัดจำนวนมากmapออกไปได้ฉันจึงลบKตัวแปรออกเนื่องจากมันมีราคา 2 ไบต์
Arnold Palmer

ทำได้ดีมาก คุณชนะรางวัล
Oliver Ni
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.