একটি বরফ গোলকধাঁধা সমাধান করুন


19

পোকেমন গোল্ড এবং সিলভারে আত্মপ্রকাশের পর থেকে আইস ম্যাজগুলি পোকেমন গেমগুলির আমার অন্যতম প্রধান প্রধান বিষয় । আপনার কাজটি এমন একটি প্রোগ্রাম তৈরি করা হবে যা এই ধরণের সমস্যাগুলি সমাধান করে।

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

আপনি মানের দুটি দ্বিমাত্রিক ধারক পাবেন যেমন তালিকার তালিকাগুলির তালিকা বা নিউলাইন দ্বারা পৃথক স্ট্রিং, 3 ধরণের প্রতিটি ফ্লোর (বরফ, মাটি এবং প্রস্তর) এর জন্য 3 টি পৃথক মান রয়েছে। আপনি দুটি জোড়া (বা অন্যান্য সমমানের দুটি মান ধারক) পাবেন যা গোলকধাঁধার মধ্যে একটি সূচনা এবং লক্ষ্য সমন্বয় নির্দেশ করে। এগুলি শূন্য বা এক সূচকযুক্ত হতে পারে।

আপনার চলনগুলির একটি তালিকা আউটপুট করতে হবে (এন, ই, এস, ডাব্লুতে একটি বাইজিকেশন সহ 4 টি স্বতন্ত্র মান) যা চালককে সঞ্চালনের সময় শেষের দিকে পৌঁছে দেবে।

ধাঁধাটির চারপাশে সর্বদা ইনপুটটিতে পাথরের একটি বদ্ধ পরিধি থাকবে যাতে আপনাকে ধাঁধা থেকে বেরিয়ে আসা প্লেয়ারটি নিয়ে চিন্তা করতে হবে না you

এটি তাই সবচেয়ে কম বাইট জিততে পারে

পরীক্ষার মামলা

এখানে .বরফ উপস্থাপন করবে, ~মাটির Oপ্রতিনিধিত্ব করবে এবং একটি পাথরকে উপস্থাপন করবে। স্থানাঙ্কগুলি 1 সূচকযুক্ত। সমাধানের প্রতিটি অক্ষর সেই অক্ষর দিয়ে শুরু হওয়া দিকটি প্রতিনিধিত্ব করে (যেমন N= উত্তর)


ইনপুট

OOOOO
OO.OO
O...O
OOOOO

Start : 3,3
End   : 3,2

আউটপুট

N

ইনপুট

OOOOOOOOOOOOOOOOO
O........O.....OO
O...O..........OO
O.........O....OO
O.O............OO
OO.......O.....OO
O.............OOO
O......O.......~O
O..O...........~O
O.............OOO
O.......O......OO
O.....O...O....OO
O..............OO
OOOOOOOOOOOOOO~~O
OOOOOOOOOOOOOOOOO

Start : 15,12
End   : 16,8

আউটপুট

N,W,N,E,N,E,S,W,N,W,S,E,S,E,N,E,N

ইনপুট

OOOOOOOOOOOOOOOO
O~~~~~OOOOO~~~~O
O~~O~OOOOOOO~~OO
O...O..........O
O........O.....O
O..............O
OO.............O
O.............OO
O....~....O....O
O..............O
O..............O
OOOOOOOOOOOOOOOO

Start : 2,2
End   : 14,3

আউটপুট

E,S,S,W,N,E,N

ইনপুট

OOOOOOOOOOOOOOOOOOO
O~~~~~~~OOOOOOOOOOO
O~~~~...OOOOOOOOOOO
OO~O~..OOOOOOOOOOOO
O..OO.............O
O..............O..O
O....O............O
O.O............~..O
O........OOOO.....O
O.......OOOOO.....O
O.......O~~~O.....O
O.......~~~~~.....O
O.......~~~~~.....O
O..........O......O
O..O..~...........O
O...............O.O
O.....O...........O
O.................O
OOOOOOOOOOOOOOOOOOO

