ইন্টারেক্টিভ ম্যাজ সলভার


13

বব অপহরণ করেছে এবং একটি ধাঁধা আটকে আছে। আপনার কাজ হ'ল তাকে উপায় খুঁজে বের করতে সহায়তা করা। তবে এটি যেহেতু খুব অন্ধকার এবং ভয়ঙ্কর গোলকধাঁধা তাই সে কিছুই দেখতে পাচ্ছে না। তিনি কেবল তখনই দেওয়াল অনুভব করতে পারেন যখন তিনি এটির দিকে চলে যান এবং যখন তিনি প্রস্থানটি পেয়েছেন তখন জানেন তবে এর চেয়ে আরও কিছু জানেন না।

যেহেতু তাকে আপনার প্রোগ্রামটি মেমোরি দিয়ে চালাতে হবে, তাই এটি যতটা সম্ভব সংক্ষিপ্ত হতে হবে।

দ্রষ্টব্য: আমি http://acmgnyr.org/year2016/problems.shtml থেকে এই সমস্যাটি নিয়েছি , তবে এটিকে কিছুটা অভিযোজিত করেছি এবং বিচারক প্রোগ্রাম / পরীক্ষার মামলাগুলি নিজে লিখেছি।

সবিস্তার বিবরণী

  • এটি একটি ইন্টারেক্টিভ সমস্যা, সুতরাং আপনার প্রোগ্রামটি আউটপুট স্টাডাউটে চলে যাবে এবং স্টিডিনের প্রতিক্রিয়া গ্রহণ করবে।
  • প্যাচসমূহ তোমার প্রোগ্রাম করতে পারেন আউটপুট এক right, left, down, up
  • এরপরে এটি নিম্নলিখিতগুলির মধ্যে একটি হিসাবে ইনপুট হিসাবে পাবেন:
    • wall- এর অর্থ হ'ল বব কোনও দেয়ালে আঘাত করেছে। বব একই জায়গায় থাকবে।
    • solved- বব বেরিয়েছে! আপনার প্রোগ্রামটি এখন আর কিছু মুদ্রণ না করে প্রস্থান করা উচিত।
    • ok - বব প্রদত্ত দিকটিতে যেতে সক্ষম হয়েছিল।
  • যদি গোলকধাঁধাঁটির কোনও প্রস্থান no exitনা হয় তবে আপনার প্রোগ্রামটি ববকে জানাতে দেয় যে তাকে ছেড়ে দেওয়া উচিত output আপনার প্রোগ্রামটি অন্য কিছু মুদ্রণ না করেই প্রস্থান করা উচিত।
  • যেহেতু বব বেরোনোর ​​তাড়াহুড়া করছে, আপনার প্রোগ্রামটি কোনও বহিরাগত পদক্ষেপ নেওয়া উচিত নয়। অন্য কথায়, আপনার প্রোগ্রামটিকে একই স্কোয়ার থেকে দু'বার একই দিক থেকে সরানোর অনুমতি নেই
  • এটি , তাই সংক্ষিপ্ততম প্রোগ্রামের জয়!

উদাহরণ

নিম্নলিখিত উদাহরণগুলিতে, Sএটি কি প্রারম্ভিক বর্গ, Xপ্রস্থান হয়, #একটি প্রাচীর এবং স্পেসগুলি বৈধ স্কোয়ার। যেহেতু কোনও একক সঠিক উত্তর নেই, এটি সমাধানের উদাহরণ উদাহরণ মাত্র। এছাড়াও নোট করুন যে ধাঁধাটির আঁকাগুলি কেবল দেখার জন্য রয়েছে এবং আপনার প্রোগ্রামটি সেগুলি ইনপুট হিসাবে পাবেন না।

########
#S     #
###### #
     # #
     #X#

right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              wall
down
              ok
right
              wall
down
              ok
right
              wall
down
              solved

#####
# S #
#####

