मिनोटौर के लिए गृह सुधार


42

मिनोटौर के लिए गृह सुधार

क्रेटन भूलभुलैया काफी आसान है। बस एक सममित आकृति से शुरू करें (यहां लाल रंग में)। आइए हम उन लाइनों के सभी समापन बिंदुओं को 'नोड' कहते हैं। फिर आप मेहराब (काला) खींचना शुरू करते हैं: पहले एक मार्ग शीर्ष मध्य नोड में शुरू होता है और दाईं ओर इसके बगल में नोड से जुड़ता है, फिर पिछले मेहराब के करीब दो नोड जुड़े हुए हैं। यह दोहराया जाता है जब तक सभी नोड्स को कवर नहीं किया जाता है।

gif

अब हम इस अवधारणा को सामान्य कर सकते हैं: हम अधिक Lआकार जोड़कर आसानी से नए प्रारंभिक पैटर्न उत्पन्न कर सकते हैं । मैंने प्रारंभिक आकृतियों को निम्न प्रकार से बताया:

डिग्री

सबसे बाएं पैटर्न डिग्री 0 के क्रेटन भूलभुलैया का उत्पादन करेंगे । अगले एक डिग्री 1 (मूल एक) के एक क्रेटन भूलभुलैया पैदा करेगा आदि।

कार्य

एक nonnegative पूर्णांक को देखते हुए n, आपके कार्यक्रम को डिग्री के क्रेटन भूलभुलैया के एएससीआई उत्पादन का उत्पादन करना चाहिए n, जिसे निम्नलिखित उदाहरणों में दिखाया गया है। ट्रेलिंग स्पेस / न्यूलाइन्स कोई मायने नहीं रखते। आपको एक संक्षिप्त विवरण शामिल करना होगा कि आपका कोड कैसे काम करता है।

उदाहरण

मूल क्रेटन भूलभुलैया (डिग्री 1) के लिए आउटपुट निम्न है:

+-----------------------------+
| +-------------------------+ |
| | +---------------------+ | |
| | | +-----------------+ | | |
| | | | +-------------+ | | | |
| | | | | +---------+ | | | | |
| | | | | | +-----+ | | | | | |
| | | | | | | +-+ | | | | | | |
| | | | | + | | | + | | | | | |
| | | | +---+ | +---+ | | | | |
| | | +-------+-------+ | | | |
| | +-------+ | +-------+ | | |
| +-------+ | | | +-------+ | |
+-----------+ | +-----------+ |
              +---------------+

प्रारंभिक पैटर्न:

+ | | | +
--+ | +--
----+----
--+ | +--
+ | | | +

डिग्री 0 की क्रेटियन भूलभुलैया इस तरह दिखनी चाहिए:

+-------------+ 
| +---------+ | 
| | +-----+ | | 
| | | +-+ | | | 
| | + | + | | | 
| +---+---+ | | 
+---+ | +---+ | 
      +-------+ 

प्रारंभिक पैटर्न:

+ | +
--+--
+ | +

जवाबों:


10

पर्ल 5, 349 बाइट्स

say$p="| "x$_,"+","-"x(16*$n-4*$_+13),"+ $p"for 0..4*($n=pop)+3;say$p="| "x(3*$n+2),"+ | ","| "x2x$n,"+ $p|";$p=~s/..//,$q="-"x(4*$_-1),say"$p+$q+ ","| "x(2*$n-2*$_+1),"+$q+ $p|"for 1..$n;$p=~s/..//;say$p,("+---"."-"x4x$n)x2,"+ $p|";$p=~s/..//,$q="-"x(4*$n+3)."-"x4x$_,say"$p+$q+ | ","| "x2x($n-abs$_),"+$q+ $p|"for-$n..$n;say" "x(8*$n+6),"+----$q+"

(पास एन कमांड लाइन तर्क के रूप में।)

छह खंडों में भूलभुलैया रेखा-दर-पंक्ति की गणना करता है:

  • पहली 4n + 4 लाइनें,
  • अगली पंक्ति (बिना लाइन वाली एकमात्र रेखा -),
  • अगली एन लाइन्स,
  • अगली पंक्ति (प्रारंभिक पैटर्न के मध्य में रेखा),
  • अगली 2n + 1 पंक्ति,
  • अंतिम पंक्ति (अग्रणी स्थानों के साथ रेखा)।

6

पायथन 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। कहा जा रहा है, मूल रूप से क्या हो रहा है, कदम-दर-कदम, है ...

  1. q=[*Z(R(0,B-1,2),R(B-1,0,-2))]

    एक ज़िप ऑब्जेक्ट, q2 श्रेणी की वस्तुओं के साथ बनाया जाता है, एक सीमा में हर दूसरे पूर्णांक से 0=>r+r+1मिलकर बनता है और दूसरा सीमा में हर दूसरे पूर्णांक से मिलकर बनता है r+r+1=>0। ऐसा इसलिए है क्योंकि एक विशिष्ट डिग्री के क्रेटन भूलभुलैया के हर शुरुआती पैटर्न में हमेशा -प्रत्येक पंक्ति में एक समान संख्या होगी । उदाहरण के लिए, डिग्री 1, r+r+1बराबरी के क्रेटन भूलभुलैया के लिए 3, और इस प्रकार, इसका पैटर्न हमेशा 0डैश के साथ शुरू होगा , इसके बाद एक और लाइन 4(2 + 2) डैश के साथ होगी। यह ज़िप ऑब्जेक्ट r+1भूलभुलैया के पैटर्न की पहली लाइनों के लिए उपयोग किया जाएगा ।

    नोट: केवल कारण qएक सूची है और बाकी से अलग है क्योंकि qकई बार संदर्भित है और subscripted, और पुनरावृत्ति का एक बहुत बचाने के लिए और subscripting अनुमति देते हैं, मैं बस एक ज़िप वस्तु बनाया qएक सूची के रूप में।

  2. 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 डिग्री भूलभुलैया के मामले में, यह अंत में इसे वापस करेगा:

    +-----------------------------+
    | +-------------------------+ |
    | | +---------------------+ | |
    | | | +-----------------+ | | |
    | | | | +-------------+ | | | |
    | | | | | +---------+ | | | | |
    | | | | | | +-----+ | | | | | |
    | | | | | | | +-+ | | | | | | |
    | | | | | + | | | + | | | | | |
    | | | | +---+ | +---+ | | | | |
    | | | +-------+-------+ | | | |
    | | +-------+ | +-------+ | | |
    | +-------+ | | | +-------+ | |
    +-----------+ | +-----------+ |
                  +---------------+
    

1
क्या आप शायद पहले परिभाषित कर सकते हैं R=rangeया ऐसा कुछ? उसी के लिए P='+'?
19

1
मुझे लगता है कि आपको कहने का सुनहरा मौका लेना चाहिएfor g,o,k,u in Z
शर्लक

@ शर्लक 9 हाहा! अच्छा विचार! जोड़ा गया। :)
आर। काप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.