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()。这是您完成的棱镜,在这种情况下,将如下所示:
/-/|
/ / |
/ / /
|-| /
|_|/