ডাউনহিল ম্যাজ সলভার


9

একটি উতরাই গাঁথুনি 0 থেকে 9 সহ অন্তর্ভুক্ত থেকে আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা অঙ্কের সিরিজ হিসাবে দেওয়া হয়, যেখানে একটি "এস" এবং একটি "এক্স" থাকে, যেখানে এস শুরু সূচিত করে এবং এক্সটি সমাপ্তিকে বোঝায়। উতরাইয়ের ধাঁধাতে, আপনি কেবল উত্তর, দক্ষিণ, পূর্ব, বা পশ্চিমে (কোন ত্রিভুজ নয়) সংলগ্ন একটি জায়গায় যেতে পারেন এবং আপনি কেবলমাত্র মানের চেয়ে কম বা সমান মানের ফাঁকা জায়গায় যেতে পারেন বর্তমানে চালু আছে

প্রোগ্রামটি ইনপুটটির মতো একই ফর্ম্যাটে গোলকধাঁধার মধ্য দিয়ে নেভিগেট করার জন্য একটি পথ আউটপুট করে, কেবল সমস্ত ট্র্যাশারেড স্পেসে একটি "থাকা উচিত।" তাদের মধ্যে এবং সমস্ত অপ্রত্যাশিত জায়গাগুলির মধ্যে একটি "#" থাকা উচিত। প্রারম্ভিক এবং শেষ হওয়া ঘরগুলি যথাক্রমে তাদের "এস" এবং "এক্স" রাখা উচিত। আপনি ধরে নিতে পারেন যে গোলকধাঁধাটির সর্বদা একটি সমাধান রয়েছে।

উদাহরণ ইনপুট:

3 3 3 3 2 1 S 8 9
3 1 1 3 3 0 6 8 7
1 2 2 4 3 2 5 9 7
1 2 1 5 4 3 4 4 6
1 1 X 6 4 4 5 5 5

উদাহরণ আউটপুট:

. . . . # # S . #
. # # . . # # . .
. # # # . # # # .
. # # # . # # # .
. . X # . . . . .

3
আপনার ও প্রতিরোধ করতে পারি Sএবং Xকোন দিক? গোলকধাঁধা কি সর্বদা দ্রবণযোগ্য?
ক্যালভিনের

এছাড়াও, আমরা কি ধরে নিতে পারি যে সমস্ত সারির দৈর্ঘ্য একই? এবং, শুধু নির্মল, একটি "অঙ্ক" অর্থ একক থেকে দশমিক অঙ্ক 0করতে 9সমেত, ডান?
ইলমারি করোনেন

1
@ ক্যালভিন হ্যাঁ, আপনি যে কোনও দিকে এস এবং এক্স থেকে যেতে পারেন। ধাঁধাঁটি সমাধানযোগ্য বলে ধরে নেওয়া হয়।
লুক ডি

1
@ আইমারি হ্যাঁ, সমস্ত সারিতে একই দৈর্ঘ্য রয়েছে এবং হ্যাঁ, "" সংখ্যা "0 থেকে 9 সমেত একক অঙ্ক।
লুক ডি

উত্তর:


3

জাভাস্ক্রিপ্ট (ES6) 219

একটি ফাংশন সত্য বা মিথ্যা প্রত্যাবর্তন। সমাধান (যদি পাওয়া যায়) কনসোলে আউটপুট is এটি কোনও অনুকূল সমাধান অনুসন্ধান করার চেষ্টা করে না।

f=o=>(r=(m,p,w=0,v=m[p])=>
v>':'
  ?console.log(' '+m.map(v=>v<0?'#':v,m[f]='X').join(' '))
  :v<=w&&[1,-1,y,-y].some(d=>r([...m],d+p,v),m[p]='.')
)(o.match(/[^ ]/g).map((v,p)=>v>'S'?(f=p,0):v>':'?v:v<'0'?(y=y||~p,v):~v,y=0),f)

মৃত্যুর মুখোমুখি হয়েছিলেন এবং প্রয়োজনের চেয়ে বেশি ব্যাখ্যা করেছেন

