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()
. Це ваша завершена призма, і в цьому випадку вийшло б так:
/-/|
/ / |
/ / /
|-| /
|_|/