चलो कालकोठरी का नक्शा बनाते हैं


9

बहुत समय पहले, जब मैं आरपीजी खेलने में अधिक समय बिता रहा था, उन मुद्दों में से एक जो कुछ खिलाड़ियों के पास था, पार्टी आंदोलन को ट्रैक करना और उचित मानचित्र तैयार करना था। इसलिए मैं विचार के साथ आता हूं, यह जांचने के लिए कि आप लोग इस मुद्दे से कैसे निपटते हैं।

टास्क एक फ़ंक्शन लिखना है, जो निर्देशों की इनपुट पैरामीटर सूची (आपकी पसंद की संरचना के रूप में पारित) ^v<>, कालकोठरी के प्रदर्शन मानचित्र के रूप में लेता है। उदाहरण के लिए इनपुट: >>>vvv<<<^^^आउटपुट होगा:

+----+               +----+
|    |               |>>>v|
| ++ |               |^++v|
| ++ |  because      |^++v|
|    |               |^<<<|
+----+               +----+

परीक्षण के मामलों

>>>>>>vvvvv<<<<^^^>>v



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


^^^^^vvv<<<^^vv>>>>>>>>vv>><<^^^^v>>>>v^<^

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

जैसा कि यह गोल्फ कोड चुनौती है, सबसे छोटा कोड जीतता है।

हैप्पी गोल्फिंग।

EDIT देर से संपादित करने के लिए क्षमा करें, मेरे पास हाल ही में अधिक समय नहीं था।

मानचित्र आंदोलन के आधार पर उत्पन्न होता है। इसमें केवल गलियारे शामिल होने चाहिए जो पैदल चलने के दौरान गए थे। इसलिए एक बड़ा कमरा बनाना एक मान्य उत्तर नहीं होगा।

मानचित्र में तीन वैध प्रतीक हैं:

  • | ऊर्ध्वाधर दीवार
  • | क्षैतिज दीवार
  • + ऊर्ध्वाधर और क्षैतिज दीवार का चौराहा।

पथ की अधिकतम लंबाई 255 वर्ण है (लेकिन यदि आप कर सकते हैं, तो अपने आप को सीमित न करें)।

अधिक परीक्षण के मामले:

 ><><><><

 +--+
 |  |
 +--+

 >^<v

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

मुझे उम्मीद है कि अब सब कुछ स्पष्ट है।


3
आपको कार्य का विवरण प्रदान करना होगा। दो परीक्षण मामलों को इस तरह से भी संभाला नहीं जाता है जो सुसंगत प्रतीत होता है - पहला बिना किसी स्पष्ट कारण के डिस्कनेक्ट किया गया क्षेत्र जोड़ता है।
feersum

3
आपके दूसरे उदाहरण में एक बंद कमरा है, जो मैंने शुरू में सोचा था कि बाहरी सीमा आयताकार होनी चाहिए, लेकिन फिर तीसरा उदाहरण उस विचार को खारिज कर देता है। कृपया पोस्ट करने से पहले एक चुनौती पर प्रतिक्रिया प्राप्त करने के लिए सैंडबॉक्स का उपयोग करें ।
एल'एंडिया स्ट्रैटन

2
अति उत्कृष्ट। मैं अभी भी सुझाव दे रहा हूं कि आंदोलनों से कालकोठरी का निर्माण कैसे किया जाता है।
एल'एंडिया स्ट्रैटन

1
"प्रदर्शन मानचित्र" से आपका क्या अभिप्राय है? क्या किसी फ़ंक्शन से नक्शा वापस करने की अनुमति है?
पॉल शमित्ज़

3
यह दिलचस्प लग रहा है। संपादन का कोई भी मौका इसे फिर से खोलने के लिए? विशेष रूप से देखने के लिए चीजें: उदाहरणों से, ऐसा लगता है कि आप आउटपुट के चारों ओर अतिरिक्त व्हाट्सएप का बुरा नहीं मानते हैं, लेकिन यह स्पष्ट करना अच्छा होगा। इसके अलावा यदि आप स्पष्ट रूप से दीवार की उपस्थिति का वर्णन करते हैं और दूध के प्रश्न का उत्तर देते हैं, तो यह प्रश्न को पर्याप्त रूप से स्पष्ट करना चाहिए। एक बात मुझे लगता है कि आपने कवर नहीं किया है कि आउटपुट क्या vvv>>^^^<<होगा (क्रॉस? पाइप?)
डेव

जवाबों:


3

जावास्क्रिप्ट (ईएस 6), 261 254 243 बाइट्स

s=>{v=Array(w=32);p=526;b=n=>v[n>>5]&(1<<(n&31));B=(n,i)=>b(p+n)|b(p-n)?i:0;[...0+s].map(c=>v[(p+=[0,1,-1,w,-w]['0><v^'.indexOf(c)])>>5]|=1<<(p&31));for(z='',p=0;p<w*w;z+=' |-+'[b(p)?0:B(1,1)|B(w,2)||B(31,3)|B(33,3)],p++%w||(z+=`
`));return z}

