자동 주택 건설업자


15

자동 주택 건설 나노봇이 제조되었으며,이를 코딩하는 것은 당신의 임무입니다.

입력으로 만든 집입니다 7 4 2

  /-----/|
 /     / |
|-----|  |
|     |  |
|     | /
|_____|/

입력은 집의 치수를 포함하는 문자열입니다.

7 너비입니다.

|_____|

---7---

4 높이입니다.

|
|
|
|

2 깊이

 / 
/

이 입력이 주어지면 집을 만들 수 있습니까?

로봇에 맞도록 코드는 가능한 작아야합니다.

노트

입력으로 제공되는 가장 작은 치수는 3 2 2입니다. 프로그램은보다 작은 치수로 무엇이든 할 수 있습니다 3 2 2.

테스트 케이스

3 2 10

          /-/|
         / / |
        / / /
       / / /
      / / /
     / / /
    / / /
   / / /
  / / /
 / / /
|-| /
|_|/


그것은 큐브가 아니기 때문에 내 질문은 충분히 분리되어 있다고 생각합니다. 그래도 문자를 변경할 수 있습니다.

2
더 많은 테스트 사례가 있습니까?
Leaky Nun

1
또한 이것은 좋은 질문입니다. 아직 우리는 하나도 없다고 생각합니다.
Rɪᴋᴇʀ

1
결과는 무엇입니까 3 2 10?
Downgoat

답변:


3

파이썬 2, 128 바이트

w,h,d=input();i=d
while-i<h:c='|/'[i>0];print' '*i+c+'- _'[(d>i!=0)+(h+i<2)]*(w-2)+c+' '*min(d-i,h-1,w+1,h-1+i)+'/|'[d-i<h];i-=1

행별로 인쇄합니다. 행 인덱스 i는에서 d까지 카운트 다운 됩니다 -h+1.


다음으로 대체 ' '*min(d-i,h-1,w+1,h-1+i)하여 3 바이트를 (' '*d)[max(0,i):h-1+i]
자를

1

루비, 145 바이트

문자열 목록을 반환합니다. 목록의 각 요소는 한 줄에 해당합니다. 여러 줄 문자열을 반환해야하는 *$/경우 마지막 대괄호 바로 앞에 추가 할 3 바이트를 추가하십시오 .

->w,h,d{s=' ';(0..m=d+h-1).map{|i|(i<d ?s*(d-i)+?/:?|)+(i<1||i==d ??-:i==m ??_ :s)*(w-2)+(i<d ? ?/:?|)+(i<h ?s*[i,d].min+?|:s*[m-i,h-1].min+?/)}}

1

자바 스크립트 (ES6), 169 바이트

(w,h,d)=>[...Array(d+h--)].map((_,i)=>` `[r=`repeat`](i<d&&d-i)+(c=`|/`[+(i<d)])+` _-`[i&&i-d?h+d-i?0:1:2][r](w-2)+c+` `[r]((i<d?i:d)-(i>h&&i-h))+`|/`[+(i>h)]).join`\n`

여기서 \n리터럴 개행 문자를 나타냅니다. 설명:

(w,h,d,)=>                          Parameters
[...Array(d+h--)].map((_,i)=>       Loop over total height = d + h
 ` `[r=`repeat`](i<d&&d-i)+         Space before roof (if applicable)
 (c=`|/`[+(i<d)])+                  Left wall/roof edge
 ` _-`[i&&i-d?h+d-i?0:1:2][r](w-2)+ Space, floor or eaves between walls
 c+                                 Right wall/roof edge (same as left)
 ` `[r]((i<d?i:d)-(i>h&&i-h))+      Right wall
 `|/`[+(i>h)]                       Back wall/floor edge
).join`                             Join everything together
`

편집 : @jrich 덕분에 2 바이트가 절약되었습니다.


,r='repeat'전면에서를 제거하고 첫 번째 [r][r='repeat']
jrich로

@jrich 고마워요, 원래 가지고 있었고 ,r=(n,c=` `)=>c.repeat(n)압정을 바꿀 때 재배치의 가능성을 간과했습니다.
Neil

1

파이썬 224 301 297 바이트

(이제 1x1x1을 포함한 모든 상자에서 작동합니다)

l,w,h=input()
s,r,d,v,R,x=" "," - ","/","|",range,(l*3-1)
print s*(w+1)+r*l
for n in R(w):
    if n<h:e,c=v,n
    else:e,c=d,h
    print s*(w-n)+d+s*x+d+s*c+e
