Python的3.5,328 326 313 305 295 248字节
(感谢Kevin Lau提供的有关减小三元语句大小的提示!)
def s(w,h,d):R,M=range,max;S,V,L=' |/';O=w-2;D=d-M(0,d-h);Q=h-M(0,h-d);print('\n'.join([S*(d-i)+L+' -'[i<1]*O+L+S*[h-1,i][i<=D-1]+'/|'[i<=D-1]for i in R(D+M(0,d-h))]+[V+[' -'[i==h],'_'][i<2]*O+V+S*[i-1,d][i>Q]+'/|'[i>Q]for i in R(Q+M(0,h-d),0,-1)]))
将输入作为3个整数,顺序为width, height, depth
。我会尽可能多地打高尔夫球。
在线尝试!(爱迪生)
说明:
为了便于说明,假定函数使用以下参数执行,(3,2,3)
其中3是宽度(w
),2是高度(h
),3是深度(d
)。话虽如此,让我首先展示整个功能的主要部分:
'\n'.join([S*(d-i)+L+' -'[i<1]*O+L+S*[h-1,i][i<=D-1]+'/|'[i<=D-1]for i in R(D+M(0,d-h))]+[V+[' -'[i==h],'_'][i<2]*O+V+S*[i-1,d][i>Q]+'/|'[i>Q]for i in R(Q+M(0,h-d),0,-1)])
在这里,创建了组成整个“房屋”的两个列表,然后通过文字换行(\n
)将它们连接在一起。让我们分别将它们称为list a
和list b
,并分析其中的每一个:
这a
是创建列表的地方:
[S*(d-i)+L+' -'[i<1]*O+L+S*[h-1,i][i<=D-1]+'/|'[i<=D-1]for i in R(D+M(0,d-h))]
此列表包含d
房屋的第一行。在这里,i
是范围内的每个数字0=>(d-(d-h))+d-h
,d-h=0
如果是负数或零。首先,将d-i
空格添加到列表中,然后是a /
,然后是压缩的条件语句返回的所有内容。在此条件语句中,w-2
如果返回空格数i>1
。否则-
返回相同数量的。然后,这些之后是另一个/
,然后是空格,空格的数量现在取决于是否i<=d-(d-h)-1
。如果是,则i
添加空格。否则,h-1
将添加空格。最后,全部以a /
或a 开头|
,如果在|
处添加i<=d-(d-h)-1
,否则添加a/
被添加。在3x2x3
棱镜的情况下,将由list返回a
:
/-/|
/ / |
/ / /
这b
是创建列表的地方:
[V+[' -'[i==h],'_'][i<2]*O+V+S*[i-1,d][i>Q]+'/|'[i>Q]for i in R(Q+M(0,h-d),0,-1)]`
此列表包含棱镜的其余线。在此列表中,i
是整数范围内的每个整数(h-(h-d))+h-d=>0
,h-d=0
如果为负或为零。要开始此列表,首先|
添加a ,因为这些行始终以a开头|
。然后,根据-
或_
是否添加空格i=h
或i<2
。如果为i<2
,则_
添加a。否则,-
如果添加i=h
,则添加a;如果i>h
或i<h
或,则添加空格i>2
。做出此决定后,将w-2
添加所选字符的编号。此后,|
添加另一个,然后添加一个i-1
或d
多个空格。如果i>h-(h-d)
,则d
多个空格。除此以外,i-1
添加空格数。最后,所有这些都以a |
或a结束 a/
,|
如果添加i>h-(h-d)
,/
则添加,如果添加,则添加i<=h-(h-d)
。对于3x2x3
棱镜,列表b
返回:
|-| /
|_|/
创建2个列表后,最终使用加上新的文字行(\n
)'\n'.join()
。这是您完成的棱镜,在这种情况下,将如下所示:
/-/|
/ / |
/ / /
|-| /
|_|/