Minotaur의 주택 개선


42

Minotaur의 주택 개선

크레타 탄 미로는 그리는 것이 매우 쉽습니다. 대칭 모양 (여기서는 빨간색)으로 시작하십시오. 해당 라인의 모든 엔드 포인트를 '노드'라고합니다. 그런 다음 아치를 그리기 시작합니다 (검은 색). 첫 번째 노드는 항상 맨 위 중간 노드에서 시작하여 오른쪽 옆에있는 노드에 연결 한 다음 이전 아치에 가장 가까운 두 개의 노드가 연결됩니다. 이것은 모든 노드가 커버 될 때까지 반복됩니다.

gif

이제이 개념을 일반화 할 수 있습니다 L. 더 많은 모양 을 추가하여 새로운 초기 패턴을 쉽게 생성 할 수 있습니다 . 초기 모양을 다음과 같이 열거했습니다.

정도

가장 왼쪽의 패턴은 0 도의 크레타 섬 미로를 생성합니다 . 다음은 1도 (원본) 등 의 크레타 섬 미로를 만듭니다 .

태스크

음수가 아닌 정수가 주어지면 n, 프로그램은 크레타 미로 정도의 ASCII 표현을 출력해야합니다 n. 후행 공백 / 줄 바꾸기는 중요하지 않습니다. 코드 작동 방식에 대한 간단한 설명을 포함해야합니다.

크레타 섬의 원래 순도 (1도)의 결과는 다음과 같습니다.

+-----------------------------+
| +-------------------------+ |
| | +---------------------+ | |
| | | +-----------------+ | | |
| | | | +-------------+ | | | |
| | | | | +---------+ | | | | |
| | | | | | +-----+ | | | | | |
| | | | | | | +-+ | | | | | | |
| | | | | + | | | + | | | | | |
| | | | +---+ | +---+ | | | | |
| | | +-------+-------+ | | | |
| | +-------+ | +-------+ | | |
| +-------+ | | | +-------+ | |
+-----------+ | +-----------+ |
              +---------------+

초기 패턴 :

+ | | | +
--+ | +--
----+----
--+ | +--
+ | | | +

0 도의 크레 티안 미로는 다음과 같아야합니다.

+-------------+ 
| +---------+ | 
| | +-----+ | | 
| | | +-+ | | | 
| | + | + | | | 
| +---+---+ | | 
+---+ | +---+ | 
      +-------+ 

초기 패턴 :

+ | +
--+--
+ | +

답변:


10

펄 5, 349 바이트

say$p="| "x$_,"+","-"x(16*$n-4*$_+13),"+ $p"for 0..4*($n=pop)+3;say$p="| "x(3*$n+2),"+ | ","| "x2x$n,"+ $p|";$p=~s/..//,$q="-"x(4*$_-1),say"$p+$q+ ","| "x(2*$n-2*$_+1),"+$q+ $p|"for 1..$n;$p=~s/..//;say$p,("+---"."-"x4x$n)x2,"+ $p|";$p=~s/..//,$q="-"x(4*$n+3)."-"x4x$_,say"$p+$q+ | ","| "x2x($n-abs$_),"+$q+ $p|"for-$n..$n;say" "x(8*$n+6),"+----$q+"

( n 을 명령 행 인수로 전달하십시오.)

6 개의 섹션으로 미로를 한 ​​줄씩 계산합니다.

  • 처음 4n + 4 줄,
  • 다음 줄 (없는 유일한 줄 -),
  • 다음 n 줄
  • 다음 줄 (초기 패턴의 중간에있는 줄)
  • 다음 2n + 1 줄
  • 마지막 줄 (공백이있는 줄).

6

파이썬 3.5 703 695 676 648 587 581 542 535 500 486 462 431 423 411 바이트 :

( 55 바이트 절약에 대한 조언을 위해 @flawr에게 감사합니다 (486-> 431)! )

def j(r):R=range;Z=zip;B=r+r+2;P,M='+-';X='| ';q=[*Z(R(0,B-1,2),R(B-1,0,-2))];L=r+1;A=2+r;print('\n'.join([X*w+P+M*v+P+' |'*w for v,w in Z(R(4*L*4-3,0,-4),R(4*L))]+[X*g+P*o+M*k+u+M*k+P*o+' |'*-~g for g,o,k,u in Z([*R(4*L-A,0,-1),*R(4*L-A)],[0]+[1]*(3*r+2),[0,*R(1,4*L,2),*R(4*L+1,11*r,2)],[M*y+'+ '+X*b+P+M*y for y,b in q]+[M*B+P+M*B]+[M*y+'+ '+X*b+P+M*y for y,b in q[::-1]+q[1:]])]+[' '*(8*r+6)+P+M*(8*r+7)+P]))

타이틀에 대한 경쟁자는별로 없지만 여전히 샷을 주었고 완벽하게 작동합니다. 나는 시간이 지남에 따라 더 짧아 지려고 노력할 것이지만, 지금은 그것을 좋아하고 더 행복해질 수 없습니다.

온라인으로 사용해보십시오! (Ideone) (명확한 온라인 컴파일러 제한 때문에 여기에서 약간 다르게 보일 수 있지만 여전히 동일합니다.)

설명:

