Python 3.5, 328 326 313 305 295 248 байт
( Дякую Кевіну Лау за пораду щодо зменшення розміру потрійних заяв! )
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). Давайте назвемо їх відповідно списком aта списком 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призми це повернеться за списком 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мінус або нуль. Щоб розпочати цей список, спочатку |додається а, оскільки ці рядки завжди починаються з а |. Потім, або простір, -або _додається в залежності від того чи ні , i=hабо i<2. Якщо i<2, тоді _додається а. В іншому випадку, -додається чи i=h, або пробіл додається , якщо i>hабо i<hабо i>2. Після прийняття цього рішення w-2додається номер обраного символу. Після цього |додається інше , а потім додається i-1або dчисло, або кількість пробілів. Якщо i>h-(h-d), то аdкількість пробілів додано. В іншому випадку i-1додається кількість пробілів. Нарешті, це все доповнено або a, |або a /, в якому a |додається if i>h-(h-d), або a /додається if i<=h-(h-d). У разі 3x2x3призми список bповертає:
|-| /
|_|/
Після створення двох списків вони, нарешті, з'єднуються буквально новими рядками ( \n) '\n'.join(). Це ваша завершена призма, і в цьому випадку вийшло б так:
/-/|
/ / |
/ / /
|-| /
|_|/