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 r
eş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, q
biri aralıktaki her bir ikinci tam sayıdan 0=>r+r+1
ve 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+1
eşittir 3
ve böylece, desen her zaman 0
kı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 q
bir listedir ve diğerlerinden ayrılmasının nedeni q
birkaç kez başvurulan ve abone olunmasıdır ve çok fazla tekrardan tasarruf etmek ve aboneliğe izin vermek için basitçe q
liste ş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+1
olarak 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 1
labirent 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+1
satırlarını içeren son listeye karşılık gelir . zip nesnesine göre oluşturulan desen, desenin q
ortasındaki çizgi (olmayan |
) ve r+2
simetrik 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 P
sayı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=range
misin? Aynı şey içinP='+'
mi?