JSFiddle


आप returnके ;साथ ,और के {}साथ की जगह से हटा सकते हैं()
Cyoce

@ कोको - इसमें एक forलूप होता है जिसे उस तरह से एम्बेड नहीं किया जा सकता है।
अरनौलद

उसके {साथ eval("और उसके }साथ ")वापसी कोड
14

@ कैश - दुर्भाग्य से, मुझे लगता है कि मुझे शाब्दिक लाइनब्रेक से बचना होगा जैसे '\\n'कि मैं ऐसा करता हूं। अगर मैं सही ढंग से गिनूं, तो वास्तव में +1 बाइट की ओर जाता है। या वहाँ एक बेहतर तरीका है eval में लाइनब्रेक एम्बेड?
Arnauld

आपको केवल तब ही आवश्यकता होगी \nजब टेम्पलेट स्ट्रिंग शाब्दिक नई लाइनों का समर्थन करती है, लेकिन फिर भी इसे उसी बाइट काउंट पर छोड़ दिया जाएगा। ओह अच्छी तरह से
Cycece

3

सी, 246 बाइट्स

n,y,*g,*p;main(c,v)char**v;{for(n=c*2+3,g=calloc(n*n,8),p=g+(n+1)*(c+1);c--;y=*v[c],p-=(y>70?n:1)*(y%5%4?-1:1))*p=1;for(y=n-1;--y;)for(c=n-1;c--;putchar(c?" |-++|-+"[*p?0:p[1]|p[-1]|(p[n]|p[-n])*2|(p[1+n]|p[1-n]|p[n-1]|p[-n-1])*4]:10))p=g+y*n+c;}

उदाहरण के लिए, अलग-अलग वर्णों के रूप में इनपुट लेता है:

./mapper '>' '>' '>' 'v' 'v' 'v' '<' '<' '<' '^' '^' '^'

या अधिक आसानी से, यह (जानबूझकर निर्विवाद!) प्रारूप:

./mapper $(echo '>>>vvv<<<^^^' | fold -w1)

या (बहुत अक्षम) यादृच्छिक इनपुट के लिए:

./mapper $(LC_CTYPE=C tr -dc '0-3' < /dev/urandom | tr '0123' '<>^v' | head -c 10 | fold -w1)

और अंत में, awkफसल का उपयोग करने का अर्थ है कि हम बहुत बड़े हो सकते हैं:

./mapper $(LC_CTYPE=C tr -dc '0-3' < /dev/urandom | tr '0123' '<>^v' | head -c 500 | fold -w1) | awk '/[^ ]/{l=match($0,"\\+");if(l&&(l<L||!L))L=l;v[i++]=$0}END{for(;j<i;){l=v[j++];print substr(l,L,match(l," *$")-L)}}'

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

स्टडआउट करने के लिए आउटपुट। इस तथ्य का उपयोग करता है कि नक्शे के चारों ओर पैडिंग की अनुमति है (एक नक्शा का निर्माण होता है जिसमें किनारे की लंबाई 2 * n + 1 होती है, बीच में अंतिम स्थिति डालती है)।

टूट - फूट

यह रिवर्स में तर्कों पर लूपिंग और रिवर्स में आगे बढ़ने से काम करता है। यह वास्तव में इस तथ्य का उपयोग करता है कि arg 0 प्रोग्राम का नाम है; इससे कोई फर्क नहीं पड़ता कि नाम क्या है, लेकिन यह हमें विशेष हैंडलिंग की आवश्यकता के बिना प्रारंभिक और अंतिम सेल (साथ ही सभी कोशिकाओं के बीच) दोनों का दौरा करने की अनुमति देता है।

n,                                  // Size of internal grid
y,                                  // Loop counter / current character
*g,                                 // Internal grid memory
*p;                                 // Current working pointer
main(c,v)char**v;{                  // K&R style function declaration
    for(                            // Step 1: identify visited cells
        n=c*2+3,                    //  Set output grid size
        g=calloc(n*n,8),            //  Allocate map storage space
        p=g+(n+1)*(c+1);            //  Start at centre
        c--;                        //  Loop over directions in reverse
        y=*v[c],                    //  Get current direction
        p-=(y>70?n:1)*(y%5%4?-1:1)  //  Move in reverse
    )*p=1;                          //  Mark cell visited
    for(y=n-1;--y;)                 // For each row (except edges)
        for(c=n-1;c--;              //   For each column (except edges, +1 for \n)
            putchar(c?" |-++|-+"[   //   Print wall using lookup table
                *p?0:p[1]|p[-1]|(p[n]|p[-n])*2|(p[1+n]|p[1-n]|p[n-1]|p[-n-1])*4
            ]:10)                   //   Or newline
        )p=g+y*n+c;                 //   Set current cell (happens first)
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.