파이썬 3.5 328 326 313 305 295 248 바이트
( 3 진 문장의 크기를 줄이는 팁에 대해 Kevin Lau 에게 감사드립니다 ! )
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
)로 연결됩니다. 그것들을 각각 list a
와 list 라고 부르고 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
공백이 목록에 추가 /
되고 그 다음에 압축 된 조건문에 의해 리턴되는 것이 추가됩니다 . 이 조건문에서 w-2
if 수의 공백이 리턴됩니다 i>1
. 그렇지 않으면 같은 수의 -
반환됩니다. 그런 다음 이것 뒤에 또 다른 /
공백이옵니다. 공백의 수는 이제 여부에 따라 달라집니다 i<=d-(d-h)-1
. 그렇다면 i
공백이 추가됩니다. 그렇지 않으면 h-1
공백이 추가됩니다. 끝으로,이 모든 중 하나가 식사를 마치면됩니다 /
하거나 |
, |
경우에 추가되고 i<=d-(d-h)-1
, 그렇지 않으면,/
추가됩니다. 이 3x2x3
프리즘의 경우 list로 반환됩니다 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
마이너스 또는 제로 경우. 이 목록을 시작하려면 먼저이 |
행이 항상로 시작하므로 먼저 a 가 추가 |
됩니다. 그리고, 어느 하나의 공간, -
또는 _
여부에 따라 첨가 i=h
하거나 i<2
. 인 경우 i<2
a _
가 추가됩니다. 그렇지 않으면,이 -
경우 추가 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 /
가 추가됩니다 i<=h-(h-d)
. 3x2x3
프리즘 의 경우 list b
는 다음을 반환합니다.
|-| /
|_|/
2 개의리스트가 생성 된 후에는을 \n
사용하여 문자 그대로 새 줄 ( )로 연결됩니다 '\n'.join()
. 이것이 완성 된 프리즘이며,이 경우 다음과 같이 보일 것입니다.
/-/|
/ / |
/ / /
|-| /
|_|/