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 a
e 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 d
linhas da casa. Aqui, i
é cada número no intervalo em 0=>(d-(d-h))+d-h
que d-h=0
se negativo ou zero. Para começar, os d-i
espaç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-2
nú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 i
espaços serão adicionados. Caso contrário, os h-1
espaç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/
3x2x3
prisma, 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=>0
que h-d=0
se 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=h
ou i<2
. Se i<2
, a _
é adicionado. Caso contrário, a -
é adicionado se i=h
, ou um espaço é adicionado se i>h
ou i<h
ou i>2
. Após esta decisão ser tomada, o w-2
número do personagem escolhido é adicionado. Depois disso, outro |
é adicionado e, em seguida, um i-1
oud
número de espaços é adicionado. Se i>h-(h-d)
, então umd
número de espaços são adicionados. Caso contrário, o i-1
nú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 3x2x3
prisma, a lista b
retorna:
|-| /
|_|/
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:
/-/|
/ / |
/ / /
|-| /
|_|/