কেবলমাত্র একটি সমাধান সহ বহু-স্তরের 5x5x5 ল্যাবরেথ তৈরি করুন


11

এই চ্যালেঞ্জের উদ্দেশ্যটি হ'ল সংক্ষিপ্ততম কোড (অক্ষরগুলিতে) তৈরি করা যা সফলভাবে নিম্নলিখিতগুলি করে:

বিশেষ উল্লেখ :

  • অবশ্যই একটি 5x5x5 labyrinthদিয়ে অবশ্যই তৈরি করা উচিত 1 possible solution(আর নয়, কম নয়)
  • গোলকধাঁধা তৈরি করা আবশ্যক randomly বছরের পর বছর ধরে চলতে থাকলে এটি অবশ্যই প্রতিটি বিদ্যমান সমাধান উত্পন্ন করতে সক্ষম হবে
  • startএবং finishএ স্থাপন করতে হবে*opposite corners
  • মানচিত্রটি outputঅবশ্যই নিম্নলিখিত ফর্ম্যাটগুলির মধ্যে একটিতে:

বিকল্প আউটপুট ফর্ম্যাট 1 strings, printed or alerted :

xxxxx,xxxxx,xxxxx,xxxxx,xxxxx/
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx/
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx/
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx/
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx

বিকল্প আউটপুট ফর্ম্যাট 2 arrays :

[[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx],
[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx],
[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx],
[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx],
[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx]]

আউটপুট নোট:

  • ব্যবহার করুন 0জন্য emptyএবং 1জন্যsquares

  • ব্রেক লাইন প্রয়োজনীয় নয়

  • কী indexকী তা আপনি সিদ্ধান্ত নিন তবে কেবল এটি ভাল করে ব্যাখ্যা করার জন্য নিশ্চিত হন


* বিপরীত কোণগুলির দ্বারা আমি কী বোঝাতে চাইছি তার একটি উদাহরণ এখানে দেওয়া হয়েছে:

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

স্পষ্টতা :

  • পারি না সরানোdiagonal
  • একই পথে দু'বার যেতে পারে না
  • থাকার inaccessible areasঅনুমতি দেওয়া হয়
  • আপনি go up/downএক সারিতে একাধিক স্তর করতে পারেন

পরামর্শ:

  • এগুলি প্রাচীর হিসাবে দেখবেন না, পরিবর্তে তাদের 5x5x5স্কোয়ারের স্তূপ হিসাবে দেখুন যে তাদের মধ্যে কিছু অনুপস্থিত রয়েছে এবং আপনি নিখোঁজ হয়ে যেতে পারেন

যদি কিছু অস্পষ্ট থাকে তবে কেবল আমাকে জিজ্ঞাসা করুন :)
ajax333221

3
যাইহোক, আমি এখানে একটি স্পষ্টতা চাই তার একটি বিশদ রয়েছে: স্কোয়ারগুলির মধ্যে প্রাচীর স্থাপন করা হয় , বা কোনও প্রাচীর পুরো চৌকোটি পূরণ করে?
ইলমারি করোনেন

1
আপনি কয়েকটি জায়গায় 5x5 (একটি 2D অ্যারে) বলছেন, তবু কোডের নমুনা এবং চিত্রটি 5x5x5 (একটি 3 ডি অ্যারে) প্রস্তাব দেয়। আমি ধরে নিই যে থ্রিডি অ্যারের অর্থ কী?
ভি ভেরেন্স

1
কীভাবে সিদ্ধান্ত নেওয়া হয় যে সমাধানটি একটি বৈধ গোলকধাঁধা? আমি বলতে চাইছি, এটি কি সঠিক পথের অফশুটগুলির সংখ্যা? 1s থেকে 0 এর অনুপাতের সাথে এটি করার কিছু?
ভেরেনস

2
আপনি যখন বলেন "গোলকধাঁধাটি অবশ্যই এলোমেলোভাবে তৈরি করা উচিত", আমাদের কোন সীমাবদ্ধতা অনুধাবন করা উচিত? উদাহরণস্বরূপ, আমি অনুমান করি যে আপনি বর্তমানে নিয়মের আক্ষরিক পঠন হিসাবে অনুমোদনের ইচ্ছা করছেন না, এমন একটি প্রোগ্রাম যা এলোমেলোভাবে দুটি হার্ড-কোডেড আউটপুটগুলির মধ্যে বেছে নেয়।
পিটার টেলর

