半透明のボックスを描く

note:文字列の芸術は、SEフォントの奇妙さのためにここでひどく見えるかもしれません:P:(

矩形の角を表す4つのタプルのリストが与えられた場合、その順序で互いに半透明の四角形を描きます。

この課題では、左上隅に最小の座標を、X軸を右に、y軸を下に向かって大きくする必要があります。

(x0、y0、x1、y1)または(x0、x1、y0、y1)は、
>四角形の左上と右下隅の座標ペア(四角形の2つの形式のどちらかを選択できますが、一貫性が必要です)

「半透明の四角形」とはどういう意味ですか?さて、この挑戦​​のために、あなたはスペース文字と、ほとんどのボックス描画文字;具体的には、「太字」の文字を含む矩形を描画するために使用されたすべてのもの。半透明の四角形が描画されると、最初に占有されていたスペースの細い線はすべて消え、太い線はすべて薄くなり、矩形自体が太線で描かれます。

たとえば、四角形を左上に、次に右下に描画すると、次のようになります。

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

To be clear, lines are lightened (bold -> thin -> none)
for all lines strictly within the rectangle (for example, downwards
facing lines are affected for the top edge but not the bottom
edge).

テストケース

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

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

Generate more テストケース!

ルール

  • 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]
の範囲にあります。私のプログラムで見つかる可能性のある残りのパイプは決して実際に使用されません。

ベストアンサー

Python 3, 289 286 bytes

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

Try it
online!

Takes input as a list of 4-tuples: (x0, y0, x1,
y1)
, along with the pipedrawing characters as follows:
"
╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"

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

私の答えに基づいてこの質問を修正しましたが、描画する際に既存のボックスを変更しました。

‘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

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です