Python 3.5, 328 326 313 305 295 248 bajtów
( Podziękowania dla Kevina Lau za poradę na temat zmniejszania wielkości trójkowych oświadczeń! )
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)]))
Pobiera dane wejściowe jako 3 liczby całkowite w kolejności width, height, depth. Będę grał w golfa z czasem, gdziekolwiek będę mógł.
Wypróbuj online! (Ideone)
Wyjaśnienie:
Dla celów tego wyjaśnienia załóżmy, że funkcja została wykonana z argumentami, (3,2,3)gdzie 3 to szerokość ( w), 2 to wysokość ( h), a 3 to głębokość ( d). To powiedziawszy, zacznę od pokazania głównej części całej funkcji:
'\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)])
Tutaj tworzone są dwie listy składające się na cały „dom”, a następnie łączone ze sobą dosłownie nowe linie ( \n). Nazwijmy je odpowiednio listą ai listą bi przeanalizujmy każdą z nich:
Oto gdzie atworzona jest lista :
[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))]
Ta lista zawiera pierwsze dwiersze domu. Tutaj ijest każda liczba z zakresu, w 0=>(d-(d-h))+d-hktórym wartość d-h=0jest ujemna lub zero. Aby rozpocząć, d-ispacje są dodawane do listy, po której następuje a, /a następnie wszystko, co jest zwracane przez skompresowaną instrukcję warunkową. W tej instrukcji warunkowej w-2zwracana jest liczba spacji, jeślii>1 . W przeciwnym razie -zwracana jest ta sama liczba . Następnie następują po nich kolejne /, a następnie spacje, w których liczba spacji zależy teraz od tego, czy i<=d-(d-h)-1. Jeśli tak, ito dodaje się spacje. W przeciwnym razie h-1dodaje się spacje. Wreszcie, wszystko to jest uzupełnione przez a /lub a |, gdzie |dodaje się, jeśli i<=d-(d-h)-1w przeciwnym razie a/jest dodany. W tym przypadku 3x2x3pryzmatu byłby zwracany przez listę a:
/-/|
/ / |
/ / /
Oto gdzie btworzona jest lista :
[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)]`
Ta lista zawiera resztę linii pryzmatu. Na tej liście ijest każda liczba całkowita z zakresu, w (h-(h-d))+h-d=>0którym wartość h-d=0jest ujemna lub zero. Aby rozpocząć tę listę, najpierw |dodaje się a, ponieważ linie te zawsze zaczynają się od |. Następnie, albo przestrzeń, -albo _dodaje się w zależności od tego, czy nie i=hlub i<2. Jeśli i<2, _to dodaje się a. W przeciwnym razie -dodaje się a i=h, lub spację, jeśli i>hlub i<hlub i>2. Po podjęciu tej decyzji w-2dodaje się numer wybranej postaci. Następnie |dodaje się kolejną , a następnie dodaje jedną i-1lub dkilka spacji. Jeśli i>h-(h-d), to adliczba spacji została dodana. W przeciwnym razie i-1dodawana jest liczba spacji. Wreszcie, wszystko to jest uzupełnione albo a |albo a /, w których a |jest dodawane jeśli i>h-(h-d)lub a /jest dodawane jeśli i<=h-(h-d). W przypadku 3x2x3pryzmatu lista bzwraca:
|-| /
|_|/
Po utworzeniu 2 list są one ostatecznie łączone za pomocą dosłownie nowych wierszy ( \n) przy użyciu '\n'.join(). To jest twój ukończony pryzmat i w tym przypadku wyglądałby tak:
/-/|
/ / |
/ / /
|-| /
|_|/