উত্তর:


10

সি ++ সি, প্রায় 1000 670 643 395 297 248 অক্ষর

নমুনা আউটপুট:

00111,10011,10111,00110,11000,
11001,01010,00100,11011,10101,
10111,10101,10001,01010,00101,
11001,11110,11100,11110,10101,
11100,10010,11001,10101,00000,

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

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

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

#define M m[*p+1][p[1]][p[2]]
#define F(a,b)for(p[a]=5;p[a]--;putchar(b))
#define f for(i=3;i--;p[i]
p[]={4,4,4},h[3],m[7][6][6]={1};
main(i){
    for(M=2;h[1]^1||(M=1)^h[2];){
        f=rand()%5)
            h[i]=0;
        f++)
            p[i]++,
            h[M]++,
            p[i]-=2,
            h[M]++;
    }
    F(0,10)
        F(1,44)
            F(2,48+!M);
}

আমি পঠনযোগ্যতার জন্য প্রদর্শিত কোডটিতে নিউলাইন এবং ইন্ডেন্টেশন যুক্ত করেছি।


আমি মনে করি আপনি এটি জিতলেন ;-) আমার পক্ষে এতদূর সঙ্কুচিত হওয়ার কোনও উপায় নেই
কেএ ভেরেন্স ২২:৪6

আমি সত্যিই প্রতিযোগিতাটি উপভোগ করেছি :-) আমি কিছুটা অবাক হয়েছি আমরা এখনও একমাত্র উত্তর, আমি আশা করি কোনও গল্ফের স্ক্রিপ্টার বা এরকমই আমাদের উভয়কেই পরাজিত করে ফেলবে।
স্যার_লাগসালোট

কোনওভাবে, একটি সরল পথ, কাঁটাচামচ বা সিদ্ধান্ত নোড ছাড়া, সত্য গোলকধাঁধা হিসাবে যোগ্য বলে মনে হয় না। কিছু অন্ধ গলি যুক্ত করার চেষ্টা করুন।
ডেভিডসি

@ ডেভিড ক্যারাহার অ্যালগরিদম নমুনায় প্রদর্শিত মৃত প্রান্ত এবং শাখা প্রশাখার পথ তৈরি করে। ইতিমধ্যে বিদ্যমান দুটি শাখা সংযোগ করার জন্য একটি নতুন পয়েন্টকে অনুমতি না দেওয়া কেবল গোলকধাঁধার একাধিক সমাধান বা চক্রকে প্রতিরোধ করে।
স্যার_লগসালোট

@ স্যার_লাগসালোট স্পষ্টতার জন্য ধন্যবাদ
ডেভিডসি

5

জাভাস্ক্রিপ্ট, 874 816 788 686 682 668 637 টি অক্ষর

নমুনা আউটপুট:

00000,10111,10111,01010,11000
01011,01000,01010,01111,00011
00100,11010,00111,10111,11010
01111,10001,01110,01010,01000
00000,11110,00001,10101,10110

এটি বিন্দু থেকে শুরু করে [0,0,0] এবং এলোমেলোভাবে 0 টি 0 এর পাশের যেখানে আরও অনুমতি দেওয়া হয়েছে (অনুমোদিত == নতুন 0 প্রবর্তক ব্যতীত অন্য কোনও 0 এর পাশে নয়) যুক্ত করে আরও কাজ না করে কাজ করে সম্ভাব্য সংযোজন

যদি কোনও নতুন 0 প্রস্থানস্থান বিন্দু (x * y * z == 48) এর পাশে থাকে তবে আমরা প্রস্থানটি খুলি।

golfed

