Python 3.5, 328 326 313 305 295 248 byte
( Terima kasih kepada Kevin Lau untuk tip tentang mengurangi ukuran pernyataan ternary! )
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)]))
Mengambil input sebagai 3 bilangan bulat dalam urutan width, height, depth. Akan golf lebih dari waktu ke waktu dimanapun saya bisa.
Cobalah online! (Ideone)
Penjelasan:
Untuk keperluan penjelasan ini, asumsikan fungsi dieksekusi dengan argumen di (3,2,3)mana 3 adalah lebar ( w), 2 adalah tinggi ( h), dan 3 adalah kedalaman ( d). Yang sedang berkata, izinkan saya mulai dengan menunjukkan bagian utama dari seluruh fungsi:
'\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)])
Di sini, dua daftar yang membentuk seluruh "rumah" dibuat dan kemudian bergabung bersama dengan baris baru secara literal ( \n). Mari kita sebut mereka masing-masing adaftar dan daftar b, dan analisis masing-masing:
Di sinilah daftar adibuat:
[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))]
Daftar ini berisi dbaris pertama rumah. Di sini, iadalah setiap angka dalam kisaran di 0=>(d-(d-h))+d-hmana d-h=0jika negatif atau nol. Untuk memulai, d-ispasi ditambahkan ke daftar, diikuti oleh a /dan kemudian apa pun yang dikembalikan oleh pernyataan kondisional terkompresi. Dalam pernyataan bersyarat ini, w-2jumlah spasi dikembalikan jika i>1. Kalau tidak, jumlah yang sama -dikembalikan. Kemudian, ini ditindaklanjuti oleh yang lain /, dan kemudian spasi, di mana jumlah ruang sekarang tergantung pada apakah atau tidak i<=d-(d-h)-1. Jika ya, maka ispasi ditambahkan. Jika tidak, h-1spasi ditambahkan. Akhirnya, ini semua diakhiri dengan baik a /atau a |, di mana| ditambahkan jika i<=d-(d-h)-1, sebaliknya a/telah ditambahkan. Dalam kasus3x2x3prisma, ini akan dikembalikan oleh daftar a:
/-/|
/ / |
/ / /
Di sinilah daftar bdibuat:
[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)]`
Daftar ini berisi sisa garis prisma. Dalam daftar ini, iadalah setiap bilangan bulat dalam kisaran di (h-(h-d))+h-d=>0mana h-d=0jika negatif atau nol. Untuk memulai daftar ini, pertama a |ditambahkan karena baris ini selalu dimulai dengan a |. Kemudian, baik spasi, -atau _ditambahkan tergantung pada apakah atau tidak i=hatau i<2. Jika i<2, maka a _ditambahkan. Jika tidak, -ditambahkan jika i=h, atau ruang ditambahkan jika i>hatau i<hatau i>2. Setelah keputusan ini dibuat, maka w-2jumlah karakter yang dipilih ditambahkan. Setelah ini, yang lain |ditambahkan, dan kemudian salah satu i-1ataud jumlah ruang ditambahkan. Jika i>h-(h-d), maka adjumlah spasi ditambahkan. Jika tidak,i-1jumlah spasi ditambahkan. Akhirnya, ini semua diakhiri dengan a |atau a /, di mana a |ditambahkan jika i>h-(h-d), atau a /ditambahkan jika i<=h-(h-d). Dalam kasus 3x2x3prisma, daftar bmengembalikan:
|-| /
|_|/
Setelah 2 daftar telah dibuat, mereka akhirnya bergabung dengan baris baru literal ( \n) menggunakan '\n'.join(). Ini adalah prisma lengkap Anda, dan dalam hal ini, akan terlihat seperti ini:
/-/|
/ / |
/ / /
|-| /
|_|/