用ASCII艺术建造一个简单的房间


15

一个房间可以由相连的矩形组成,例如L形房间。这样的房间可以通过描述每个矩形尺寸的尺寸列表来描述。

假设您有两个输入列表。第一个包含彼此垂直垂直堆叠的矩形的宽度。第二个包含矩形的高度。

例如,输入[4 6][3 2]将是6 x 2矩形顶部的4 x 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

是的,没关系。:-)
Stewie Griffin

谢谢。原来,我可能不需要撤销它们,只需交换即可。
daavko '16

Answers:


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”>解决方案
Matt

字符串索引!m=' _'而不是m=[' ','_']节省5个字节。
价值墨水

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
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.