平面图!


11

免责声明:这个问题中讲的故事完全是虚构的,仅出于介绍目的而发明。

我有一个朋友,他是建筑师,在向他解释了代码高尔夫的概念和这个站点之后,他说我应该编写一些对变更有用的东西。我问他他认为有用吗?作为一名建筑师,他回答说,他很喜欢拥有一个平面规划师,该规划师为他提供了在一定尺寸的房屋中布置一定尺寸的房间的所有可能方案。我以为我将证明代码高尔夫球毕竟不是没有用,并以尽可能少的字节数为他提供此程序。

你的任务:

编写一个程序或函数,当给定包含整个房屋尺寸的数组D和包含内部房间尺寸的第二个数组R时,以ASCII艺术形式输出房屋内部房间的所有可能配置。

所有房间和房屋的外墙应形成为标准ASCII框,并使用| 垂直墙为-符号,水平墙为-符号,拐角为+符号。例如,尺寸为[4,4]的房屋看起来像:

+----+
|    |
|    |
|    |
|    |
+----+

如您所见,拐角不算作一组尺寸的一部分。-或|的数量 构成侧面的字符应等于尺寸中给定的数字。房间可以与房屋共用墙壁,也可以与房屋共用墙壁。房间内可能没有较小的房间。

例如,配置

+--+---+-+
|  |   | |
|  |   | |
+--+---+ |
|        |
|        |
+--------+

对于D = [5,8]和R = [[2,2],[2,3]]有效。

输入:

两个数组,其中一个包含两个整数(房屋的尺寸),另一个包含一系列包含房间尺寸的数组。

输出:

将所有可能的房屋组成的数组作为字符串,或者包含所有可能的房屋的字符串以某种一致的方式定界。请注意,完全相同配置的旋转次数仅应计算一次。

测试用例:

D     R                   ->   Output

[4,3] [[2,1],[4,1]]       -> +-+-+ +-+-+ +-+-+  Note that though there is an option to switch which side the [2,1] room and the [4,1] room are on, doing so would merely be rotating the house by 180 degrees, and therefore these possibilities do not count.  
                             | | | +-+ | | | |
                             +-+ | | | | | | |
                             | | | | | | +-+ |
                             | | | +-+ | | | |
                             +-+-+ +-+-+ +-+-+

[4,7] [[3,1],[4,2],[2,2]  -> +----+--+ +----+--+ +----+--+ +----+--+  There are some more possiblities I didn't feel like adding, but it's the same four again, just with the [4,2] and the [2,2] room switched.  
                             |    |  | |    |  | |    |  | |    |  |
                             |    |  | |    |  | |    |  | |    |  |
                             +---++--+ +--+-+-++ +-+--++-+ ++---+--+
                             |   |   | |  |   || | |   | | ||   |  |
                             +---+---+ +--+---++ +-+---+-+ ++---+--+

得分:

这是,最低得分(以字节为单位)获胜!


镜像是否算作同一配置?

否。您必须复制镜像的配置。
Gryphon

4
您的第一个测试用例不是错误的吗?D = [4,2]但是你的房子是[4,3]吗?
HatsuPointerKun

@HatsuPointerKun,谢谢您发现该错字。现在已修复。
Gryphon

2
的确,建筑师在记事本中使用ASCII艺术来进行大多数设计是众所周知的事实。
桑契斯'17

Answers:


2

Python 2中625个 607 602 563 551字节

  1. -5个字节,感谢Mr.Xcoder。
  2. 避免深度复制时为-12个字节。
  3. -39字节,带有一些列表简化。
r,z=range,len
L,C=D;p,q,v,w=['+'],['|'],'*',' '
H=[p+['-']*C+p]
P=[[e[:]for e in H+[q+[w]*C+q]*L+H]]
def g(M,x,y,N):
 m=[e[:]for e in M]
 try:
  for i in r(z(N)):
   for j in r(z(N[0])):
	if v==N[i][j]and w!=M[x+i][y+j]:return[]
	m[x+i][y+j]=m[x+i][y+j]in[w,v,N[i][j]]and N[i][j]or'+'
 except:return[]
 return m
for l,c in R:
 H=[p+['-']*c+p]
 P=[g(U,x,y,[e[:]for e in H+[q+[v]*c+q]*l+H])for U in P for x in r(L+2)for y in r(C+2)]
F=[]
for m in P:
 if[e[::-1]for e in m[::-1]]not in F:F+=[m]
for m in F:
 print
 for e in m:print''.join(e).replace(v,w)

在线尝试!

一些解释 这是一种贪婪的方法:

  1. 查找可以分配第一个房间的所有位置
  2. 从房子的剩余可用空间中找到可以分配下一个房间的所有可能位置,以此类推。
  3. 如果最后一个房间已成功分配,则代码将输出配置(如果它不是先前配置的180°旋转)。


602字节,使用列表推导。
Xcoder先生17年
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.