ASCII框渲染


11

任务

您的任务是编写一个程序,该程序将在输入指定的位置输出ASCII框。

输入值

您将得到一个数字列表。这里的格式有点灵活,你可以使用任何你想要的deliminator(例如1,2,3,41 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吗?
尼尔

在前两种情况下,从底部开始的第二个矩形的x = 7(与x = 0的矩形一致)
Level River St

1
感谢您的注意,我很少为我的问题写答案,所以所有这些都是手工完成的……
J Atkin

@JAtkin对不起,我错过了。
科纳·奥布莱恩

很好,我在阅读时也会经常想念东西;)
J Atkin

Answers:


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:分配的坐标xyW,和H,以及从两个减1 WH。(坐标是唯一的,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个字节。从char数组的数组切换到字符串数组,又节省了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}

取消测试程序

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


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
您的第一个示例在框共享边的位置添加了一个额外的+。
莱纳斯(Linus)2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.