Python 3.5, 703 695 676 648 587 581 542 535 500 486 462 431 423 411 bayt:
( 55 bayt kaydetme önerisi için @flawr'a teşekkür ederiz (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]))
Başlık için pek bir rakip yok, ama yine de bir şans verdim ve mükemmel çalışıyor. Yapabileceğim zamanla daha fazla kısaltmaya çalışacağım, ama şimdilik onu seviyorum ve daha mutlu olamadım.
Çevrimiçi deneyin! (İdeone) (Görünür çevrimiçi derleyici kısıtlamaları nedeniyle burada biraz daha farklı görünebilir. Ancak, yine de aynıdır.)
Açıklama:
Bu açıklamanın amaçları için, yukarıdaki işlevin girişe reşit olarak eşitlendiğini varsayalım 1. Olduğu söyleniyor, temelde olan, adım adım ...
q=[*Z(R(0,B-1,2),R(B-1,0,-2))]
Bir zip nesnesi, qbiri aralıktaki her bir ikinci tam sayıdan 0=>r+r+1ve diğeri aralıktaki her ikinci tam sayıdan oluşan 2 aralık nesnesi ile oluşturulur r+r+1=>0. Bunun nedeni, belirli bir derecede bir Girit labirentinin her başlangıç paterninin her zaman -her satırda eşit bir sayıya sahip olmasıdır . Örneğin, derece bir cretan labirent için 1, r+r+1eşittir 3ve böylece, desen her zaman 0kısa çizgilerle başlar , ardından 4(2 + 2) kısa çizgilerle başlar. Bu zip nesnesi r+1, labirentin düzeninin ilk satırları için kullanılacaktır .
Not: Bunun tek nedeni qbir listedir ve diğerlerinden ayrılmasının nedeni qbirkaç kez başvurulan ve abone olunmasıdır ve çok fazla tekrardan tasarruf etmek ve aboneliğe izin vermek için basitçe qliste şeklinde bir zip nesnesi oluşturdum .
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]))
Bu, labirentin inşa edildiği ve bir araya getirildiği son adımdır. Burada, ilk 4*r+1olarak labirentin üst satırlarından, ikincisi labirentin orta 3*r+3çizgilerinden oluşan üç liste ve en son labirentin son satırından oluşan son liste satır sonları ( \n) ile birleştirilir. bir uzun dize. Son olarak, tüm labirentten oluşan bu büyük dize basılmıştır. Bu 2 listenin ve 1 dizginin gerçekte içerdiği şeye daha fazla girelim:
Bir başka sıkıştırılmış nesnenin liste halinde her satırın birer birer yaratılması için kullanılan birinci liste, satırlar |veya +sembollerle, aralıktaki tuhaf çizgi 0=>4*(r+1), iz |ya da +sembollerle ve ardından bir yeni satırla ( \n). Derece bir 1labirent durumunda , bu liste şöyle döner:
+-----------------------------+
| +-------------------------+ |
| | +---------------------+ | |
| | | +-----------------+ | | |
| | | | +-------------+ | | | |
| | | | | +---------+ | | | | |
| | | | | | +-----+ | | | | | |
| | | | | | | +-+ | | | | | | |
4 liste içeren bir zip nesnesinden oluşan 2. liste ve her liste öncü / iz |sembollerinin sayısına, +sembollerin sayısına, tire sayısına ve son olarak da ilk r+1satırlarını içeren son listeye karşılık gelir . zip nesnesine göre oluşturulan desen, desenin qortasındaki çizgi (olmayan |) ve r+2simetrik desenin son çizgileri. Bu özel durumda, bu listenin zip nesnesinde kullanılan son liste geri dönecektir:
+ | | | +
--+ | +--
----+----
--+ | +--
+ | | | +
--+ | +-- <- Last line created especially for use in the middle of the labyrinth itself.
Bu nedenle, 1 derecelik bir labirent durumunda, bu listenin tamamı geri dönecektir:
| | | | | + | | | + | | | | | |
| | | | +---+ | +---+ | | | | |
| | | +-------+-------+ | | | |
| | +-------+ | +-------+ | | |
| +-------+ | | | +-------+ | |
+-----------+ | +-----------+ | <- Here is where the extra line of the pattern is used.
Son satırın oluşturulduğu bu son liste. Burada, ilk parça Psayısının son satırının ilk bölümü (ilk boşluktan önceki) uzunluğu oluşturulur. Daha sonra, aynı satırın son bölümünün (bitiş bölümü) + 4 çizgi sayısı eklenir, bunların tümü önce gelir ve ardından tek bir +sembol izlenir . Derece 1 labirent durumunda, bu son liste döner:
+---------------+
Bunların hepsini bir araya getirdikten sonra, bu adım sonunda tamamlanan labirenti verir. 1 derecelik bir labirent durumunda, nihayetinde buna geri dönecekti:
+-----------------------------+
| +-------------------------+ |
| | +---------------------+ | |
| | | +-----------------+ | | |
| | | | +-------------+ | | | |
| | | | | +---------+ | | | | |
| | | | | | +-----+ | | | | | |
| | | | | | | +-+ | | | | | | |
| | | | | + | | | + | | | | | |
| | | | +---+ | +---+ | | | | |
| | | +-------+-------+ | | | |
| | +-------+ | +-------+ | | |
| +-------+ | | | +-------+ | |
+-----------+ | +-----------+ |
+---------------+
R=rangemisin? Aynı şey içinP='+'mi?