Python 3.5, 703 695 676 648 587 581 542 535 500 486 462 431 423 411 byte:
( Cảm ơn @flawr đã tư vấn về cách lưu 55 byte (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]))
Không có nhiều ứng cử viên cho danh hiệu, nhưng tôi vẫn cho nó một shot, và nó hoạt động hoàn hảo. Tôi sẽ cố gắng rút ngắn nó nhiều hơn theo thời gian mà tôi có thể, nhưng bây giờ, tôi yêu nó và không thể hạnh phúc hơn.
Hãy thử trực tuyến! (Ideone) (Có thể trông hơi khác một chút ở đây vì những hạn chế của trình biên dịch trực tuyến rõ ràng. Tuy nhiên, nó vẫn rất giống nhau.)
Giải trình:
Đối với mục đích của giải thích này, hãy giả sử rằng hàm trên được thực thi với đầu vào, r
bằng 1
. Điều đó đang được nói, về cơ bản những gì đang xảy ra, từng bước một, là ...
q=[*Z(R(0,B-1,2),R(B-1,0,-2))]
Một đối tượng zip q
, được tạo với 2 đối tượng phạm vi, một đối tượng bao gồm mọi số nguyên thứ hai trong phạm vi 0=>r+r+1
và một đối tượng khác bao gồm mọi số nguyên thứ hai trong phạm vi r+r+1=>0
. Điều này là do mỗi mô hình bắt đầu của một mê cung cretan ở một mức độ cụ thể sẽ luôn luôn có một số chẵn -
trong mỗi dòng. Ví dụ, đối với một mê cung độ 1
, r+r+1
bằng 3
, và do đó, mẫu của nó sẽ luôn bắt đầu bằng 0
dấu gạch ngang, tiếp theo là một dòng khác với dấu gạch ngang 4
(2 + 2). Đối tượng zip này sẽ được sử dụng cho các r+1
dòng đầu tiên của mẫu mê cung.
Lưu ý: Các chỉ lý do q
là danh sách và tách ra khỏi phần còn lại là vì q
được tham chiếu một vài lần và subscripted, và để tiết kiệm rất nhiều sự lặp lại và cho phép subscripting, tôi chỉ đơn giản là tạo ra một đối tượng zip q
dưới dạng một danh sách.
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]))
Đây là bước cuối cùng, trong đó mê cung được xây dựng và đặt lại với nhau. Ở đây, ba danh sách, danh sách đầu tiên bao gồm các 4*r+1
dòng trên cùng của mê cung, danh sách thứ hai bao gồm các 3*r+3
dòng giữa của mê cung và danh sách cuối cùng bao gồm dòng cuối cùng của mê cung được nối với nhau, với các dòng ngắt ( \n
) thành một chuỗi dài. Cuối cùng, một chuỗi lớn bao gồm toàn bộ mê cung được in ra. Chúng ta hãy đi sâu hơn vào những gì 2 danh sách này và 1 chuỗi thực sự chứa:
Danh sách thứ nhất, trong đó một đối tượng được nén khác được sử dụng để hiểu danh sách để tạo từng dòng một, với đầu |
hoặc +
ký hiệu, một số dấu gạch ngang lẻ trong phạm vi 0=>4*(r+1)
, dấu |
hoặc +
ký hiệu và sau đó là một dòng mới ( \n
). Trong trường hợp 1
mê cung độ , danh sách này trả về:
+-----------------------------+
| +-------------------------+ |
| | +---------------------+ | |
| | | +-----------------+ | | |
| | | | +-------------+ | | | |
| | | | | +---------+ | | | | |
| | | | | | +-----+ | | | | | |
| | | | | | | +-+ | | | | | | |
Danh sách thứ 2, bao gồm một đối tượng zip chứa 4 danh sách và mỗi danh sách tương ứng với số |
ký hiệu hàng đầu / dấu , số +
ký hiệu, số dấu gạch ngang và cuối cùng là danh sách cuối cùng chứa các r+1
dòng đầu tiên mẫu được tạo theo đối tượng zip q
, dòng ở giữa mẫu (mẫu không có |
) và r+2
dòng cuối cùng của mẫu đối xứng. Trong trường hợp cụ thể này, danh sách cuối cùng được sử dụng trong đối tượng zip của danh sách này sẽ trả về:
+ | | | +
--+ | +--
----+----
--+ | +--
+ | | | +
--+ | +-- <- Last line created especially for use in the middle of the labyrinth itself.
Và do đó, trong trường hợp mê cung 1 độ, toàn bộ danh sách này sẽ trở lại:
| | | | | + | | | + | | | | | |
| | | | +---+ | +---+ | | | | |
| | | +-------+-------+ | | | |
| | +-------+ | +-------+ | | |
| +-------+ | | | +-------+ | |
+-----------+ | +-----------+ | <- Here is where the extra line of the pattern is used.
Danh sách cuối cùng này, trong đó dòng cuối cùng được tạo ra. Ở đây, đoạn đầu tiên (đoạn trước P
khoảng trắng đầu tiên) của dòng danh sách cuối cùng của số khoảng trắng được tạo. Sau đó, độ dài của đoạn cuối cùng (đoạn kết thúc) của cùng một dòng + 4 số dấu gạch ngang được thêm vào, tất cả đều được đặt trước và theo sau là một +
ký hiệu duy nhất . Trong trường hợp mê cung cấp 1, danh sách cuối cùng này trả về:
+---------------+
Sau khi kết hợp tất cả lại với nhau, bước này cuối cùng cũng trả lại mê cung đã hoàn thành. Trong trường hợp mê cung 1 độ, cuối cùng nó sẽ trả về điều này:
+-----------------------------+
| +-------------------------+ |
| | +---------------------+ | |
| | | +-----------------+ | | |
| | | | +-------------+ | | | |
| | | | | +---------+ | | | | |
| | | | | | +-----+ | | | | | |
| | | | | | | +-+ | | | | | | |
| | | | | + | | | + | | | | | |
| | | | +---+ | +---+ | | | | |
| | | +-------+-------+ | | | |
| | +-------+ | +-------+ | | |
| +-------+ | | | +-------+ | |
+-----------+ | +-----------+ |
+---------------+
R=range
hoặc một cái gì đó như thế? Giống nhau choP='+'
?