การแสดงผลกล่อง ASCII


11

งาน

งานของคุณคือการเขียนโปรแกรมที่จะส่งออกกล่อง ASCII ที่สถานที่ที่ระบุโดยการป้อนข้อมูล

อินพุต

คุณจะได้รับรายการหมายเลข รูปแบบที่นี่เป็นบิตที่มีความยืดหยุ่นในการที่คุณสามารถใช้ deliminator คุณต้องการใด ๆ (เช่น1,2,3,4, 1 2 3 4, [1,2,3,4]) รายการอยู่ในกลุ่ม 4 และระบุxywhของแต่ละกล่อง ความกว้างและความสูงของแต่ละกล่องจะมีอย่างน้อย 2 xและwidthจากซ้ายไปขวา yและจากheightบนลงล่าง

เอาท์พุต

การแสดงผลสามารถคิดได้ว่าเป็นขวาไปซ้ายโดยมีกล่องที่วาดบนขวาก่อนและทุกช่องหลังจากนั้นจบลง อนุญาตให้ใช้ช่องว่างต่อท้ายเช่นเดียวกับบรรทัดใหม่ต่อท้ายหนึ่งบรรทัด

วิธีจัดการกับกล่องที่ทับซ้อนกัน

กล่องทางด้านซ้ายของอินพุตเป็นกล่องด้านบนและไม่มีอะไรจะซ้อนทับกัน ทุก ๆ กล่องหลังจากมันถูกเรนเดอร์เฉพาะในพื้นที่ที่ไม่มีในกล่องแล้วและจะไม่แทนที่เส้นขอบของกล่องที่เรนเดอร์แล้ว

สไตล์

รูปแบบของกล่องเป็นมาตรฐานค่อนข้าง+ใช้สำหรับมุม-ใช้สำหรับเส้นแนวนอนและ|ใช้สำหรับเส้นแนวตั้ง

ตัวอย่าง:

( >>>หมายถึงอินพุต)

>>>0 0 11 4 7 2 8 4 3 5 8 3
+---------+
|         |
|         |---+
+---------+   |
       |      |
   +---+------+
   |      |
   +------+


>>>0 3 11 4 7 5 8 4 3 8 8 3 4 0 13 5
    +-----------+
    |           |
    |           |
+---------+     |
|         |-----+
|         |---+
+---------+   |
       |      |
   +---+------+
   |      |
   +------+


>>>0 0 2 2
++
++


>>>2 2 5 3 1 1 7 5 0 0 9 7
+-------+
|+-----+|
||+---+||
|||   |||
||+---+||
|+-----+|
+-------+

>>>0 0 3 3 2 0 3 3
+-+-+
| | |
+-+-+

ไม่ควรที่จะเป็นหนึ่งกลาง4 0 13 5มากกว่า0 4 13 5?
Neil

สี่เหลี่ยมผืนผ้าที่ 2 จากด้านล่างใน 2 กรณีแรกมี x = 7 (เพื่อให้สอดคล้องกับ x = 0 สี่เหลี่ยม)
เลเวลริเวอร์เซนต์

1
ขอบคุณสำหรับการสังเกตฉันไม่ค่อยเขียนคำตอบสำหรับคำถามของฉันและทั้งหมดนี้เป็นด้วยมือ ...
J Atkin

@JAtkin ฉันขอโทษฉันพลาดไป
Conor O'Brien

ไม่เป็นไรฉันมักจะคิดถึงสิ่งต่าง ๆ เมื่ออ่านเช่นกัน)
J Atkin

คำตอบ:


4

APL, 116 ไบต์

{⎕IO←0⋄K←' '⍴⍨⌽+⌿2 2⍴⌈⌿↑⍵⋄K⊣{x y W H←⍵-⌊.5×⍳4⋄K[Y←y+⍳H;X←x+⍳W]←' '⋄K[Y;A←x+0 W]←'|'⋄K[B←y+0 H;X]←'-'⋄K[B;A]←'+'}¨⌽⍵}

นี่คือฟังก์ชันที่ใช้อาร์เรย์ของอาร์เรย์และส่งคืนเมทริกซ์อักขระ

