জিএনইউ প্রোলগ, 493 বাইট
z(_,[_,_]).
z(F,[A,B,C|T]):-call(F,A,B,C),z(F,[B,C|T]).
i([],[],[],[]).
i([H|A],[I|B],[J|C],[H-I-J|T]):-i(A,B,C,T).
c(A/_-B/_-C/_,D/_-_/T-E/_,F/_-G/_-H/_):-T#=A+B+C+D+E+F+G+H.
r(A,B,C):-i(A,B,C,L),z(c,L).
q(63,V):-var(V).
q(42,1/_).
q(X,0/Y):-Y#=X-48.
l([],[0/_]).
l([H|T],[E|U]):-q(H,E),l(T,U).
p([],[[0/_,0/_]],0).
p([],[[0/_|T]],N):-M#=N-1,p([],[T],M).
p([H|T],[[0/_|E]|U],N):-p(T,U,N),l(H,E).
m([H|A],B):-length(H,N),p([],[R],N),p([H|A],M,N),z(r,[R|M]),p(B,M,N).
s(A):-setof(B,m(A,B),[_]).
একটি অতিরিক্ত শিকারী যা পরীক্ষার জন্য কার্যকর হতে পারে (জমা দেওয়ার অংশ নয়):
d([]).
d([H|T]):-format("~s~n",[H]),d(T).
ব্যবহারোলিক দৃষ্টিকোণ থেকে এই কাজটি সমাধান করার জন্য প্রোলগ অবশ্যই স্পষ্টভাবে সঠিক ভাষা। এই প্রোগ্রামটি কেবল মাইনসুইপারের বিধিগুলি জানিয়েছে এবং জিএনইউ প্রোলোগের সীমাবদ্ধ সমাধানকারীকে সেখান থেকে সমস্যার সমাধান করতে দেয়।
z
এবং i
ইউটিলিটি ফাংশনগুলি ( z
ভাঁজের মতো ক্রিয়াকলাপটি করে তবে 2 এর পরিবর্তে তিনটি সংলগ্ন উপাদানের সেটগুলিতে; এন উপাদানগুলির i
3 টি তালিকা এন 3-টিপলসের তালিকায় স্থানান্তর করে )। আমরা অভ্যন্তরীণভাবে একটি কক্ষ সংরক্ষণ করি , যেখানে খনিটির জন্য x 1 এবং একটি ননমাইনের জন্য 0 এবং y সংলগ্ন খনিগুলির সংখ্যা; বোর্ডে এই সীমাবদ্ধতা প্রকাশ করে। বোর্ডের প্রতিটি সারিতে প্রযোজ্য ; এবং সুতরাং একটি বৈধ বোর্ড কিনা তা পরীক্ষা করে দেখুন ।x/y
c
r
c
z(r,M)
M
দুর্ভাগ্যক্রমে, সরাসরি এই কাজটি করার জন্য প্রয়োজনীয় ইনপুট ফর্ম্যাটটি অযৌক্তিক, সুতরাং আমাকে একটি পার্সারও অন্তর্ভুক্ত করতে হয়েছিল (যা সম্ভবত প্রকৃত নিয়ম ইঞ্জিনের চেয়ে বেশি কোডের জন্য অ্যাকাউন্টস, এবং বেশিরভাগ সময় ডিবাগিংয়ে ব্যয় করেছিল; মাইনসুইপার বিধি ইঞ্জিনটি বেশ কাজ করেছে) প্রথমবার, তবে পার্সারটি থিঙ্কোতে পূর্ণ ছিল)। q
একটি একক কক্ষকে একটি অক্ষর কোড এবং আমাদের ফর্ম্যাটের মধ্যে রূপান্তর করে। বোর্ডের একটি লাইন রূপান্তর করে (সীমানা হিসাবে লাইনটির প্রতিটি প্রান্তে অজানা সংখ্যক প্রতিবেশী খনি সহ একটি ঘর রেখে যা একটি খনি হিসাবে পরিচিত knownx/y
l
p
পুরো বোর্ডকে রূপান্তর করে (নীচের সীমানা সহ, তবে উপরের অংশটি বাদ দিয়ে)। এই সমস্ত ফাংশন হয় সামনের দিকে বা পিছনের দিকে চালানো যেতে পারে, এইভাবে উভয়ই পার্স করতে পারে এবং বোর্ডটিকে প্রিন্ট-মুদ্রণ করতে পারে। (তৃতীয় আর্গুমেন্টের সাথে কিছু বিরক্তিকর ঝাঁকুনি রয়েছে p
যা বোর্ডের প্রস্থকে নির্দিষ্ট করে; এটি কারণ প্রোলোগের ম্যাট্রিক্স টাইপ নেই, এবং যদি আমি বোর্ডকে আয়তক্ষেত্রাকারে সীমাবদ্ধ না করি তবে প্রোগ্রামটি প্রবেশ করবে বোর্ডের চারপাশে প্রগতিশীল আরও বিস্তৃত সীমানার চেষ্টা করা একটি অসীম লুপ)
m
মাইনসুইপার সমাধানের প্রধান কাজ। এটি ইনপুট স্ট্রিংকে পার্স করে, একটি সঠিক সীমানা সহ বোর্ড তৈরি করে ( p
বেশিরভাগ বোর্ডকে রূপান্তর করার জন্য পুনরাবৃত্তির ক্ষেত্রে ব্যবহার করে , তারপরে বেসের কেসটিকে উপরের সীমানাটি তৈরি করার জন্য সরাসরি কল করে, যার নীচের সীমানার মতো কাঠামো রয়েছে)। তারপর এটি কলz(r,[R|M])
মাইনসুইপার বিধি ইঞ্জিন চালানোর জন্য, যা (এই কল প্যাটার্ন সহ) কেবলমাত্র বৈধ বোর্ড তৈরি করে একটি জেনারেটর হয়। এই মুহুর্তে, বোর্ডটি এখনও প্রতিবন্ধকতার একটি সেট হিসাবে প্রকাশ করা হয়, যা আমাদের পক্ষে সম্ভাব্য বিশ্রী; আমাদের সম্ভবত একটি একক বাধা থাকতে পারে যা একাধিক বোর্ডের প্রতিনিধিত্ব করতে পারে। অতিরিক্তভাবে, আমরা এখনও কোথাও নির্দিষ্ট করে নেই যে প্রতিটি স্কোয়ারে সর্বাধিক একটি খনি রয়েছে। যেমন, আমরা স্পষ্টভাবে প্রতিটি স্কোয়ারের "তরঙ্গাকৃতি ভেঙ্গে", এটা বিশেষভাবে হয় একটি (একক) খনি বা nonmine, এবং সহজ পদ্ধিতি হল উপায় এই কাজ করতে (পার্সার পিছন মাধ্যমে এটি চালানোর জন্য হয় হতে প্রয়োজন প্রয়োজন var(V)
উপর কেসটি পেছনের দিকে চলমান q(63,V)
প্রতিরোধ করার জন্য ডিজাইন করা হয়েছে ?
, এবং বোর্ডকে ত্যাগ করে এটি পুরোপুরি জানাতে বাধ্য করে)। অবশেষে, আমরা পার্সড বোর্ডটি এখান থেকে ফিরে আসিm
; m
এইভাবে একটি জেনারেটর হয়ে যায় যা একটি আংশিক অজানা বোর্ড নেয় এবং এর সাথে সামঞ্জস্যপূর্ণ সমস্ত পরিচিত বোর্ড জেনারেট করে।
মাইনসুইপারকে সমাধান করার পক্ষে এটি যথেষ্টই যথেষ্ট, তবে প্রশ্নটি সমস্ত সমাধান সন্ধানের পরিবর্তে ঠিক একটি সমাধান আছে কিনা তা পরিষ্কারভাবে জিজ্ঞাসা করে। এর মতো, আমি একটি অতিরিক্ত শিকারী লিখেছিলাম s
যা জেনারেটরটিকে কেবল m
একটি সেটে রূপান্তরিত করে , এবং তারপরে দৃ as ়ভাবে জানায় যে সেটে ঠিক একটি উপাদান রয়েছে। এর অর্থ s
হ'ল সত্যতা ফিরে আসবে ( yes
) যদি সত্যই একটি সমাধান থাকে তবে, অথবা একের no
বেশি বা একের বেশি হলে মিথ্যা ( ) থাকে।
d
সমাধানের অংশ নয়, এবং বাইটোকন্টে অন্তর্ভুক্ত নয়; এটি স্ট্রিংগুলির একটি তালিকা মুদ্রণের জন্য একটি ফাংশন যেমন এটি একটি ম্যাট্রিক্স ছিল, যা জেনারেল দ্বারা উত্পাদিত বোর্ডগুলি পরিদর্শন করা সম্ভব করে m
(ডিফল্টরূপে, জিএনইউ প্রোলোগ স্ট্রিংগুলি ASCII কোডগুলির একটি তালিকা হিসাবে মুদ্রণ করে, কারণ এটি দুটি সমার্থকভাবে আচরণ করে; এই বিন্যাসটি) পড়া মোটামুটি শক্ত)। এটি পরীক্ষার সময় কার্যকর হয় বা আপনি যদি m
ব্যবহারিক মাইনসুইপার সলভার হিসাবে ব্যবহার করতে চান (কারণ এটি একটি সীমাবদ্ধ সমাধানকারী ব্যবহার করে, এটি অত্যন্ত দক্ষ)।
2?
এর কোনও সমাধান নেই, যার অর্থ এটি মাইনসুইপারের আসল খেলা থেকে আসতে পারে না