right
              ok
right
              wall
down
              wall
up
              wall
left
              ok
down
              wall
up
              wall
left
              ok
down
              wall
up
              wall
left
              wall
right
              ok
no exit
              solved

###############################
#S                            #
##############       ###      #
             #       #X#      #
             #                #
             ##################

right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              wall
down
              ok
right
              wall
down
              ok
right
              wall
down
              ok
right
              wall
down
              wall
left
              ok
down
              wall
up
              ok
up
              ok
left
              ok
down
              ok
down
              ok
down
              wall
left
              ok
down
              wall
up
              ok
up
              ok
left
              ok
down
              ok
down
              ok
down
              wall
left
              ok
down
              wall
up
              ok
up
              ok
left
              wall
down
              ok
left
              wall
down
              ok
left
              ok
down
              wall
up
              wall
left
              ok
down
              wall
up
              solved

পরীক্ষক প্রোগ্রাম

  • আমি পাইথনে একটি সমাধান চেকার লিখেছি। আপনি এটি https://gist.github.com/Maltysen/f0186019b3aa3812d812f8bb984fee19 এ পাবেন ।
  • এটি চালান python mazechecker.py ./mazesolver
  • এটি কল করা একটি ফোল্ডারে সমস্ত ম্যাজগুলিতে আপনার প্রোগ্রামটি পরীক্ষা করবে mazes
  • মেজগুলি উপরের থেকে একই ফর্ম্যাটে পৃথক ফাইলে রয়েছে।
  • এটি উপরে তালিকাভুক্ত সমস্ত শর্তাদি পরীক্ষা করে এবং আপনার সমাধানটি যদি কোনও লঙ্ঘন করে তবে আপনাকে অবহিত করে।
  • আপনি এটি দিয়ে অতিরিক্ত ডায়াগনস্টিক তথ্য মুদ্রণ করতে পারেন python mazechecker.py -d ./mazesolver
  • আপনি এখানে একটি জিপ করা mazesফোল্ডারটি পেতে পারেন । আপনি চাইলে এতে নিজের নিজস্বও যুক্ত করতে পারেন।

1
সম্ভবত এটি স্পষ্ট করে বলা বাহুল্য যে সমস্যাটি সিসি-বাই-এনএ-এসএ লাইসেন্সের অধীনে প্রকাশিত হয়েছিল এবং সুতরাং আপনার রিমিক্স অগত্যা একই লাইসেন্সের অধীনে।
নিক কেনেডি

3
solvedআউটপুট দেওয়ার সময় আমরা কী পাই no exit? যদি তাই হয় তবে নিয়মের মধ্যে দয়া করে কেবল পরীক্ষার ক্ষেত্রে নয়!
wastl

1
" আপনার প্রোগ্রামটি একই স্কোয়ার থেকে দু'বার একই দিকে অগ্রসর হওয়ার অনুমতি নেই। " এ সম্পর্কে দুটি প্রশ্ন: ১. আমি বলি যে আমি অবস্থান x,yনিয়ে এসেছি up, সাড়া দিয়ে wall, rightআবার সাড়া দিয়ে wall, আমি আবার চেষ্টা upকরতে পারি, বা আমি এখনও এই বর্গ থেকে সরেনি যেহেতু শুধুমাত্র leftএবং downএখনও উপলব্ধ?
কেভিন ক্রুইজসেন

1
২. আসুন বলি আমার এই গোলকধাঁধা আছে । এই প্রবাহের সাথে: ডান (ঠিক আছে); ডান (ঠিক আছে); ডান (প্রাচীর); up (ওকে) ; up (ওকে); up (প্রাচীর); বাম (প্রাচীর); ডাউন (ওকে); ডাউন (ওকে); ডাউন (ওকে); ডাউন (ওকে); ডাউন (প্রাচীর); ডান (প্রাচীর); up (ওকে); up (ওকে); আমি ইতিমধ্যে নির্দিষ্ট বর্গ থেকে আগেই (সাহসী হয়ে) সত্ত্বেও কি আমাকে আবার উপরে উঠার অনুমতি দেওয়া হচ্ছে?
কেভিন ক্রুইজসেন