f=o=>{
  var r = ( // recursive search function
    m, // maze array (copy of)
    p, // current position
    w  // value at previous position
  )=> 
  {
    var v = m[p]; // get value at current position
    if (v == 'S') // if 'S', solution found, output and return true
    {
      m[f] = 'X'; // put again 'X' at finish position
      m = m.map(v => { // scan array to obtain '#'
        if (v < 0) // a numeric value not touched during search
          return '#'
        else  
          return v  
      }).join(' '); // array to string again, with added blanks (maybe too many)
      console.log(' '+m) // to balance ' '
      return true; // return false will continue the search and find all possible solutions
    }
    if (v <= w) // search go on if current value <= previous (if numeric, they both are negative)
    {
      m[p]='.'; // mark current position 
      return [1,-1,y,-y].some(d=>r([...m], d+p, v)) // scan in all directions
    }
    // no more paths, return false and backtrack
    return false
  }

  var f, // finish position (but it is the start of the search)
      y = 0; // offset to next/prev row
  o = o.match(/[^ ]/g) // string to char array, removing ' 's
  .map((v,p) => // array scan to find f and y, and transform numeric chars to numbers 
   {  
     if (v > 'S') // check if 'X'
     {
       f = p;
       return 0; // 'X' position mapped to min value
     }
     if (v > ':') // check if 'S'
       return v; // no change
     if (v < '0') // check if newline
     {
       if (!y) y = ~p; // position of first newline used to find y offset
       return v; // no change
     }
     return ~v; // map numeric v to -v-1 so have range (-1..-10)
   })

  return r(o, f, 0) // start with a fake prev value
}

টেস্ট ফায়ারফক্স / Firebug কনসোলে

f('3 3 3 3 2 1 S 8 9\n3 1 1 3 3 0 6 8 7\n1 2 2 4 3 2 5 9 7\n1 2 1 5 4 3 4 4 6\n1 1 X 6 4 4 5 5 5')

আউটপুট

. . . . # # S . #   
. # # . . # # . .   
. # # # . # # # .   
. # # # . # # # .   
. . X # . . . . .  

true  

আমরা একটি মিউচুয়াল কোড অস্বীকারযোগ্যতার সাথে ভাগ করে নিচ্ছি।
21

1
@ সিগ কেন, এটি স্ফটিক পরিষ্কার নয়? আমি আগামীকাল একটি ব্যাখ্যা যুক্ত করব
edc65

@ সিগ আরও দুর্গন্ধযুক্ত?
edc65

সত্যই শ্রদ্ধাজনক।
13:40

4

সি # - 463

STDIN এর মাধ্যমে ইনপুট গ্রহণ করে এবং প্রদত্ত পরীক্ষার ক্ষেত্রে পরীক্ষিত একটি সর্বোত্তম পথ তৈরি করা উচিত, তবে অন্যথায় নয়। ধরে নিই সবসময়ই এর সমাধান থাকে।

আমি কিছুটা তাড়াহুড়ো করে আছি, আমার 7 ঘন্টার মধ্যে একটি সময়সীমা রয়েছে, তবে এটি এড়াতে খুব মজা লাগছিল। আমি অনুশীলনের বাইরেও আছি। এটি ভুল হয়ে গেলে এটি বিব্রতকর হতে পারে, তবে এটি যুক্তিযুক্তভাবে গল্ফ করেছে।

using C=System.Console;class P{static void Main(){var S=C.In.ReadToEnd().Replace("\r","").Replace('X','+');int s=S.IndexOf('S'),e=S.IndexOf('+'),w=S.IndexOf('\n')+1,L=S.Length,i,j=L;var K=new int[L];for(K[s]=s+2;j-->0;)for(i=0;i<L;i+=2){System.Action<int>M=z=>{if((z+=i)>=0&z<L&&S[z]<=S[i]&K[z]<1&K[i]>0&(i%w==z%w|i/w==z/w))K[z]=i+1;};M(2);M(-2);M(w);M(-w);}for(w=e;w!=s+1;w=i){i=K[w]-1;K[w]=-1;}for(;++j<L;)C.Write(j%2<1?K[j]<0?j==s?'S':j==e?'X':'.':'#':S[j]);}}

মন্তব্য সহ কোড:

using C=System.Console;

class P
{
    static void Main()
    {
        var S=C.In.ReadToEnd().Replace("\r","").Replace('X','+'); // read in the map, replace X with + because + < 0
        int s=S.IndexOf('S'),e=S.IndexOf('+'),w=S.IndexOf('\n')+1,L=S.Length,i,j=L; // find start, end, width, length

        var K=new int[L]; // this stores how we got to each point as loc+1 (0 means we havn't visited it)

        for(K[s]=s+2; // can't risk this being 0
            j-->0;) // do L passes
            for(i=0;i<L;i+=2) // each pass, look at every location
            {
                // if a whole load of bouds checks, point new location (i+z) at i
                System.Action<int>M=z=>{if((z+=i)>=0&z<L&&S[z]<=S[i]&K[z]<1&K[i]>0&(i%w==z%w|i/w==z/w))K[z]=i+1;};
                // try and move in each direction
                M(2);
                M(-2);
                M(w);
                M(-w);
            }

        for(w=e;w!=s+1;w=i) // find route back
        {
            i=K[w]-1; // previous location
            K[w]=-1; // set this so we know we've visited it
        }

        for(;++j<L;) // print out result
            C.Write(j%2<1?K[j]<0?j==s?'S':j==e?'X':'.':'#':S[j]); // if K < 0, we visit it, otherwise we don't
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.