চলুন অন্ধকূপের একটি মানচিত্র তৈরি করুন


9

অনেক দিন আগে, যখন আমি আরপিজি খেলতে বেশি সময় ব্যয় করছিলাম, তখন কিছু খেলোয়াড়ের মধ্যে অন্যতম বিষয় ছিল দলটির গতিবিধি ট্র্যাক করা এবং সঠিক মানচিত্র আঁকা। সুতরাং আমি ধারণা নিয়ে এসেছি, আপনি ছেলেরা কীভাবে এই সমস্যাটি মোকাবেলা করবেন তা যাচাই করতে।

টাস্কটি কোনও ফাংশন লিখতে হয়, যা দিকনির্দেশগুলির ইনপুট প্যারামিটারের তালিকা হিসাবে নেয় (আপনার পছন্দ মতো কাঠামো হিসাবে পাস হয়েছে) ^v<>, অন্ধকূপটির প্রদর্শন মানচিত্র। ইনপুট জন্য উদাহরণস্বরূপ: >>>vvv<<<^^^আউটপুট হবে:

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

Testcases

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



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


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

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

এটি গল্ফ কোড চ্যালেঞ্জ হিসাবে, সংক্ষিপ্ততম কোডের জয়।

শুভ গল্ফিং

সম্পাদনা দেরীতে সম্পাদনার জন্য দুঃখিত, সম্প্রতি আমার খুব বেশি সময় হয়নি।

চলাচলের ভিত্তিতে মানচিত্র তৈরি করা হয়েছে। এটিতে কেবল এমন করিডোর থাকতে হবে যা চলার সময় পরিদর্শন করা হয়েছিল। সুতরাং একটি বড় ঘর তৈরি করা একটি বৈধ উত্তর হবে না।

মানচিত্রে তিনটি বৈধ প্রতীক রয়েছে:

  • | উল্লম্ব প্রাচীর
  • | অনুভূমিক প্রাচীর
  • + উল্লম্ব এবং অনুভূমিক প্রাচীর ছেদ।

পথের সর্বাধিক দৈর্ঘ্য 255 অক্ষর (তবে যদি আপনি পারেন তবে নিজেকে সীমাবদ্ধ করবেন না)।

আরও পরীক্ষার কেস:

 ><><><><

 +--+
 |  |
 +--+

 >^<v

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

আমি আশা করি এখন সবকিছু পরিষ্কার হয়ে গেছে।


3
আপনাকে কার্যটির একটি বিবরণ সরবরাহ করতে হবে। দুটি পরীক্ষার কেস এমনকি এমনভাবে পরিচালনা করা হয় না যা সামঞ্জস্যপূর্ণ বলে মনে হয় - প্রথমটি কোনও স্পষ্ট কারণ ছাড়াই সংযোগ বিচ্ছিন্ন অঞ্চল যুক্ত করে।
feersum

3
আপনার দ্বিতীয় উদাহরণটির একটি ক্লোজড-অফ রুম রয়েছে, যা আমি প্রথমে ভেবেছিলাম কারণ বাইরের সীমানাটি আয়তক্ষেত্রাকার হওয়া উচিত তবে তৃতীয় উদাহরণটি সেই ধারণাটিকে অস্বীকার করে। পোস্ট করার আগে কোনও চ্যালেঞ্জের প্রতিক্রিয়া জানাতে দয়া করে স্যান্ডবক্স ব্যবহার করুন ।
এল'ইনিয়া স্টারম্যান

2
চমৎকার। আমি এখনও চলাচল থেকে কীভাবে অন্ধকূপটি তৈরি করা হয় সে সম্পর্কে স্পষ্ট হওয়ার পরামর্শ দিই।
এল'েন্ডিয়া স্টারম্যান

1
"প্রদর্শন মানচিত্র" বলতে কী বোঝ? কোনও ফাংশন থেকে মানচিত্র ফেরত দেওয়া অনুমোদিত?
পল স্মিটজ

3
এটি আকর্ষণীয় দেখায়। এটি পুনরায় খোলার জন্য সম্পাদনার কোনও সুযোগ? বিশেষভাবে দেখার মতো বিষয়গুলি: উদাহরণগুলি থেকে দেখে মনে হচ্ছে আপনি আউটপুটের চারপাশে অতিরিক্ত সাদা অংশকে কিছু মনে করেন না তবে এটি পরিষ্কার করা ভাল। এছাড়াও আপনি যদি দেয়ালের উপস্থিতিটি স্পষ্টভাবে বর্ণনা করেন এবং দুধের প্রশ্নের উত্তর দেন তবে এটি প্রশ্নটি যথেষ্ট পরিমাণে পরিষ্কার করা উচিত। আমার মনে হয় আপনি যে জিনিসটি আবৃত করেননি তা হ'ল আউটপুট কী উত্পাদন vvv>>^^^<<করবে (ক্রস? পাইপ?)
ডেভ

উত্তর:


3

জাভাস্ক্রিপ্ট (ES6), 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লুপ রয়েছে যা এম্বেড করা যায় না।
আর্নৌল্ড

তারপরে এবং এর সাথে রিটার্ন কোডগলফ.সটেকেক্সচেঞ্জ.com{eval("}")
a/

@ কয়েস - দুর্ভাগ্যক্রমে, আমি মনে করি যে '\\n'আমি যদি তাই করি তবে আক্ষরিক লাইনব্রেক থেকে বাঁচতে হবে। যদি আমি সঠিকভাবে গণনা করি তবে এটি +1 বাইটের দিকে নিয়ে যায়। অথবা ইওলটিতে লাইনব্রেক এম্বেড করার আরও ভাল কোনও উপায় আছে?
আর্নল্ড

আপনার কেবলমাত্র প্রয়োজন হবে \nযেহেতু টেমপ্লেট স্ট্রিংগুলি আক্ষরিক নতুন লাইনগুলিকে সমর্থন করে তবে এটি এটিকে একই বাইট গণনাতে রেখে দেয়। ওহ ভাল
সাইওস

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)}}'

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

Stdout আউটপুট। এই মানচিত্রের চারপাশে প্যাডিং অনুমোদিত হওয়ার বিষয়টি ব্যবহার করে (চূড়ান্ত অবস্থানটি মাঝখানে রেখে, একটি মানচিত্র তৈরি করে যার প্রান্ত দৈর্ঘ্য 2 * n + 1 রয়েছে)।

ভাঙ্গন

এটি বিপরীতে আর্গুমেন্টগুলি লুপ করে এবং বিপরীতে সরানোর মাধ্যমে কাজ করে। এটি আসলে সত্যটি ব্যবহার করে যে আরগ 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)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.