b=[]
I=Math.random
for(i=5;i--;)for(j=5,b[i]=[];j--;)b[i][j]=[1,1,1,1,1]
b[0][0][0]=0
k=[[0,0,0]]
function q(x,y,z){J=b[x]
if(x<0||y<0||z<0||x>4||y>4||z>4||!J[y][z])return 
n=6-!x||b[x-1][y][z]
n-=!y||J[y-1][z]
n-=!z||J[y][z-1]
n-=x==4||b[x+1][y][z]
n-=y==4||J[y+1][z]
n-=z==4||J[y][z+1]
n==1&&v.push([x,y,z])}while(I){F=k.length
B=k[C=0|I(v=[])*F]
x=B[0]
q(x-1,y=B[1],z=B[2])
q(x,y-1,z)
q(x,y,z-1)
q(x+1,y,z)
q(x,y+1,z)
q(x,y,z+1)
if(D=v.length){k.push(A=v[0|I()*D])
b[A[0]][A[1]][A[2]]=0
if(A[0]*A[1]*A[2]==48)b[4][4][4]=I=0}else{for(E=[];F--;)F^C&&E.push(k[F])
k=E}}for(i=25;i--;)b[H=0|i/5][i%5]=b[H][i%5].join('')
alert(b.join("\n"))

মূল

window.map=[];
for (i=0;i<5;++i) {
  map[i]=[];
  for (j=0;j<5;++j) {
    map[i][j]=[1,1,1,1,1];
  } 
} 
points=[[0,0,0]];
map[0][0][0]=0;
function spaces(x,y,z) {
  var n=6;
  if (x<0 || y<0 || z<0) return 0;
  if (x>4 || y>4 || z>4) return 0;
  if (!map[x][y][z]) return 0;
  if (!x || map[x-1][y][z]) n--;
  if (!y || map[x][y-1][z]) n--;
  if (!z || map[x][y][z-1]) n--;
  if (x==4 || map[x+1][y][z]) n--;
  if (y==4 || map[x][y+1][z]) n--;
  if (z==4 || map[x][y][z+1]) n--;
  return n;
} 
do {
  var index=Math.floor(Math.random()*points.length);
  point=points[index];
  v=[];
  x=point[0];
  y=point[1];
  z=point[2];
  spaces(x-1,y,z)==1 && v.push([x-1,y,z]);
  spaces(x,y-1,z)==1 && v.push([x,y-1,z]);
  spaces(x,y,z-1)==1 && v.push([x,y,z-1]);
  spaces(x+1,y,z)==1 && v.push([x+1,y,z]);
  spaces(x,y+1,z)==1 && v.push([x,y+1,z]);
  spaces(x,y,z+1)==1 && v.push([x,y,z+1]);
  if (v.length) {
    var point=v[Math.floor(Math.random()*v.length)];
    points.push(point);
    map[point[0]][point[1]][point[2]]=0;
    if (point[0]*point[1]*point[2]==48) {
      map[4][4][4]=0;
    } 
  } 
  else {
    var np=[];
    for (var i=0;i<points.length;++i) {
      i!=index && np.push(points[i]); 
    } 
    points=np;
  } 
} while(points.length);
for (i=0;i<5;++i) {
  for (j=0;j<5;++j) {
    map[i][j]=map[i][j].join('');
  } 
  map[i]=map[i].join();
} 
alert(map.join("\n"));

4

ম্যাথমেটিকা: ট্রেন লাইব্রের্থ (827 টি অক্ষর)

মূলত, আমি path 1,1,1 from থেকে {5,5,5} পর্যন্ত একটি পথ তৈরি করেছি তবে কোনও ভুল ঘোরানো সম্ভব হয়নি বলে আমি কাঁটাচামচ বা "সিদ্ধান্ত পয়েন্টস" (ডিগ্রিটির শীর্ষাংশ> 2) চালু করেছি যেখানে কোনটি কোন পথে যেতে হবে তা সিদ্ধান্ত নিতে হবে। ফলাফলটি একটি সত্য গোলকধাঁধা বা গোলকধাঁধা।

"অন্ধ এলিগুলি" একটি সহজ, সরাসরি পথ খুঁজে পাওয়ার চেয়ে সমাধান করা অনেক বেশি চ্যালেঞ্জিং ছিল। সর্বাধিক চ্যালেঞ্জিং বিষয়টি ছিল চক্রটিকে সমাধানের পথে ছাড়ার সময় পথের মধ্যে চক্রগুলি নির্মূল করা।

নিম্নলিখিত দুটি লাইন কোড কেবল অঙ্কিত গ্রাফগুলি রেন্ডারিংয়ের জন্য ব্যবহৃত হয়, সুতরাং কোডটি গণনা করা হয় না, কারণ এটি সমাধানে নিযুক্ত হয় না।

o = Sequence[VertexLabels -> "Name", ImagePadding -> 10, GraphHighlightStyle -> "Thick", 
    ImageSize -> 600];