이 설명의 목적 상, 위의 함수가 입력 r과 동일하게 실행되었다고 가정합니다 1. 기본적으로 무슨 일이 일어나고 있는지 단계별로 말하면 ...

  1. q=[*Z(R(0,B-1,2),R(B-1,0,-2))]

    지퍼 목적은 q2 범위의 범위 내의 모든 2 정수 이루어진 오브젝트 하나로 만들어 0=>r+r+1범위마다 2 정수 이루어진 다른 r+r+1=>0. 이것은 특정 정도의 크레타 탄 미로의 모든 시작 패턴이 항상 -각 라인에 짝수를 갖기 때문 입니다. 예를 들어, cretan labyrinth of degree의 1경우 r+r+1equals 3이므로 패턴은 항상 0대시로 시작하고 그 뒤에 4(2 + 2) 대시 가있는 다른 행이 시작됩니다 . 이 zip 객체는 r+1미로 패턴 의 첫 번째 라인에 사용됩니다 .

    참고 : 유일한 이유는 q목록입니다 때문입니다 나머지에서 분리 q몇 번 참조 및 첨자, 그리고 반복을 많이 저장하고 나는 단순히 우편 객체를 생성, 첨자 허용되는 q목록의 형태로.

  2. print('\n'.join([X*w+P+M*v+P+' |'*w for v,w in Z(R(4*L*4-3,0,-4),R(4*L))]+[X*g+P*o+M*k+u+M*k+P*o+' |'*-~g for g,o,k,u in Z([*R(4*L-A,0,-1),*R(4*L-A)],[0]+[1]*(3*r+2),[0,*R(1,4*L,2),*R(4*L+1,11*r,2)],[M*y+'+ '+X*b+P+M*y for y,b in q]+[M*B+P+M*B]+[M*y+'+ '+X*b+P+M*y for y,b in q[::-1]+q[1:]])]+[' '*(8*r+6)+P+M*(8*r+7)+P]))

    이것은 미로가 만들어지고 조립되는 마지막 단계입니다. 여기에서 첫 번째 4*r+1는 미로 의 상단 라인으로 구성되고 두 번째는 미로의 중간 3*r+3라인 으로 구성되고 두 번째 목록은 미로의 가장 마지막 라인으로 구성되는 마지막 목록은 줄 바꿈 ( \n)으로 결합됩니다. 하나의 긴 끈. 마지막으로, 전체 미로로 구성된이 거대한 끈이 인쇄됩니다. 이 2 개의 목록과 1 개의 문자열에 실제로 포함 된 내용에 대해 더 자세히 살펴 보겠습니다.

    • 첫 번째 목록은 다른 압축 된 객체가 목록 이해에 사용되어 선행 |또는 +기호, 범위에있는 홀수의 대시 0=>4*(r+1), 후행 |또는 +기호 및 개행 ( \n)이 있는 각 행을 하나씩 하나씩 만드는 데 사용됩니다 . 학위 1미로의 경우이 목록은 다음을 반환합니다.

      +-----------------------------+
      | +-------------------------+ |
      | | +---------------------+ | |
      | | | +-----------------+ | | |
      | | | | +-------------+ | | | |
      | | | | | +---------+ | | | | |
      | | | | | | +-----+ | | | | | |
      | | | | | | | +-+ | | | | | | |
      
    • 두 번째 목록은 4 개의 목록을 포함하는 zip 객체로 구성되며 각 목록은 선행 / 트레일 링 |기호 수, +기호 수, 대시 수 및 마지막으로 첫 번째 r+1행 을 포함하는 마지막 목록 에 해당합니다. zip 객체 q, 패턴 중간에있는 선 (없는 패턴 |) 및 r+2대칭 패턴 의 마지막 선에 따라 작성된 패턴. 이 특정 경우이 목록의 zip 객체에 사용 된 마지막 목록은 다음을 반환합니다.

      + | | | +
      --+ | +--
      ----+----
      --+ | +-- 
      + | | | + 
      --+ | +--  <- Last line created especially for use in the middle of the labyrinth itself.
      

      따라서 1도 미로의 경우이 전체 목록은 다음을 반환합니다.

      | | | | | + | | | + | | | | | |
      | | | | +---+ | +---+ | | | | |
      | | | +-------+-------+ | | | |
      | | +-------+ | +-------+ | | |
      | +-------+ | | | +-------+ | |
      +-----------+ | +-----------+ | <- Here is where the extra line of the pattern is used.
      
    • 마지막 줄이 만들어지는이 최종 목록. 여기서,리스트 P공간 수의 마지막 라인의 제 1 세그먼트 (제 1 공간 이전의 세그먼트) 길이 가 생성된다. 그런 다음 같은 줄의 마지막 세그먼트 (끝 세그먼트) + 4 개의 대시 수를 추가합니다. 이들 앞에는 단일 +기호 가옵니다 . 1도 미로의 경우이 마지막 목록은 다음을 반환합니다.

                    +---------------+
      

    이 모든 것을 결합한 후이 단계는 완료된 미로를 반환합니다. 1도 미로의 경우 마침내 다음을 반환합니다.

    +-----------------------------+
    | +-------------------------+ |
    | | +---------------------+ | |
    | | | +-----------------+ | | |
    | | | | +-------------+ | | | |
    | | | | | +---------+ | | | | |
    | | | | | | +-----+ | | | | | |
    | | | | | | | +-+ | | | | | | |
    | | | | | + | | | + | | | | | |
    | | | | +---+ | +---+ | | | | |
    | | | +-------+-------+ | | | |
    | | +-------+ | +-------+ | | |
    | +-------+ | | | +-------+ | |
    +-----------+ | +-----------+ |
                  +---------------+
    

1
먼저 정의 R=range하거나 그런 것을 할 수 있습니까? 동일 P='+'합니까?
flawr

1
나는 당신이 말할 황금 기회를 가져야한다고 생각합니다for g,o,k,u in Z
Sherlock9

트윗 담아 가기 좋은 생각! 추가되었습니다. :)
R. Kap
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.