แบบทดสอบ:

      t1← (0 0 11 4)(8 2 8 4)(3 5 8 3)
      t2← (0 3 11 4)(8 5 8 4)(3 8 8 3)(4 0 13 5)
      t3← (⊂0 0 2 2)
      t4← (2 2 5 3)(1 1 7 5)(0 0 9 7)
      {⎕IO←0⋄K←' '⍴⍨⌽+⌿2 2⍴⌈⌿↑⍵⋄K⊣{x y W H←⍵-⌊.5×⍳4⋄K[Y←y+⍳H;X←x+⍳W]←' '⋄K[Y;A←x+0 W]←'|'⋄K[B←y+0 H;X]←'-'⋄K[B;A]←'+'}¨⌽⍵} ¨ t1 t2 t3 t4
┌───────────────────┬─────────────────────┬────┬───────────┐
│+---------+        │    +-----------+    │++  │+-------+  │
│|         |        │    |           |    │++  │|+-----+|  │
│|         |----+   │    |           |    │    │||+---+||  │
│+---------+    |   │+---------+     |    │    │|||   |||  │
│        |      |   │|         |-----+    │    │||+---+||  │
│   +----+------+   │|         |----+     │    │|+-----+|  │
│   |      |        │+---------+    |     │    │+-------+  │
│   +------+        │        |      |     │    │           │
│                   │   +----+------+     │    │           │
│                   │   |      |          │    │           │
│                   │   +------+          │    │           │
│                   │                     │    │           │
│                   │                     │    │           │
└───────────────────┴─────────────────────┴────┴───────────┘

คำอธิบาย:

  • ⎕IO←0: 0กำหนดแหล่งกำเนิดดัชนี
  • สร้างเมทริกซ์ที่มีขนาดเหมาะสม:
    • ⌈⌿↑⍵: ค้นหาค่าที่ใหญ่ที่สุดสำหรับ x, y, w และ h
    • +⌿2 2⍴: x + w และ y + h
    • K←' '⍴⍨⌽: ให้เมทริกซ์ของ x + W * ช่องว่าง Y + H Kและเก็บไว้ใน
  • วาดกล่องลงไป:
    • {... }¨⌽⍵: สำหรับแต่ละกล่องในลำดับย้อนกลับ
      • x y W H←⍵-⌊.5×⍳4: กำหนดพิกัดเพื่อx, y, WและHและลบ 1 จากทั้งสองและW H(พิกัดเป็นเอกสิทธิ์เฉพาะบุคคลรวมถึงช่วงอาร์เรย์ APL)
      • K[Y←y+⍳H;X←x+⍳W]←' ': เติมช่องว่างปัจจุบันด้วยช่องว่าง
      • K[Y;A←x+0 W]←'|': วาดด้านแนวตั้ง
      • K[B←y+0 H;X]←'-': วาดด้านแนวนอน
      • K[B;A]←'+': ตั้งค่าขอบเป็น '+'
    • K⊣: Kหลังจากนั้นกลับมา

1
APL เป็นเช่นภาษามองแปลกที่จะเป็นคนนอก ...
J Atkin

3

ES6, 228 223 217 208 201 198 ไบต์

ยอมรับอาร์เรย์ของอาร์เรย์ของพิกัดและส่งกลับสตริง

a=>a.reverse().map(([x,y,w,h])=>[...Array(y+h)].map((_,i)=>(s=r[i]||'',r[i]=i<y?s:(s+' '.repeat(x)).slice(0,x)+(c=>c[0]+c[1].repeat(w-2)+c[0])(y-i&&y+h-1-i?'| ':'+-')+s.slice(x+w))),r=[])&&r.join`\n`

ในกรณีที่\nแสดงให้เห็นถึงตัวละครขึ้นบรรทัดใหม่

แก้ไข: บันทึก 5 ไบต์โดยย้อนกลับเงื่อนไขของฉัน บันทึกเพิ่มเติมอีก 6 ไบต์โดยเปลี่ยนจากอาร์เรย์ของอักขระอาร์เรย์เป็นอาร์เรย์ของสตริง บันทึกอีก 9 ไบต์ด้วยการแนะนำตัวแปรชั่วคราว บันทึกอีก 7 ไบต์ด้วยการแนะนำฟังก์ชั่นตัวช่วย บันทึกอีก 3 ไบต์โดยยกเลิกการบันทึกก่อนหน้า!