o2 = Sequence[ImagePadding -> 10, GraphHighlightStyle -> "Thick", ImageSize -> 600];

কোড ব্যবহৃত:

e[c_] := Cases[EdgeList[GridGraph[ConstantArray[5, 3]]], j_ \[UndirectedEdge] k_ /; (MemberQ[c, j] && MemberQ[c, k])]

m[] :=
Module[{d = 5, v = {1, 125}},
   While[\[Not] MatchQ[FindShortestPath[Graph[e[v]], 1, 125], {1, __, 125}],

v = Join[v, RandomSample[Complement[Range[125], v], 1]]];
   Graph[e[Select[ConnectedComponents[Graph[e[v]]], MemberQ[#, 1] &][[1]]]]]

w[gr_, p_] := EdgeDelete[gr, EdgeList[PathGraph[p]]]

y[p_, u_] := Select[Intersection[#, p] & /@ ConnectedComponents[u], Length[#] > 1 &]

g = HighlightGraph[lab = m[],  PathGraph[s = FindShortestPath[lab, 1, 125]],o]
u = w[g, s]
q = y[s, u]

While[y[s, u] != {}, u =  EdgeDelete[u, Take[FindShortestPath[u,  q[[1, r = RandomInteger[Length@q[[1]] - 2] + 1]], 
  q[[1, r + 1]]], 2] /. {{a_, b_} :> a \[UndirectedEdge] b}];

q = y[s, u]]

g = EdgeAdd[u, EdgeList@PathGraph[s]];

Partition[StringJoin /@ Partition[ReplacePart[Table["x", {125}], 
Transpose[{VertexList[g], Table["o", {Length[VertexList@g]}]}]/. {{a_, b_} :>  a -> b}], {5}], 5]

নমুনা আউটপুট

ox "অক্সুও", "xxooo", "xoxxo", "xoxxo", "xxoox"}, {"ooxoo", "xoooo", "oxox", "oooxx", "xooxx"}, {"অক্সক্স", "ooxxo", "অক্সক্স", "xoxoo", "xxxoo"}, {"অক্সএক্সএক্সএক্স", "আওক্স", "xooox", "xoxxx", "ooxx"}, x "xxxxx", "অক্সক্স", "oooxx "," xoxoo "," oooxo "}

ফণা অধীনে

({{"ooxoo",...}}উপরের চিত্রটি গোলকধাঁধা বা গোলকধাঁধা দেখায় যা উপরের প্রদর্শিত সমাধানের সাথে মিলে যায় :

solution1

এখানে 5x5x5 তে একই গোলকধাঁধা .োকানো হয়েছে GridGraph। সংখ্যাযুক্ত শীর্ষটি গোলকধাঁধাটির বাইরে সবচেয়ে সংক্ষিপ্ত পথে নোড। কাঁটাচামচ বা সিদ্ধান্ত পয়েন্টগুলি 34, 64 এবং 114 নোট করুন I'll আমি গ্রাফটি রেন্ডারিংয়ের জন্য ব্যবহৃত কোডটি সমাধানের অংশ না হলেও অন্তর্ভুক্ত করব:

HighlightGraph[gg = GridGraph[ConstantArray[5, 3]], g,  
 GraphHighlightStyle ->"DehighlightFade", 
 VertexLabels -> Rule @@@ Transpose[{s, s}] ]

solution2

এবং এই গ্রাফটি গোলকধাঁধাটির সমাধান কেবলমাত্র দেখায়:

HighlightGraph[gg = GridGraph[ConstantArray[5, 3]], 
   Join[s, e[s]], GraphHighlightStyle -> "DehighlightFade", VertexLabels -> Rule @@@    Transpose[{s, s}] ]

solution3

পরিশেষে, কিছু সংজ্ঞা যা কোড পড়তে সহায়তা করতে পারে:

সংজ্ঞা


আসল সমাধান (432 চর, একটি পথ তৈরি করেছে তবে সত্যিকারের গোলকধাঁধা বা গোলকধাঁধা নয়)

স্বতন্ত্র ইউনিট কিউব দিয়ে গঠিত একটি 5x5x5 বৃহত কঠিন ঘনকটি কল্পনা করুন। নিম্নলিখিতটি ইউনিট কিউব ছাড়াই begins 1,1,1} এবং {5,5,5 at এ শুরু হয়, কারণ আমরা জানি যে তারা অবশ্যই সমাধানের অংশ হতে পারে। তারপরে rand 1,1,1} থেকে {5,5,5} অব্যাহত পথ না হওয়া পর্যন্ত এটি এলোমেলো কিউবগুলি সরিয়ে দেয়}

"গোলকধাঁধা" হ'ল ইউনিট কিউবস প্রদত্ত সংক্ষিপ্ততম পথ (যদি একাধিক সম্ভব হয়)।

d=5
v={1,d^3}
edges[g_,c_]:=Cases[g,j_\[UndirectedEdge] k_/;(MemberQ[c,j]&&MemberQ[c,k])]

g:=Graph[v,edges[EdgeList[GridGraph[ConstantArray[d,d]]],v]];

While[\[Not]FindShortestPath[g,1,d^3]!={},
    v=Join[v,RandomSample[Complement[Range[d^3],v],1]]]

Partition[Partition[ReplacePart[
   Table["x",{d^3}],Transpose[{FindShortestPath[g,1,d^3],Table["o",{Length[s]}]}]
      /.{{a_,b_}:>  a->b}],{d}]/.{a_,b_,c_,d_,e_}:>  StringJoin[a,b,c,d,e],5]

উদাহরণ:

{{"ooxxx", "xxxxx", "xxxxx", "xxxxx", "xxxxx"}, 
 {"xoxxx", "xoooo", "xxxxo", "xxxxo", "xxxxo"}, 
 {"xxxxx", "xxxxx", "xxxxx", "xxxxx", "xxxxo"}, 
 {"xxxxx", "xxxxx", "xxxxx", "xxxxx", "xxxxo"}, 
 {"xxxxx", "xxxxx", "xxxxx", "xxxxx", "xxxxo"}}

প্রযুক্তিগতভাবে এটি এখনও সত্যিকারের গোলকধাঁধা নয়, যেহেতু কোনও ভুল পাল্টাতে পারে না। তবে আমি এটিকে শুরু হিসাবে আকর্ষণীয় মনে করেছি কারণ এটি গ্রাফ তত্ত্বের উপর নির্ভর করে।

রুটিনটি আসলে গোলকধাঁধা তৈরি করে তবে আমি সমস্ত খালি জায়গাগুলি প্লাগ ইন করে যা চক্রকে বাড়িয়ে তুলতে পারে। যদি আমি চক্র সরানোর কোনও উপায় খুঁজে পাই তবে আমি সেই কোডটি এখানে অন্তর্ভুক্ত করব।


সুন্দর আপডেট, আমি পছন্দ করি যে আপনার আপডেট হওয়া সমাধানটি অ-সমাধানের পথে চক্রগুলিকে মঞ্জুরি দেয়, এটি আরও বিভ্রান্তিকর গোলকধাঁধায় করে তোলে।
স্যার_লাগসালোট

ধন্যবাদ। আমি এখনও চাই যে সমাধানের পথটি সময়ে সময়ে চূড়ান্ত নোড থেকে দূরে সরে যাওয়ার সম্ভাবনা বেশি থাকে। এই বর্তমানে দ্বারা নিরুৎসাহিত করা হয় (কিন্তু পুরোপুরি আটকানো নয়) FindShortestPath
ডেভিডসি

আমি মতলবের সাথে খুব বেশি পরিচিত নই, তবে আপনি কি ফাইন্ডশোরটেস্টপথের মতো কিছু করতে পারেন, সংক্ষিপ্ত পথে প্রতিটি নোডের বিরুদ্ধে পক্ষপাত যুক্ত করতে পারেন, এবং তারপরে ফাইন্ডশোরটেস্টপথটিকে আবারও পক্ষপাতিত্ব বিবেচনা করে চালান যাতে এটি সংক্ষিপ্ত সমাধানে নোডগুলি এড়াতে পারে? এটি পুনরাবৃত্তভাবেও করা যেতে পারে। আমি কী ধরণের পথ তৈরি করতে আগ্রহী তা জানতে চাই।
স্যার_লগসালোট

@Sir_Lagsalot আমি ম্যাথামেটিকাল দঃপূঃ গ্রুপ এখানে জন্য একটি প্রশ্ন হিসাবে এই পোস্ট ( mathematica.stackexchange.com/questions/4084/... )
DavidC
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.