Kết xuất hộp ASCII


11

Bài tập

Nhiệm vụ của bạn là viết một chương trình sẽ xuất các hộp ASCII tại các vị trí được chỉ định bởi đầu vào.

Đầu vào

Bạn sẽ được cung cấp một danh sách các số. Định dạng đây là một chút linh hoạt, trong đó bạn có thể sử dụng bất kỳ deliminator bạn muốn (ví dụ như 1,2,3,4, 1 2 3 4, [1,2,3,4]). Danh sách này nằm trong nhóm 4 và chỉ định xywhmỗi hộp. Chiều rộng và chiều cao của mỗi hộp sẽ có ít nhất là 2. xwidthtừ trái sang phải. yvà từ heighttrên xuống dưới.

Đầu ra

Kết xuất có thể được coi là từ phải sang trái, với hộp bên phải được vẽ trước và mỗi hộp sau đó đều vượt qua nó. Không gian lưu trữ được cho phép, cũng như một dòng mới.

Cách xử lý các hộp chồng chéo

Hộp bên trái của đầu vào là hộp trên cùng và không có gì sẽ chồng lên nó. Mỗi hộp sau khi nó được hiển thị chỉ trong không gian chưa có trong hộp và sẽ không thay thế đường viền của hộp đã được kết xuất.

Phong cách

Kiểu dáng của các hộp khá chuẩn, +được sử dụng cho các góc, -được sử dụng cho các đường ngang và |được sử dụng cho các đường thẳng đứng.

Ví dụ:

( >>>biểu thị đầu vào)

>>>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
+-+-+
| | |
+-+-+

Không nên là người trung gian 4 0 13 5hơn là 0 4 13 5?
Neil

Hình chữ nhật thứ 2 từ dưới lên trong 2 trường hợp đầu tiên có x = 7 (để phù hợp với hình chữ nhật x = 0)
Level River St

1
Cảm ơn vì đã chú ý, tôi hiếm khi viết câu trả lời cho câu hỏi của mình, và vì vậy tất cả điều này là bằng tay ...
J Atkin

@JAtkin Tôi xin lỗi, tôi đã bỏ lỡ điều đó.
Conor O'Brien

Thật tốt, tôi cũng thường xuyên bỏ lỡ những thứ khi đọc;)
J Atkin

Câu trả lời:


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

Đây là một hàm lấy một mảng các mảng và trả về một ma trận ký tự.

Các xét nghiệm:

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

Giải trình:

  • ⎕IO←0: đặt nguồn gốc chỉ mục thành 0.
  • Tạo một ma trận có kích thước phù hợp:
    • ⌈⌿↑⍵: tìm các giá trị lớn nhất cho x, y, w và h
    • +⌿2 2⍴: x + w và y + h
    • K←' '⍴⍨⌽: tạo một ma trận gồm các khoảng trắng x + w * y + h và lưu nó vào K.
  • Vẽ các ô vào đó:
    • {... }¨⌽⍵: cho mỗi hộp, theo thứ tự ngược lại,
      • x y W H←⍵-⌊.5×⍳4: Giao tọa độ để x, y, W, và H, và trừ 1 từ cả hai WH. (tọa độ là độc quyền, phạm vi mảng APL được bao gồm.)
      • K[Y←y+⍳H;X←x+⍳W]←' ': điền vào ô hiện tại với khoảng trắng
      • K[Y;A←x+0 W]←'|': vẽ các cạnh dọc
      • K[B←y+0 H;X]←'-': vẽ các cạnh ngang
      • K[B;A]←'+': đặt các cạnh thành '+'
    • K⊣: sau đó, trở về K.

1
APL là một ngôn ngữ có vẻ kỳ lạ đối với người ngoài ...
J Atkin

3

ES6, 228 223 217 208 201 198 byte

Chấp nhận một mảng các mảng tọa độ và trả về một chuỗi.

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`

Trường hợp \nđại diện cho một nhân vật dòng mới.

Chỉnh sửa: Đã lưu 5 byte bằng cách đảo ngược điều kiện của tôi. Đã lưu thêm 6 byte bằng cách chuyển từ một mảng các mảng char sang một chuỗi các chuỗi. Đã lưu thêm 9 byte bằng cách giới thiệu một biến tạm thời. Đã lưu thêm 7 byte bằng cách giới thiệu một hàm trợ giúp. Đã lưu thêm 3 byte bằng cách hoàn tác lưu trước đó!


3

Hồng ngọc, 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 trong chương trình thử nghiệm

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 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

Ảnh chụp màn hình (cắt)

ảnh chụp màn hình ảnh chụp màn hình ảnh chụp màn hình ảnh chụp màn hình ảnh chụp màn hình

Giải trình

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

Mlưu trữ cho dù đó là trên hàng đầu tiên / cuối cùng của hộp ( 0= +--+, 1= | |). Trong lần đầu tiên đi qua vòng lặp, Mlà 0 và trên tất cả những người khác cho đến lần cuối cùng, đó là 1.


Điều này khá hay :)
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

Bạn có thể thử nó ở đây

Đầu ra của bộ thử nghiệm:

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

++
++

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

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

Giải pháp khủng khiếp! Chỉ chờ ai đó đánh bại nó


2
Ví dụ đầu tiên của bạn đặt thêm + trong đó các hộp chia sẻ một cạnh.
Linus
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.