Advent Challenge 4 : 현재 조립 라인!


12

<< 이전 다음 >>

산타는 엘프가 밤새 훔친 모든 선물을 다시 만들 수있었습니다! 이제 포장용 조립 라인으로 보내야합니다. 그는 일반적으로 엘프들이 좋은 일을하고 있는지 확인하기 위해 조립 라인을 감독하는 카메라를 가지고 있으며 조립 라인 사진은 광고 포스터에서 멋지게 보이기 때문에 [인용 필요]

불행히도 그의 카메라가 고장 났기 때문에 조립 라인이 어떻게 보일지 시뮬레이션을 그려보고 싶습니다!

조립 라인을 최대 효율로 유지하고 오류 또는 고장 위험을 줄이려면 모든 선물 상자의 너비가 동일하여 컨베이어 벨트에 완벽하게 맞습니다.

도전

치수로 표시되는 선물 목록이 제공되면 모든 선물과 함께 컨베이어 벨트를 출력하십시오.

선물은 다음과 같이 그려집니다.

  +----+
 /    /|
+----+ |
|    | +
|    |/
+----+

이 선물의 너비 1, 높이 2 및 길이 4가 있습니다. 더하기 부호는 측면 길이에 포함되지 않으므로 길이 4의 선물은 실제로 6 개의 위치에 걸쳐 있습니다.

모든 선물은 가장 가까운 두 문자 사이에 하나의 공백으로 나란히 그려집니다. 즉, 선물 상자의 왼쪽 아래 모서리는 선물 상자의 길이 l와 너비 가 같으면 w다음 선물 상자의 왼쪽 아래 모서리가 l + w + 4이전 상자의 왼쪽 아래 모서리의 정확한 위치 가됩니다 .

모든 선물 상자를 그린 후에는 마지막 width + 2줄 의 상자 사이의 공간 을 밑줄 로 바꾸어 컨베이어 벨트를 그립니다 .

와 상자에 대한 최종 출력 (l, w, h)[(4, 1, 2), (8, 1, 3), (1, 1, 1)]것입니다 :

           +--------+
  +----+  /        /|
 /    /| +--------+ |   +-+
+----+ | |        | |  / /|
|    | +_|        | +_+-+ +
|    |/__|        |/__| |/
+----+___+--------+___+-+

포맷 사양

요소 중 하나가 전체 목록에서 일관성이있는 3 개의 튜플 목록 (폭)을 선택하거나 현재 너비와 길이를 나타내는 2 개의 튜플 목록을 선택할 수 있습니다. 각 선물의 높이. 입력을 임의의 순서와 합리적인 형식으로 입력 할 수 있지만 선물은 입력과 동일한 순서로 표시되어야합니다.

ASCII 예술에 적합한 출력 형식을 선택할 수 있습니다 (함수에서 반환하는 것을 포함).

테스트 사례

이 테스트 사례는 [(l, w, h), ...]형식 으로 제공 됩니다.

[(4, 1, 2), (8, 1, 3), (1, 1, 1)]:

           +--------+
  +----+  /        /|
 /    /| +--------+ |   +-+
+----+ | |        | |  / /|
|    | +_|        | +_+-+ +
|    |/__|        |/__| |/
+----+___+--------+___+-+

[(5, 3, 4), (8, 3, 1), (1, 3, 7)]:

                               +-+
                              / /|
                             / / |
    +-----+                 / /  |
   /     /|                +-+   |
  /     / |                | |   |
 /     /  |     +--------+ | |   |
+-----+   |    /        /| | |   |
|     |   +___/        / +_| |   +
|     |  /___/        / /__| |  /
|     | /___+--------+ /___| | /
|     |/____|        |/____| |/
+-----+_____+--------+_____+-+

[(0, 0, 0)] (this is the most interesting test case ever :P)

 ++
+++
++

[(8, 3, 0), (0, 3, 8)] (more zero cases)

                   ++
                  //|
                 // |
                //  |
               ++   |
               ||   |
               ||   |
               ||   |
    +--------+ ||   |
   /        /+_||   +
  /        //__||  /
 /        //___|| /
+--------+/____||/
+--------+_____++

규칙

  • 표준 허점 적용
  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
  • 응답이 없습니다

참고 : Advent Of Code 에서이 챌린지 시리즈에 영감을 받았습니다 . 이 사이트와 관련이 없습니다

여기서 첫 번째 도전 과제의 '링크 된'섹션을 보면 시리즈의 모든 도전 과제 목록을 볼 수 있습니다 .