3

ทับทิม, 153 143

->n{a=(0..m=3*n.max).map{$b=' '*m}
(*n,x,y,w,h=n 
v=w-2
h.times{|i|a[y+i][x,w]=i%~-h<1??++?-*v+?+:?|+' '*v+?|}
)while n[0]
a.delete($b);puts a}

Ungolfed ในโปรแกรมทดสอบ

f=->n{                                #worst case width when x=w=large number, is max input*2+1
  a=(1..m=3*n.max).map{$b=' '*m}      #find m=max value in input, make an a array of 3*m strings of 3*m spaces 
  (
    *n,x,y,w,h=n                      #extract x,y,w,h from the end of n, save the rest back to n     
    v=w-2                             #internal space in rectangle is w-2  
    h.times{|i|                       #for each row
      a[y+i][x,w]=                    #substitute the relevant characters of the relevant lines of a 
      i%~-h<1?                        #i%~-h = i%(h-1). This is zero (<1) for first and last lines of the rectangle
      ?+ + ?-*v + ?+ :?| + ' '*v +?|  # +--...--+ or |  ...  | as required
    }
  )while n[0]                         #loop until data exhausted (n[0] becomes falsy as it does not exist)
a.delete($b);puts a}                  #delete blank rows ($b is a global variable) and display

3

SmileBASIC ขนาด 128 125 ไบต์

DEF B A
WHILE LEN(A)H=POP(A)W=POP(A)-2Y=POP(A)X=POP(A)FOR I=0TO H-1LOCATE X,Y+I?"+|"[M];"- "[M]*W;"+|"[M]M=I<H-2NEXT
WEND
END

ภาพหน้าจอ (ครอบตัด)

ภาพหน้าจอ ภาพหน้าจอ ภาพหน้าจอ ภาพหน้าจอ ภาพหน้าจอ

คำอธิบาย

DEF B A 'make a function and add 12 bytes :(
 WHILE LEN(A) 'repeat until array is empty
  H=POP(A):W=POP(A)-2 'get width/height
  Y=POP(A):X=POP(A) 'get x/y
  FOR I=0 TO H-1 'draw one row at a time
   LOCATE X,Y+I 'position the cursor
   PRINT "+|"[M]; 'draw left edge
   PRINT "- "[M]*W; 'draw middle
   PRINT "+|"[M] 'draw right edge
   M=I<H-2
  NEXT
 WEND
END

Mเก็บว่ามันอยู่ในแถวแรก / สุดท้ายของกล่อง ( 0= +--+, 1= | |) ในการผ่านครั้งแรกผ่านลูปMคือ 0 และที่อื่น ๆ จนกระทั่งครั้งสุดท้ายคือ 1


นี่เป็นสิ่งที่ดี :)
J Atkin

ฉันทามติ Meta คือคุณไม่ได้รับอนุญาตให้ใช้ข้อมูลจากตัวแปรที่กำหนดไว้ล่วงหน้า
FlipTack

1

Pyth, 162 145 ไบต์

J\+K*h.MZm+@d1@d3Q]*h.MZm+@d0@d2QdD:GHb XKHX@KHGb;V_QDlTR@NTVl3Vl2:+l0b+l1H?|qHtl3qH0\-?|qbtl2qb0\|d)):l0l1J:+l0tl2l1J:l0+l1tl3J:+l0tl2+l1tl3J;jK

คุณสามารถลองได้ที่นี่

ผลลัพธ์ของชุดทดสอบ:

+---------+     
|         |     
|         |----+
+---------+    |
        |      |
   +----+-+----+
   |      |     
   +------+     

++
++

+-------+
|+-----+|
||+---+||
|||   |||
||+---+||
|+-----+|
+-------+

+-+-+
| | |
+-+-+

ทางออกที่น่ากลัว! แค่รอใครซักคนที่จะเอาชนะมัน


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