半透明のボックスを描く


15

注:文字列アートは、SEフォントの奇妙さのためにここで恐ろしく見えるかもしれません:P :(

長方形の角を表す4つのタプルのリストが与えられたら、半透明の長方形をこの順序で重ねて描画します。

この課題では、左上隅の座標が最小で、x軸が右に増加し、y軸が下に増加する必要があります。

4タプル(x0, y0, x1, y1)またはは、長方形の左上隅と右下隅の座標ペアを(x0, x1, y0, y1)表し(x, y)ます(長方形には2つの形式のいずれかを選択できますが、一貫性が必要です)

「半透明の長方形」とはどういう意味ですか?さて、この課題では、スペース文字とほとんどのボックス描画文字を使用します。具体的には、「太字」の文字を含む長方形の描画に使用されるすべてのもの。半透明の長方形が描画されると、最初に占有されているスペース内のすべての細い線が消え、すべての太線が細くなり、次に長方形自体が太線で描かれます。

たとえば、左上に長方形を描き、次に右下に長方形を描くと、次のようになります。

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

明確にするために、厳密に長方形内のすべての線の線を明るくします(太字->細い->なし)(たとえば、下向きの線は上端では影響を受けますが、下端では影響を受けません)。

テストケース

各テストケースについて、入力のいくつかの行が与えられ、その後に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

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

さらにテストケースを生成します!

ルール

  • 入力は、4タプルのリストの任意の妥当な形式にすることができます。入力は、一インデックス又はいずれかの軸に沿ってゼロインデックス付けすることができる(すなわち、左上隅には、のいずれかであることができます(0, 0)(0, 1)(1, 0)(1, 1)
  • 出力は、説明されているようにunicode-artでなければなりません。出力には、先頭の改行がない場合があり、最後の行の後に最大で1つの末尾の改行を含めることができます。このチャレンジでは、末尾の空白は無視されます。

コードポイント

大胆で明るい水平および垂直パイプは範囲内にあります[U+2500, U+2503]。さまざまなコーナーパイプが範囲内にあります[U+250C, U+251C)。3本腕のパイプは、範囲内にあります[U+251C, U+253C)。4本腕のパイプは、範囲内にあります[U+253C, U+254C)。私のプログラムで見つけることができる残りのパイプは実際には使用されません。


これは本当にアスキーアートですか?スペースは別として、ASCII文字は使用しません。
ケアニコインヘリンガー

@cairdcoinheringaahing アスキーアート情報から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

回答:


3

Pythonの3289の 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)受け取ります。次のように、パイプ描画文字とともに:" ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"

幅または高さがゼロのボックスをサポートします(すべてのボックス描画文字を使用します)。

この質問に対する私の回答に基づいていますが、描画時に既存のボックスを変更するように修正されました。

「Ungolfed」:

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ありがとう:)
TFeld

あなたは交換し、あなたの不要な変数を主演でバイトを保存することができ_,_,w,h=*_,w,h=
ジョナサンフレッチ

また、タプルへの割り当てQは括弧を必要とせず、2つの保存されたバイトにQ=(i<X,y<j,x<i,j<Y);置き換えることができQ=i<X,y<j,x<i,j<Y;ます。
ジョナサンフレッチ

@JonathanFrechありがとう:)
TFeld

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`

where \nは、リテラルの改行文字を表します。Unicodeの四角形に対する私の答えに基づいています。説明:描画するスペースの文字列の配列が作成されます。各スペースは、入力内のすべてのボックスをループ処理することで処理されます。ボックスの外側にある文字は無視されますが、端または内側の文字はさらに処理されます。文字を構成する4つの線分(それぞれ3の累乗で表される)のそれぞれに対して、3つの可能性があります。a)セグメントはボックスのすぐ外側にあり、無視する必要があります(3の累乗ではなく0のパラメーターを渡すことで達成されます)b)セグメントはボックスの端にあり、太字である必要があります(h関数を呼び出すことで達成されます) c)セグメントはボックス内にあり、明るくする必要があります(g関数)。次に、文字はUnicode文字列にインデックス付けされます。すべてのボックスが処理されると、配列は改行で結合されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.