पायथन 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 श्रेणी की वस्तुओं के साथ बनाया जाता है, एक सीमा में हर दूसरे पूर्णांक से 0=>r+r+1
मिलकर बनता है और दूसरा सीमा में हर दूसरे पूर्णांक से मिलकर बनता है r+r+1=>0
। ऐसा इसलिए है क्योंकि एक विशिष्ट डिग्री के क्रेटन भूलभुलैया के हर शुरुआती पैटर्न में हमेशा -
प्रत्येक पंक्ति में एक समान संख्या होगी । उदाहरण के लिए, डिग्री 1
, r+r+1
बराबरी के क्रेटन भूलभुलैया के लिए 3
, और इस प्रकार, इसका पैटर्न हमेशा 0
डैश के साथ शुरू होगा , इसके बाद एक और लाइन 4
(2 + 2) डैश के साथ होगी। यह ज़िप ऑब्जेक्ट r+1
भूलभुलैया के पैटर्न की पहली लाइनों के लिए उपयोग किया जाएगा ।
नोट: केवल कारण q
एक सूची है और बाकी से अलग है क्योंकि q
कई बार संदर्भित है और subscripted, और पुनरावृत्ति का एक बहुत बचाने के लिए और subscripting अनुमति देते हैं, मैं बस एक ज़िप वस्तु बनाया 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
भूलभुलैया के मामले में , यह सूची वापस आती है:
+-----------------------------+
| +-------------------------+ |
| | +---------------------+ | |
| | | +-----------------+ | | |
| | | | +-------------+ | | | |
| | | | | +---------+ | | | | |
| | | | | | +-----+ | | | | | |
| | | | | | | +-+ | | | | | | |
2 सूची, जिसमें 4 सूचियों वाली एक ज़िप ऑब्जेक्ट होती है, और प्रत्येक सूची अग्रणी / अनुगामी |
प्रतीकों की संख्या, +
प्रतीकों की संख्या, डैश की संख्या और अंत में अंतिम सूची से मेल खाती है , जिसमें पहली r+1
पंक्ति होती है पैटर्न जिप ऑब्जेक्ट के अनुसार बनाया गया है, पैटर्न के q
बीच में रेखा (कोई नहीं के साथ एक |
), और r+2
सममित पैटर्न की अंतिम लाइनें। इस विशिष्ट मामले में, इस सूची की ज़िप ऑब्जेक्ट में प्रयुक्त अंतिम सूची वापस आ जाएगी:
+ | | | +
--+ | +--
----+----
--+ | +--
+ | | | +
--+ | +-- <- 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
में रिक्त स्थान की संख्या बनाई जाती है। फिर, एक ही पंक्ति के अंतिम खंड (समाप्ति खंड) की लंबाई + 4 संख्या में डैश जोड़े जाते हैं, जिनमें से सभी पूर्ववर्ती हैं और एक ही +
प्रतीक द्वारा पीछा किया जाता है । डिग्री 1 भूलभुलैया के मामले में, यह अंतिम सूची रिटर्न करती है:
+---------------+
इन सभी को एक साथ मिलाने के बाद, यह कदम आखिरकार पूरा हो चुका है। 1 डिग्री भूलभुलैया के मामले में, यह अंत में इसे वापस करेगा:
+-----------------------------+
| +-------------------------+ |
| | +---------------------+ | |
| | | +-----------------+ | | |
| | | | +-------------+ | | | |
| | | | | +---------+ | | | | |
| | | | | | +-----+ | | | | | |
| | | | | | | +-+ | | | | | | |
| | | | | + | | | + | | | | | |
| | | | +---+ | +---+ | | | | |
| | | +-------+-------+ | | | |
| | +-------+ | +-------+ | | |
| +-------+ | | | +-------+ | |
+-----------+ | +-----------+ |
+---------------+
R=range
या ऐसा कुछ? उसी के लिएP='+'
?