Render Kotak ASCII

11

Tugas

Tugas Anda adalah menulis program yang akan menampilkan kotak ASCII di lokasi yang ditentukan oleh input.

Memasukkan

Anda akan diberikan daftar angka. Format di sini adalah sedikit fleksibel, karena Anda dapat menggunakan deliminator Anda inginkan (misalnya 1,2,3,4, 1 2 3 4, [1,2,3,4]). Daftar ini dalam kelompok 4 dan menentukan xywhkotak masing-masing. Lebar dan tinggi setiap kotak minimal 2. xdan dari widthkiri ke kanan. ydan dari heightatas ke bawah.

Keluaran

Rendering dapat dianggap sebagai kanan ke kiri, dengan kotak di kanan ditarik terlebih dahulu, dan setiap kotak setelah itu selesai. Ruang trailing diperbolehkan, serta satu trailing newline.

Cara menangani kotak yang tumpang tindih

Kotak di sebelah kiri input adalah kotak teratas, dan tidak ada yang tumpang tindih. Setiap kotak setelah itu diberikan hanya di ruang yang belum terkandung dalam kotak dan tidak akan menggantikan batas kotak yang sudah diberikan.

Gaya

Gaya kotak cukup standar, dengan +digunakan untuk sudut, -digunakan untuk garis horizontal, dan |digunakan untuk garis vertikal.

Contoh:

( >>>menunjukkan input)

>>>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
+-+-+
| | |
+-+-+
J Atkin
sumber
Bukankah seharusnya yang di tengah itu 4 0 13 5bukan 0 4 13 5?
Neil
Kotak kedua dari bawah dalam 2 kasus pertama memiliki x = 7 (agar konsisten dengan x = 0 persegi panjang)
Level River St
1
Terima kasih telah memperhatikan, saya jarang menulis jawaban untuk pertanyaan saya, jadi semua ini dengan tangan ...
J Atkin
@ Aykin Saya minta maaf, saya melewatkan itu.
Conor O'Brien
Tidak apa-apa, saya sering ketinggalan barang ketika membaca juga;)
J Atkin

Jawaban:

4

APL, 116 byte

{⎕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]←'+'}¨⌽⍵}

Ini adalah fungsi yang mengambil array array dan mengembalikan matriks karakter.

Tes:

      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
┌───────────────────┬─────────────────────┬────┬───────────┐
│+---------+        │    +-----------+    │++  │+-------+  │
│|         |        │    |           |    │++  │|+-----+|  │
│|         |----+   │    |           |    │    │||+---+||  │
│+---------+    |   │+---------+     |    │    │|||   |||  │
│        |      |   │|         |-----+    │    │||+---+||  │
│   +----+------+   │|         |----+     │    │|+-----+|  │
│   |      |        │+---------+    |     │    │+-------+  │
│   +------+        │        |      |     │    │           │
│                   │   +----+------+     │    │           │
│                   │   |      |          │    │           │
│                   │   +------+          │    │           │
│                   │                     │    │           │
│                   │                     │    │           │
└───────────────────┴─────────────────────┴────┴───────────┘

Penjelasan:

  • ⎕IO←0: setel asal indeks ke 0.
  • Buat matriks dengan ukuran yang tepat:
    • ⌈⌿↑⍵: temukan nilai terbesar untuk x, y, w, dan h
    • +⌿2 2⍴: x + w dan y + h
    • K←' '⍴⍨⌽: buat matriks x + w * y + h spasi dan simpan di K.
  • Gambarkan kotak-kotak itu ke dalamnya:
    • {... }¨⌽⍵: untuk masing-masing kotak, dalam urutan terbalik,
      • x y W H←⍵-⌊.5×⍳4: Menetapkan koordinat untuk x, y, W, dan H, dan kurangi 1 dari kedua Wdan H. (Koordinat bersifat eksklusif, rentang array APL termasuk.)
      • K[Y←y+⍳H;X←x+⍳W]←' ': isi kotak saat ini dengan spasi
      • K[Y;A←x+0 W]←'|': menggambar sisi vertikal
      • K[B←y+0 H;X]←'-': menggambar sisi horisontal
      • K[B;A]←'+': setel tepi ke '+'
    • K⊣: setelah itu, kembali K.
marinus
sumber
1
APL adalah bahasa yang terlihat aneh bagi orang luar ...
J Atkin
3

ES6, 228 223 217 208 201 198 byte

Menerima larik array koordinat dan mengembalikan string.

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`

Di mana \nmewakili karakter baris baru.

Sunting: Disimpan 5 byte dengan membalik kondisi saya. Menyimpan 6 byte lebih lanjut dengan beralih dari array array char ke array string. Menyimpan 9 byte lebih lanjut dengan memperkenalkan variabel sementara. Menyimpan 7 byte lebih lanjut dengan memperkenalkan fungsi pembantu. Menyimpan 3 byte lebih lanjut dengan membatalkan penghematan sebelumnya!

Neil
sumber
3

Ruby, 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}

Tidak digabungkan dalam program uji

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
Level River St
sumber
3

SmileBASIC, 128 125 byte

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

Tangkapan layar (terpotong)

tangkapan layar tangkapan layar tangkapan layar tangkapan layar tangkapan layar

Penjelasan

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

Mmenyimpan apakah itu di baris pertama / terakhir dari kotak ( 0= +--+, 1= | |). Pada pass pertama melalui loop, Madalah 0, dan pada semua yang lain sampai yang terakhir, adalah 1.

12Me21
sumber
Ini cukup bagus :)
J Atkin
1

Pyth, 162 145 byte

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

Anda bisa mencobanya di sini

Output dari test suite:

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

++
++

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

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

Solusi mengerikan! Hanya menunggu seseorang untuk mengalahkannya

Tenchi2xh
sumber
2
Contoh pertama Anda memberi tanda tambah + di tempat kotak berbagi keunggulan.
Linus