@AdmBorkBork 모든 선물 상자의 너비가 동일합니다
Erik the Outgolfer

1
차콜이 이것을 망칠 수 없다면 , 나는 무엇을할지 모른다.
완전 인간

@totallyhuman 실제로 brainf ** k는이 도전에서 이길 것입니다 : P
HyperNeutrino

이러한 모든 질문의 색인을 작성하기 위해 메타에 게시 할 수 있습니까?
RamenChef

@RamenChef 흠 좋은 생각입니다. 내가 그럴 수도 있습니다 : P
HyperNeutrino

답변:


4

, 96 81 바이트

NθWS«→FυG↗→↙⁺²θ_≔I⪪ι υ≔⊟υπ≔§υ⁰ρ→↗G↑⊕π↗⊕θ→⊕ρ↓⊕π↙⊕θ ↑πP↗⊕θP←⊕ρ↓+↓πF²«↷⁴+ρ↷²+π↷¹+θ↶³

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 입력은 첫 번째 줄의 너비이며, 다음 줄의 다른 치수는 빈 줄로 끝납니다. 설명:

Nθ

너비를 입력하십시오.

WS«

빈 줄에 도달 할 때까지 나머지 줄을 반복합니다.

→FυG↗→↙⁺²θ_

선물 사이에 벨트를 그립니다. u가 한 번 실행하려면이 코드를 일으키는 하나의 요소로 끝나는 나중에 동안 변수는 따라서 첫 번째 패스에서 아무것도하지 않는 빈리스트에 미리 정의되어있다. (을 사용하는 if것은 덜 골프입니다.)

≔I⪪ι υ

공간에서 치수를 분할하고 정수로 캐스트 한 다음에 저장하십시오 u.

≔⊟υπ

마지막 치수를 제거하고에 저장하십시오 p.

≔§υ⁰ρ

첫 번째 치수를에 복사 r하지만 u다음 루프에서 벨트가 그려 지도록 그대로 둡니다 .

→↗G↑⊕π↗⊕θ→⊕ρ↓⊕π↙⊕θ 

벨트가 겹치는 경우를 대비하여 현재 내부를 지 웁니다.

↑πP↗⊕θP←⊕ρ↓+↓π

현재의 내부 선을 그립니다.

F²«↷⁴+ρ↷²+π↷¹+θ↶³

현재의 외부를 반쯤 그린 다음 다른 반을 반복합니다.


1

, 160 154 바이트

153 바이트의 코드, -l플래그의 경우 +1

{YMX:_+B+3MUaRV$.({UwhlWg+^11{a<=h+w?J[sXa-haN[0hh+w]?'-XlWR'+sXlWR("/|"a<h)RV(("+|/"aCMw).sXw)@<MN[ah+w-awh]'_Xw-a+1|s]sXl+w+3}M,y}MUa)R`_ +`'_X#_<|:'_}

이 포함 된 목록의 목록을 가져 오는 함수입니다 [width height length]. 온라인으로 사용해보십시오!

어떻게?

최상위 설명 :

  • 하나의 상자를 나타내는 행 목록을 반환하는 함수를 정의하십시오.
  • 주어진 각 차원 목록에 함수를 매핑
  • 결과 행 목록을 항목 단위로 연결
  • 밑줄이 제대로 작동하도록 정규식 대체로 약간의 사후 처리를 수행하십시오.

의견을 남겨 주시면 더 자세한 설명을 추가하겠습니다.


0

파이썬 2 , 508 바이트

def f(B):
 d=B[0][1]+2;H=max(B)[0]+d+1;W=sum(sum(b[1:])+3for b in B)+len(B);r=[[' ']*i+W*['_']for i in range(d)]+[W*[' ']for _ in' '*H];o=0
 for h,w,l in B:
	for i in range(w+2,1,-1):r[i-1][o+i-2:o+l+i]=[' ']*(l+2)+['/'];r[h+i][o+i-1]=r[h+i][o+l+i]='/'
	r[0][o:o+l+2]=r[h+1][o:o+l+2]=r[w+h+2][o+w+1:o+w+l+3]=['+']+['-']*l+['+']
	for i in range(1,h+1):m=min(i,w)-1;r[i][o:o+l+2+m]=['|']+[' ']*l+['|']+[' ']*m;r[i+w+1][o+l+w+2]='|'
	r[w+1][o+l+w+2]='+';o+=l+w+4
 for l in r[H-1::-1]:print''.join(l).rstrip('_')

온라인으로 사용해보십시오!

의 목록을 가져옵니다 [height, width, length]

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.