绘制半透明框


15

注意:由于SE字体怪异:P :(

给定一个代表矩形角的四元组列表,以该顺序在彼此之间绘制半透明矩形。

对于此挑战,您需要在左上角具有最小的坐标,并且x轴向右增加,y轴向下增加。

四元组(x0, y0, x1, y1)(x0, x1, y0, y1)代表(x, y)矩形的左上角和右下角的坐标对(您可以为矩形选择两种格式中的任一种,但必须一致)

“半透明矩形”是什么意思?好吧,对于这个挑战,您将使用空格字符和大多数箱形绘图字符。特别是所有用于绘制矩形的矩形,包括“粗体”字符。绘制半透明的矩形时,首先将占据空间的所有细线消失,所有粗线都将变细,然后再用粗线绘制矩形本身。

例如,如果先在左上角绘制一个矩形,然后在右下角绘制一个矩形,则它可能看起来像这样:

┏━━━━┓
┃    ┃
┃    ┃
┃ ┏━━╇━━┓
┃ ┃  │  ┃
┗━╉──┘  ┃
  ┃     ┃
  ┃     ┃
  ┗━━━━━┛

为了清楚起见,严格在矩形内的所有线条的线条都会变亮(粗体->细线->无)(例如,朝下的线条的顶部边缘而不是底部边缘受到影响)。

测试用例

对于每个测试用例,将给出一定数量的输入行,然后是unicode-art。

0 0 5 5
5 5 10 10
3 3 7 7
2 2 8 8

┏━━━━┓     
┃    ┃     
┃ ┏━━╇━━┓  
┃ ┃┌─┴─┐┃  
┃ ┃│   │┃  
┗━╉┤   ├╊━┓
  ┃│   │┃ ┃
  ┃└─┬─┘┃ ┃
  ┗━━╈━━┛ ┃
     ┃    ┃
     ┗━━━━┛

14 5 15 9
13 2 15 16
6 4 15 11


             ┏━┓
             ┃ ┃
      ┏━━━━━━╇━┫
      ┃      │ ┃
      ┃      │ ┃
      ┃      │ ┃
      ┃      │ ┃
      ┃      │ ┃
      ┃      │ ┃
      ┗━━━━━━╈━┫
             ┃ ┃
             ┃ ┃
             ┃ ┃
             ┃ ┃
             ┗━┛

6 8 10 11
15 12 16 16
14 10 16 16
9 1 15 15

         ┏━━━━━┓ 
         ┃     ┃ 
         ┃     ┃ 
         ┃     ┃ 
         ┃     ┃ 
         ┃     ┃ 
         ┃     ┃ 
      ┏━━╉┐    ┃ 
      ┃  ┃│    ┃ 
      ┃  ┃│   ┌╊┓
      ┗━━╉┘   │┃┃
         ┃    │┠┨
         ┃    │┃┃
         ┃    │┃┃
         ┗━━━━╈┩┃
              ┗┷┛

生成更多的测试用例!

规则

  • 对于四元组列表,输入可以采用任何合理的格式。输入可以是一索引或沿任一轴的零索引(即,左上角可以是任何的(0, 0)(0, 1)(1, 0)(1, 1)
  • 输出必须是所描述的unicode-art。输出可能没有前导换行符,并且最多只能有一个尾随换行符(在最后一行之后)。出于此挑战的目的,尾随空格将被忽略。

代码点

水平和垂直的粗体和轻管都在范围内[U+2500, U+2503]。各种角管都在范围内[U+250C, U+251C)。三臂管道在范围内[U+251C, U+253C)。四臂管道在范围内[U+253C, U+254C)。在我的程序中可以找到的其余管道实际上从未使用过。


这真的是ASCII艺术吗?除空格外,它不使用任何ascii字符。
caird coinheringaahing

@cairdcoinheringaahing从ascii信息,Typically this uses only 95 printable (from a total of 128) characters defined by the ASCII Standard from 1963.
全人类的


我们可以从这里使用b / w 220-223这个字符吗?粗体字dochome.programbl.com/dochome/sites/default/files/image169.png
Mukul Kumar

1
@MukulKumar不,您必须使用那些确切的字符。您可以将整个字符集的任何排列的任何不重复的子字符串作为输入,因此您不必浪费字节/字符对字符进行硬编码
。– HyperNeutrino

Answers:


3

Python 3中289个 286字节

l,u=eval(input())
*_,w,h=map(max,zip(*l))
r=[*map(list,[' '*-~w]*-~h)]
R=range
for x,y,X,Y in l:
 for i in R(x,X+1):
  for j in R(y,Y+1):Q=i<X,y<j,x<i,j<Y;r[j][i]=u[sum(3**o*max(Q[o]*[j in(y,Y),i in(x,X)][o%2]*2,u.index(r[j][i])//3**o%3-Q[o])for o in R(4))]
for l in r:print(''.join(l))

在线尝试!

将输入作为4元组的列表: (x0, y0, x1, y1)和管道绘图字符,如下所示:" ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"

支持宽度或高度为零的框(使用所有框绘图字符)。

根据这个问题的回答,但在绘制时进行了修改以更改现有的框。

'无高尔夫球':

u=" ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"

#Create array of spaces:
l=eval(input())
w,h=list(map(max,zip(*l)))[2:]
r=[[' ']*w for _ in' '*h]

for x,y,X,Y in l:
 n,m=X-1,Y-1
 for i in range(x,X):
  for j in range(y,Y):
   A,B=j in(y,m),i in(x,n)
   P=(i<n*A,y<j*B,x<i*A,j<m*B)   # Pipe sides of the new box
   Q=(i<n,y<j,x<i,j<m)           # Pipe sides that are inside the new box, and should be thinned.
   # Get new pipe (sides of new box, on top of thinned pipes of existing boxes. (u.index... is existing pipe))
   l=sum(3**o*max(P[o]*2,(u.index(r[j][i])//3**o%3)-Q[o])for o in range(4))
   #Add to 'canvas'
   r[j][i]=u[l]

print('\n'.join(''.join(l)for l in r))

您可以u作为输入。
HyperNeutrino

@HyperNeutrino谢谢:)
TF场

你可以通过你的主演不必要的变量,更换保存一个字节_,_,w,h=*_,w,h=
乔纳森·弗雷希

同样,您对的元组分配Q不需要任何括号,Q=(i<X,y<j,x<i,j<Y);可以替换Q=i<X,y<j,x<i,j<Y;为两个保存的字节。
乔纳森·弗雷希

@JonathanFrech谢谢:)
TF场

2

的JavaScript(ES6),298个 261字节

(a,u,m=n=>[...Array(1+Math.max(...a.map(t=>t[n])))])=>m(3).map((_,j)=>m(2).map((_,i)=>u[a.reduce((c,[x,y,v,w])=>i<x|j<y|i>v|j>w?c:(g=n=>c-=c/n%3|0&&n,h=n=>c+=n*(2-(c/n%3|0)),[i>x&&9,i<v].map(j>y&j<w?g:h),[j>y&&3,j<w&&27].map(i>x&i<v?g:h),c),0)]).join``).join`\n`

其中\n代表文字换行符。基于我对Unicode矩形的回答。说明:创建了一个用于插入的空格字符串数组。然后,通过循环输入中的所有框来处理每个空格。位于框外的字符将被忽略,但位于边缘或内部的字符将被进一步处理。对于组成一个字符的四个线段中的每个线段(每个线段均由3的幂表示),则存在三种可能性;即,每一种线段都具有三种可能性。a)段位于框的外部,应忽略(通过传递参数0而不是3的幂来实现)b)段位于框的边缘,应加粗(通过调用h函数来实现) c)该段位于盒子内,应轻放(通过调用g功能)。然后将该字符索引到Unicode字符串中。处理完所有框后,将在换行符上合并数组。

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.