Python 3.5, 328 326 313 305 295 248 bytes
( Obrigado a Kevin Lau pela dica sobre como reduzir o tamanho das declarações ternárias! )
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)]))
Recebe a entrada como 3 números inteiros na ordem de width, height, depth. Golf mais com o tempo sempre que posso.
Experimente online! (Ideona)
Explicação:
Para os fins desta explicação, assuma que a função foi executada com os argumentos em (3,2,3)que 3 é a largura ( w), 2 é a altura ( h) e 3 é a profundidade ( d). Dito isto, deixe-me começar mostrando a parte principal de toda a função:
'\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)])
Aqui, as duas listas que compõem a "casa" inteira são criadas e depois unidas por novas linhas literais ( \n). Vamos chamá-los de lista ae lista b, respectivamente, e analisar cada um deles:
Aqui é onde a lista aé criada:
[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))]
Esta lista contém as primeiras dlinhas da casa. Aqui, ié cada número no intervalo em 0=>(d-(d-h))+d-hque d-h=0se negativo ou zero. Para começar, os d-iespaços são adicionados à lista, seguidos por a /e, em seguida, o que for retornado por uma instrução condicional compactada. Nesta declaração condicional, o w-2número de espaços será retornado se i>1. Caso contrário, o mesmo número de -será retornado. Em seguida, eles são seguidos por outro /e, em seguida, espaços, onde o número de espaços agora depende se deve ou não i<=d-(d-h)-1. Se estiver, os iespaços serão adicionados. Caso contrário, os h-1espaços serão adicionados. Finalmente, tudo isso é /complementado por a ou a |, onde é adicionado. Neste caso de um| é adicionado se i<=d-(d-h)-1, caso contrário, um/3x2x3prisma, isso seria retornado por lista a:
/-/|
/ / |
/ / /
Aqui é onde a lista bé criada:
[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)]`
Esta lista contém o restante das linhas do prisma. Nesta lista, ié cada número inteiro no intervalo em (h-(h-d))+h-d=>0que h-d=0se for negativo ou zero. Para iniciar esta lista, primeiro |é adicionado a, pois essas linhas sempre começam com a |. Então, seja um espaço, -ou _é adicionado dependendo se ou não i=hou i<2. Se i<2, a _é adicionado. Caso contrário, a -é adicionado se i=h, ou um espaço é adicionado se i>hou i<hou i>2. Após esta decisão ser tomada, o w-2número do personagem escolhido é adicionado. Depois disso, outro |é adicionado e, em seguida, um i-1oud número de espaços é adicionado. Se i>h-(h-d), então umdnúmero de espaços são adicionados. Caso contrário, o i-1número de espaços será adicionado. Por fim, tudo isso é |complementado com a ou a /, no qual a |é adicionado se i>h-(h-d), ou a /é adicionado se i<=h-(h-d). No caso de um 3x2x3prisma, a lista bretorna:
|-| /
|_|/
Depois que as 2 listas foram criadas, elas finalmente são unidas com literalmente novas linhas ( \n) usando '\n'.join(). Este é o seu prisma completo e, nesse caso, ficaria assim:
/-/|
/ / |
/ / /
|-| /
|_|/