if h-w>=1:e,c=v,w
elif w>h:e,c=d,h
else:e,c=d,w
print s+r*l+s*c+e
for n in R(h):
    if h>w+n:e,c=v,w
    else:e,c=d,h-n-1
    print v+s*x+v+s*c+e
print r*l

설명:

l (길이), h (높이), w (폭)의 세 상수를받습니다.

몇 개의 샘플 상자를 보면 간격에서 패턴을 찾을 수 있습니다.

3 x 4 x 3 상자의 경우 숫자를 사용하여 섹션 사이의 간격을 나타냅니다.

1234 -  -  - 
123/12345678/|
12/12345678/1|
1/12345678/12|
1 -  -  - 123|
|12345678|123/
|       8|12/
|       8|1/
|       8|/
 -  -  - 

맨 위 행에는 4 개의 공백이 있거나 w + 1입니다. 다음 3 행에는 w-(1 * x)가 있습니다. X는 선입니다.

이것은 모든 상자의 모든 줄에서 계속되는 패턴입니다. 따라서 패턴에 맞는 공간 수를 곱하여이 라인을 쉽게 프로그래밍 할 수 있습니다.

다음은 5 x 5 x2 상자의 샘플입니다.

 123 -  -  -  -  -
 12/12345678912345/|
 1/              /1|
 1 -  -  -  -  - 12|
 |              |12|
 |              |12|
 |              |12|
 |              |1/
 |12345678912345|/
  -  -  -  -  -

당신은 아마 골프를 계속해야합니다.
Rɪᴋᴇʀ

또한 w,h,l=input()이 기능을 할당 하거나 만들어야합니다.
Rɪᴋᴇʀ

프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다! 모든 제출은 STDIN에서 읽고 STDOUT에 쓰는 전체 프로그램이거나 인수 및 리턴 값을 허용하는 함수 여야합니다. 우리는 또한 게시 시점에 우승을하기 위해 진지한 경쟁자가 될 것을 요구합니다. 즉, 코드 골프에 대해 골판지 또는 부분적으로 골판을 풀지 않은 솔루션을 허용하지 않습니다.
Alex A.

이 코드를 here으로 실행 하면 출력에 여분의 공백이 있습니다.
DJMcMayhem

@DrGreenEggsandHamDJ 수정했습니다! h, w 및 l의 특정 패턴을 설명하지 않았으므로 if 문을 추가했습니다.
JoshK

0

파이썬 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-2if 수의 공백이 리턴됩니다 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<2a _가 추가됩니다. 그렇지 않으면,이 -경우 추가 i=h또는 공백이있는 경우 추가 i>h또는 i<hi>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(). 이것이 완성 된 프리즘이며,이 경우 다음과 같이 보일 것입니다.

       /-/|
      / / |
     / / /
    |-| /
    |_|/

1
파이썬 부울은 정수로 평가되는데, 이는 대부분의 삼항을와 같은 것으로 압축 할 수 있음을 의미합니다 '-_'[f<2]. 마지막으로, R=range;S,V,L=' |/'문자열은 그 상황에서 기꺼이 포장을 풀기 때문에 초기 변수를 할당하는 작업입니다.
Value Ink

신경 쓰지 마라, 나는 연산자가 파이썬에 존재하지 않는다는 것을 잊었다. 그러나 나머지는 작동해야한다!
가치 잉크 23

@ KevinLau-notKenny 와우, 팁 주셔서 감사합니다! :) 나는 삼항 표현이 그런 식으로 표현 될 수 있다는 것을 몰랐다!
R. Kap

변수를 수정하지 않는 한이 기법을 삼항에 사용할 수 있습니다. 예를 들어, a=1 if b<9 else c=5다음과 같이 표현 될 수없는 [a=1,c=5][b<9]당신이 모두 수정 끝날테니까 ac. 다음은 PPCG Python 골프 팁 페이지입니다. codegolf.stackexchange.com/questions/54/…
Value Ink

아직도 거기에 하나의 삼항이 있습니다 '_'if f<2else' -'[f==h]. 부울은 정수로 평가되므로이 삼항을 "고정"한 다른 것에 "연쇄"할 수 [' -'[f==h],'_'][f<2]있습니다. 또한 S,V,L=' |/'아직 내 팁을 사용 하지 않았습니다.
가치 잉크
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.