Start : 2,2
End   : 11,11

আউটপুট

E,E,E,E,E,S,S,E,N,W,S,E,N,N,N

ইনপুটটির সর্বদা কমপক্ষে একটি বৈধ সমাধান হবে?
পাভেল

@ পাভেল আপনি এটি ধরে নিতে পারেন।
গম উইজার্ড

পরীক্ষার কেসগুলি (সারি, কলাম) বা (কলাম, সারি)? 1 বা 0 সূচকযুক্ত? বোর্ড প্রান্তগুলি কি দেয়াল হিসাবে গণনা করা হয়?
মাইল্ডলি মিল্কিওয়েস্ট


2
@ বুসুকাকুয়ান আপনি স্থায়ীভাবে গোলকধাঁধায় আটকা পড়তে পারেন (টেস্টকেস 1 দেখুন)
গম উইজার্ড

উত্তর:


4

গণিত, 247 বাইট

(p=x#[[##&@@x]];m={c,v}Switch[p[c+v],0,m[c+v,v],1,c+v,_,c];g=Cases[Array[List,Dimensions@#],c_/;p@c<2,{2}];a=cm[c,#]&/@{{1,0},{-1,0},{0,1},{0,-1}};e=Flatten[Table[#->c,{c,a@#}]&/@g,1];Normalize/@Differences@FindPath[Graph[e],#2,#3][[1]])&

লাইন বিরতি সহ:

(
p=x#[[##&@@x]];
m={c,v}Switch[p[c+v],0,m[c+v,v],1,c+v,_,c];
g=Cases[Array[List,Dimensions@#],c_/;p@c<2,{2}];
a=cm[c,#]&/@{{1,0},{-1,0},{0,1},{0,-1}};
e=Flatten[Table[#->c,{c,a@#}]&/@g,1];
Normalize/@Differences@FindPath[Graph[e],#2,#3][[1]]
)&

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

প্রথম যুক্তি #হ'ল একটি 2 ডি অ্যারে যেখানে 0বরফ 1উপস্থাপন করে, মাটি উপস্থাপন করে এবং 2পাথরকে উপস্থাপন করে।

দ্বিতীয় যুক্তি #2এবং তৃতীয় যুক্তি #3হ'ল যথাক্রমে ফর্মের শুরু এবং শেষ পয়েন্ট {row,column}

U+F4A1প্রতিনিধিত্ব করে 3 বাইট বেসরকারী ব্যবহারের চরিত্র \[Function]

ব্যাখ্যা

p=x#[[##&@@x]];

একটি ফাংশন সংজ্ঞা দেয় pযা xফর্ম {row,column}এবং আউটপুটগুলির একটি তালিকা গ্রহণ করে #[[row,column]]; অর্থাত্ সেই স্থানাঙ্কে বরফ / মাটি / পাথরের মান।

m={c,v}Switch[p[c+v],0,m[c+v,v],1,c+v,_,c]

একটি ফাংশন সংজ্ঞায়িত করে mযা একটি শুরুর অবস্থান cএবং দিকনির্দেশক ভেক্টর গ্রহণ করে vএবং আপনি কোথায় শেষ করবেন তা পুনরাবৃত্তি করে। যদি c+vবরফ হয়, তবে আমরা সেই বিন্দু থেকে সরে যেতে থাকি, সুতরাং এটি ফিরে আসে m[c+v,v]। যদি c+vমাটি হয়, তবে আমরা চলে যাই c+vএবং থামি। অন্যথায় (যদি c+vপাথর হয় বা সীমা ছাড়িয়ে যায়), আপনি সরান না। মনে রাখবেন এটি কেবল বরফ বা মাটির অবস্থানের জন্য কল করার উদ্দেশ্যে is

g=Cases[Array[List,Dimensions@#],c_/;p@c<2,{2}];

gবরফ এবং মাটির অবস্থানের তালিকা নির্ধারণ করে (এর pচেয়ে কম মান 2)।

a=cm[c,#]&/@{{1,0},{-1,0},{0,1},{0,-1}}; 

একটি ফাংশন নির্ধারণ aযা শুরু অবস্থানে নেয় cএবং আয় চলন্ত ফলাফল {1,0}, {-1,0}, {0,1}, এবং {0,-1}নির্দেশাবলী। কিছুটা বাড়াবাড়ি হতে পারে। আবার এটি ধরে নেয় যে cবরফ বা মাটির সাথে মিল রয়েছে।

e=Flatten[Table[#->c,{c,a@#}]&/@g,1];

eআইনী পদক্ষেপের প্রতিনিধিত্বকারী নির্দেশিত প্রান্তগুলির তালিকা নির্ধারণ করে । প্রতিটি পদের জন্য #g, প্রান্ত সারণী গনা #->cপ্রত্যেকের জন্য ca@#। তারপরে যেহেতু আমরা প্রতিটি পদের জন্য একটি সাবলিস্ট দিয়ে শেষ করব #, তাই আমি প্রথম স্তরটি সমতল করব। কিছু লুপ এবং একাধিক প্রান্ত থাকতে পারে।

Normalize/@Differences@FindPath[Graph[e],#2,#3][[1]]

Graph[e]গ্রাফটি যেখানে নোডগুলি আইনী অবস্থান (বরফ বা মাটি) এবং প্রান্তগুলি আইনী পদক্ষেপের প্রতিনিধিত্ব করে (সম্ভবত একটি পাথরকে ধাক্কা মেরে চলবে না)। এরপরে আমরা নোডের তালিকা হিসাবে প্রতিনিধিত্ব করতে FindPathকোনও পথ খুঁজে বের করি । যেহেতু একাধিক পাথ সন্ধানের জন্য অতিরিক্ত যুক্তি গ্রহণ করতে পারে, ফলস্বরূপ ফলাফলটি একটি একক পথ সম্বলিত একটি তালিকা হবে, সুতরাং আমি প্রথম উপাদানটি ব্যবহার করে নিই । তারপরে আমি স্থাবর ও সেগুলির ধারাবাহিকভাবে নিই । সুতরাং উপরে , নীচে হয় , ডান হয় এবং বাম হয় ।#2#3FindPath[[1]]DifferencesNormalize{-1,0}{1,0}{0,1}{0,-1}

পরীক্ষার মামলা

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন


4

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

(m,[x,y],[t,u],o=~m.search`
`,s=[[x-y*o,[]]],k=[])=>eval("for(i=0;[p,l]=s[i++],k[p]=t-u*o-p;)[-1,o,1,-o].map(d=>k[q=(M=p=>+m[p+=d]?m[p]<8?M(p):p:p-d)(p)]||s.push([q,[...l,d]]));l")

একটি বিএফএস ব্যবহার করে , যেমন আমি এই সম্পর্কিত চ্যালেঞ্জটি সমাধান করতে পারি

ইনপুট
ধাঁধা মানচিত্রটি একটি মাল্টিলাইন স্ট্রিং, পাথর ব্যবহার করে Oবা মাটির জন্য এবং বরফের জন্য 8 এর চেয়ে কম ননজারো অঙ্ক ( ভাল দেখায়)। শুরু এবং শেষের অবস্থানটি শূন্য ভিত্তিক।087

আউটপুট
অফসেটের একটি তালিকা, যেখানে -1 হয় W, 1 হয় E, -1 হয় নেতিবাচক Nএবং 1 এর চেয়ে ধনাত্মক হয়S

কম গল্ফড

(m,[x,y],[t,u])=>{
  o=~m.search`\n`
  s=[[x-y*o,[]]]
  k=[]
  for(i=0; [p,l]=s[i++], k[p]=1, t-u*o != p;)
  {
    [-1,o,1,-o].map(d=>(
      M=p=>+m[p+=d] ? m[p]<8 ? M(p) : p : p-d,
      q=M(p),
      k[q]||s.push([q,[...l,d]])
    ))
  }
  return l
}

পরীক্ষা

Solve=
(m,[x,y],[t,u],o=~m.search`
`,s=[[x-y*o,[]]],k=[])=>eval("for(i=0;[p,l]=s[i++],k[p]=t-u*o-p;)[-1,o,1,-o].map(d=>k[q=(M=p=>+m[p+=d]?m[p]<8?M(p):p:p-d)(p)]||s.push([q,[...l,d]]));l")

function Go(maze) {
  var map = maze.textContent;
  var [sx,sy, dx,dy] = map.match(/\d+/g)
  --sx, --sy // zero based
  --dx, --dy // zero based
  map = map.split('\n').slice(1).join('\n') // remove first line
  var result = Solve(map.replace(/\./g, 7).replace(/~/g, 8), [sx,sy], [dx,dy])
  S.textContent = result
  Animate(maze, map, result, sx, sy)
}

function Display(maze, map, pos) {
  var row0 = maze.textContent.split('\n')[0]
  map = [...map]
  map[pos] = '☻'
  maze.textContent = row0+'\n'+map.join('')
}

function Animate(maze, map, moves, x, y) {
  console.log('A',moves)
  var offset = map.search('\n')+1
  var curPos = x + offset * y
  var curMove = 0
  var step = _ => {
    Display(maze, map, curPos)
    if (curMove < moves.length) 
    {
      curPos += moves[curMove]
      if (map[curPos] == 'O')
      {
        curPos -= moves[curMove]
        ++curMove
      }  
      else 
      {
        if (map[curPos] == '~') {
          ++curMove
        }
      }
      setTimeout(step, 100)
    }
    else
      setTimeout(_=>Display(maze,map,-1),500)
  }
  step()
}
td { 
  border: 1px solid #888;
}
Select maze<pre id=S></pre>
<table cellspacing=5><tr>
<td valign=top><input type=radio name=R onclick='Go(M1)'><br>
<pre id=M1>3,3 to 3,2  
OOOOO
OO.OO
O...O
OOOOO</pre></td>
<td valign=top><input type=radio name=R onclick='Go(M2)'><br>
<pre id=M2>15,12 to 16,8
OOOOOOOOOOOOOOOOO
O........O.....OO
O...O..........OO
O.........O....OO
O.O............OO
OO.......O.....OO
O.............OOO
O......O.......~O
O..O...........~O
O.............OOO
O.......O......OO
O.....O...O....OO
O..............OO
OOOOOOOOOOOOOO~~O
OOOOOOOOOOOOOOOOO</pre></td>
<td valign=top><input type=radio name=R onclick='Go(M3)'><br>
<pre id=M3>2,2 to 14,3
OOOOOOOOOOOOOOOO
O~~~~~OOOOO~~~~O
O~~O~OOOOOOO~~OO
O...O..........O
O........O.....O
O..............O
OO.............O
O.............OO
O....~....O....O
O..............O
O..............O
OOOOOOOOOOOOOOOO</pre></td>
<td valign=top><input type=radio name=R onclick='Go(M4)'><br>
<pre id=M4>2,2 to 11,11
OOOOOOOOOOOOOOOOOOO
O~~~~~~~OOOOOOOOOOO
O~~~~...OOOOOOOOOOO
OO~O~..OOOOOOOOOOOO
O..OO.............O
O..............O..O
O....O............O
O.O............~..O
O........OOOO.....O
O.......OOOOO.....O
O.......O~~~O.....O
O.......~~~~~.....O
O.......~~~~~.....O
O..........O......O
O..O..~...........O
O...............O.O
O.....O...........O
O.................O
OOOOOOOOOOOOOOOOOOO</pre></td>
</tr></table>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.