ASCIIアートでシンプルな部屋を構築する


15

部屋は、L字型の部屋など、接続された長方形で構成できます。このような部屋は、各長方形のサイズを表す寸法のリストで説明できます。

2つの入力リストがあるとします。最初の列には、互いに垂直に積み重ねられた長方形の幅が含まれています。2番目には、長方形の高さが含まれています。

例として、入力[4 6][3 2]は6行2列の四角形の上にある4行3列の四角形になります。次の図は、この形状を示しています。壁は「薄い」と見なされるため、入力によって決定されるのは壁間のスペースです。

[4 6][3 2]
 ____
|    |
|    |
|    |_
|      |
|______|

課題は、入力として寸法のリストを取り、部屋の形状をASCIIアートとして出力することです。形式は、サンプル図のとおりでなければなりません。

  • すべての水平壁はアンダースコアを使用して表示されます
  • すべての垂直壁はバーを使用して表示されます
  • 長方形が接続されている壁があってはならない
  • 左の壁はまっすぐです
  • 詳細については、テストケースをご覧ください。

想定できること:

  • すべての寸法は範囲内にあります [1 ... 20]
    • すべての水平寸法は偶数です
  • 長方形の数は範囲内になります [1 ... 10]
  • 有効な入力のみが与えられます
  • オプションの入力形式(入力ディメンションの順序を決定できます。回答で指定してください)。

テストケース:

[2][1]
 __
|__|

---

[4][2]
 ____
|    |
|____|

---

[2 6 2 4][2 2 1 3]
 __
|  |
|  |___
|      |
|   ___|
|  |_
|    |
|    |
|____|

---

[2 14 6 8 4 18 2 10 4 2][1 2 3 1 2 1 1 1 2 1]
 __
|  |___________
|              |
|       _______|
|      |
|      |
|      |_
|     ___|
|    |
|    |_____________
|   _______________|
|  |______
|     ____|
|    |
|   _|
|__|

入力ディメンションの順序を決定できますが、それは行と列を交換し、それらを逆にすることができるということですか?このように:入力形式の例:[2 14 6 8 4 18 2 10 4 2][1 2 3 1 2 1 1 1 2 1]->(スワップとリバース)->入力形式:[1 2 1 1 1 2 1 3 2 1][2 4 10 2 18 4 8 6 14 2]
-daavko

はい、それは大丈夫です。:-)
スティーウィグリフィン

ありがとう。私はおそらくそれらを逆にする必要はなく、ただ交換するだけでした。
-daavko

回答:


1

網膜、169の 150 113バイト

バイトカウントはISO 8859-1エンコーディングを前提としています。

\ d +
$ *
{+ r`1(1 *¶[^ |] *(1+))
$1¶| $ 2 |
} `(¶。*)1+
1ドル
1
_
(\ | _ +)\ |(?=¶\ 1 _(_ +))
$ 1 | $ 2
T`w` `(\ | _ +)_?(?= _ * \ |。*¶\ 1)
^¶
 

コードには、末尾の改行に末尾スペースが含まれています。

入力形式:

高さ(スペースで区切る)
幅(スペースで区切る)

例えば:

1 2 3 1 2 1 1 1 2 1
2 14 6 8 4 18 2 10 4 2

オンラインでお試しください!


4

JavaScript(ES6)174

唯一の重要な部分は、幅の異なる2つの部分を結合する水平の行です。右側の垂直バーは中央または右端にあります。

(p,h,q=-1,R=(n,s=' ')=>s.repeat(n))=>[...p,0].map((x,i)=>(x>q?p=x:(p=q,q=x),(~q?`
|`+R(q+(x<p)-!x)+R(x>q,'|'):' ')+R(p+~q+!x,'_')+R(x<p,'|')+R(h[i]-1,`
|${R(q=x)}|`))).join``

テスト

f=(p,h,q=-1,R=(n,s=' ')=>s.repeat(n))=>[...p,0].map((x,i)=>(x>q?p=x:(p=q,q=x),(~q?`
|`+R(q+(x<p)-!x)+R(x>q,'|'):' ')+R(p+~q+!x,'_')+R(x<p,'|')+R(h[i]-1,`
|${R(q=x)}|`))).join``

// Less golfed

F=(p,h, q=-1, 
   R=(n,s=' ')=>s.repeat(n)
  )=>
  [...p, 0].map((x,i)=> (
    x>q? p=x : (p=q,q=x),
    (q>=0?`\n|`+R(q+(x<p)-!x)+R(x>q,'|'):' ')
    + R(p+~q+!x,'_') + R(x<p,'|')
    + R(h[i]-1,`\n|${R(q=x)}|`)
  )).join``

console.log=x=>O.textContent+=x+'\n'

;[  
  [[2],[1]],
  [[4],[2]],
  [[2, 6, 2, 4],[2, 2, 1, 3]],
  [[2, 14, 6, 8, 4, 18, 2, 10, 4, 2],[1, 2, 3, 1, 2, 1, 1, 1, 2, 1]]
].forEach(t=>{
  var w=t[0],h=t[1]
  console.log('['+w+'] ['+h+']\n'+f(w,h)+'\n')
})
<pre id=O></pre>


4

Python 3、230 223 222 217バイト

def f(a):b=a[0]+[0];m=' _';print('\n'.join([' '+'_'*b[0]+' ']+['|'+' '*min(b[l],b[l+1])+m[b[l+1]<1]*(b[l]>b[l+1])+m[k]*(b[l]-b[l+1]-1)+'|'+m[k]*(b[l+1]-b[l]-1)for l,i in enumerate(zip(*a))for k in[0]*(i[1]-1)+[1]]))

@StewieGriffin @KevinLauに助けてくれてありがとう

結果

>>> f([[2, 14, 6, 8, 4, 18, 2, 10, 4, 2],[1, 2, 3, 1, 2, 1, 1, 1, 2, 1]])
 __ 
|  |___________
|              |
|       _______|
|      | 
|      | 
|      |_
|     ___|
|    |             
|    |_____________
|   _______________|
|  |_______
|     _____|
|    |
|   _|
|__|

セミコロン!彼らはあなたの割り当てを分離し、不要なインデントからあなたを救います!(a=1;b=2
CalculatorFeline

「solutoin」>解決策
マット

文字列のインデックス作成!5バイトのようm=' _'m=[' ','_']保存する代わりに。
バリューインク

3

ルビー191

初めてゴルフをすることも、Rubyを使った最初の日でもあるので、おそらく世界で最もエレガントなものではないでしょう。

def f(x)
a=x[0]+[0]
puts" #{'_'*a[0]} "
for i in 0..x[1].length-1
n,m=a[i,2].sort
puts"|#{' '*a[i]}|\n"*(x[1][i]-1)+'|'+' '*n+(a[i+1]<1?'_':m>a[i]?'|':' ')+'_'*(m-n-1)+(n<a[i]?'|':'')
end
end
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.