파이썬 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
. 기본적으로 무슨 일이 일어나고 있는지 단계별로 말하면 ...
q=[*Z(R(0,B-1,2),R(B-1,0,-2))]
지퍼 목적은 q
2 범위의 범위 내의 모든 2 정수 이루어진 오브젝트 하나로 만들어 0=>r+r+1
범위마다 2 정수 이루어진 다른 r+r+1=>0
. 이것은 특정 정도의 크레타 탄 미로의 모든 시작 패턴이 항상 -
각 라인에 짝수를 갖기 때문 입니다. 예를 들어, cretan labyrinth of degree의 1
경우 r+r+1
equals 3
이므로 패턴은 항상 0
대시로 시작하고 그 뒤에 4
(2 + 2) 대시 가있는 다른 행이 시작됩니다 . 이 zip 객체는 r+1
미로 패턴 의 첫 번째 라인에 사용됩니다 .
참고 : 유일한 이유는 q
목록입니다 때문입니다 나머지에서 분리 q
몇 번 참조 및 첨자, 그리고 반복을 많이 저장하고 나는 단순히 우편 객체를 생성, 첨자 허용되는 q
목록의 형태로.
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도 미로의 경우 마침내 다음을 반환합니다.
+-----------------------------+
| +-------------------------+ |
| | +---------------------+ | |
| | | +-----------------+ | | |
| | | | +-------------+ | | | |
| | | | | +---------+ | | | | |
| | | | | | +-----+ | | | | | |
| | | | | | | +-+ | | | | | | |
| | | | | + | | | + | | | | | |
| | | | +---+ | +---+ | | | | |
| | | +-------+-------+ | | | |
| | +-------+ | +-------+ | | |
| +-------+ | | | +-------+ | |
+-----------+ | +-----------+ |
+---------------+
R=range
하거나 그런 것을 할 수 있습니까? 동일P='+'
합니까?