1
@ কেভিন ক্রুজসেন আমি আমার উত্তরে আমি কোথা থেকে এসেছি তা স্পষ্টভাবে ট্র্যাক করে রাখি না। পরিবর্তে, আমি প্রতিটি স্কোয়ারে প্রক্রিয়া করা সমস্ত দিকগুলি ট্র্যাক করে রাখি এবং আমি প্রথমে বিনা আমন্ত্রণযুক্ত স্কোয়ারগুলি চেষ্টা করি। যখন সমস্ত অপ্রকাশিত স্কোয়ারগুলি চেষ্টা করা হয়েছে, কেবলমাত্র আইনি আইনী পদক্ষেপটিই আমি এখান থেকে এসেছি (ইতিমধ্যে পরিদর্শন করেছেন, তবে এই দিকে নয়)।
আর্নৌল্ড

উত্তর:


7

জাভাস্ক্রিপ্ট (ES6),  180  174 বাইট

prompt()দিকটি আউটপুট এবং ফলাফল পুনরুদ্ধার করতে ব্যবহার করে।

_=>(g=p=>[...'012301234'].some((d,i)=>g[p]>>d&1|i<4&g[P=[p[0]+(d-2)%2,p[1]+~-d%2]]>0?0:(r=prompt('up/left/down/right/no exit'.split`/`[g[p]|=1<<d,d]))<'s'?g(P):r<'t'))([0,0])

এটি অনলাইন চেষ্টা করুন! (স্বয়ংক্রিয় আই / ও সহ)

ইন্টারেক্টিভ স্নিপেট

সতর্কতা : এই কোডটি 'সমাধান করা' প্রবেশ না করা বা ফাংশনটি নির্ধারণ করে যে কোনও প্রস্থান নেই until

(
_=>(g=p=>[...'012301234'].some((d,i)=>g[p]>>d&1|i<4&g[P=[p[0]+(d-2)%2,p[1]+~-d%2]]>0?0:(r=prompt('up/left/down/right/no exit'.split`/`[g[p]|=1<<d,d]))<'s'?g(P):r<'t'))([0,0])
)()

মন্তব্য

_ => (                      // anonymous function taking no argument
  g = p =>                  // g = recursive function taking the current position p = [x, y]
    [ ...'0123',            // i<4  : try to move on squares that haven't been visited yet
      ...'0123',            // 3<i<8: try to go back to where we initially came from
      ...'4'                // i=8  : if everything failed, there must be no exit
    ].some((d, i) =>        // for each direction d at index i:
      g[p] >> d & 1         //   if this direction was already tried at this position
      | i < 4 &             //   or i is less than 4 and
      g[P = [               //   the square at the new position P = [X, Y] with:
        p[0] + (d - 2) % 2, //     X = x + dx[d]
        p[1] + ~-d % 2      //     Y = y + dy[d]
      ]] > 0 ?              //   was already visited:
        0                   //     abort
      : (                   //   else:
        r = prompt(         //     output the direction:
          [ 'up',           //       0 = up
            'left',         //       1 = left
            'down',         //       2 = down
            'right',        //       3 = right
            'no exit'       //       4 = no exit
          ][                //
            g[p] |= 1 << d, //       mark this direction as used
            d               //       d = actual index of the string to output
          ]                 //     r = result of prompt()
        )                   //
      ) < 's' ?             //     if r = 'ok':
        g(P)                //       do a recursive call at the new position
      :                     //     else:
        r < 't'             //       yield true if r = 'solved' or false if r = 'wall'
    )                       // end of some()
)([0, 0])                   // initial call to g at (0, 0)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.