गणित: सच्चा भूलभुलैया (827 वर्ण)
मूल रूप से, मैंने {1,1,1} से {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]
नमूना उत्पादन
{{"oxooo", "xxooo", "xoxxo", "xoxxo", "xxoox"}, {"ooxoo", "xoooo", "ooxox", "ooxox", "xooxx"}, {"oooxx", "ooxxo", "ooxox", "xoxoo", "xxxoo"}, {"oxxxx", "oooox", "xooox", "xoxxx", "ooxox" "}, {" xxxxx "," ooxox "," ooxox " "," xoxoo "," oooxo "}}
हुड के नीचे
नीचे दी गई तस्वीर भूलभुलैया या भूलभुलैया को दर्शाती है ({{"ooxoo",...}}
जो ऊपर दिखाए गए समाधान से मेल खाती है :
यहाँ एक ही भूलभुलैया 5x5x5 में डाला गया है GridGraph
। गिने हुए कोने भूलभुलैया से बाहर सबसे छोटे मार्ग पर स्थित हैं। 34, 64 और 114 पर कांटे या निर्णय बिंदुओं पर ध्यान दें। मैं ग्राफ के प्रतिपादन के लिए उपयोग किए जाने वाले कोड को शामिल करूंगा, हालांकि यह समाधान का हिस्सा नहीं है:
HighlightGraph[gg = GridGraph[ConstantArray[5, 3]], g,
GraphHighlightStyle ->"DehighlightFade",
VertexLabels -> Rule @@@ Transpose[{s, s}] ]
और यह ग्राफ केवल भूलभुलैया के समाधान को दर्शाता है:
HighlightGraph[gg = GridGraph[ConstantArray[5, 3]],
Join[s, e[s]], GraphHighlightStyle -> "DehighlightFade", VertexLabels -> Rule @@@ Transpose[{s, s}] ]
अंत में, कुछ परिभाषाएँ जो कोड को पढ़ने में मदद कर सकती हैं:
मूल समाधान (432 चार, एक रास्ता बनाया गया था, लेकिन सही भूलभुलैया या भूलभुलैया नहीं)
एक 5x5x5 बड़े ठोस घन की कल्पना करें जो अलग-अलग यूनिट क्यूब्स से बना हो। निम्नलिखित यूनिट क्यूब्स के बिना {1,1,1} और {5,5,5} पर शुरू होती है, क्योंकि हम जानते हैं कि उन्हें समाधान का हिस्सा होना चाहिए। तब यह यादृच्छिक क्यूब्स को हटा देता है जब तक कि {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"}}
तकनीकी रूप से यह अभी तक एक सच्चा भूलभुलैया नहीं है, क्योंकि कोई गलत मोड़ नहीं हैं जो कोई भी बना सकता है। लेकिन मैंने इसे एक शुरुआत के रूप में दिलचस्प माना क्योंकि यह ग्राफ सिद्धांत पर निर्भर करता है।
दिनचर्या वास्तव में एक भूलभुलैया बना देती है, लेकिन मैंने सभी खाली स्थानों को प्लग किया जो साइकिल को जन्म दे सकते थे। अगर मुझे साइकिल निकालने का कोई रास्ता मिल जाए तो मैं यहाँ उस कोड को शामिल करूँगा।