আমি কি মাইনগুলি ঝুলতে পারি?


29

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

1110
2*31
3*??
2*4?
112?

এই বিন্যাসে, একটি সংখ্যা সংলগ্ন খনিগুলির সংখ্যা, *একটি পরিচিত খনি এবং একটি "প্রতিনিধিত্ব করে?" একটি সম্ভাব্য খনি প্রতিনিধিত্ব করে। এই বিশেষ ধাঁধা সম্পর্কে দুর্ভাগ্যজনক বিষয় হ'ল চারটি স্বতন্ত্র এবং বৈধ সম্ভাব্য সমাধান রয়েছে:

1110    1110    1110    1110    
2*31    2*31    2*31    2*31
3*4*    3*5*    3**2    3**1
2*42    2*4*    2*4*    2*42
112*    1121    1121    112*

এর অর্থ বোর্ডটি অবিশ্বাস্যসমাধানযোগ্য বোর্ডের উদাহরণ এখানে :

1121
1??*
12?*
0122

এই বোর্ডটি সমাধানযোগ্য কারণ এখানে কেবলমাত্র একটি সম্ভাব্য বৈধ সমাধান রয়েছে:

1121
1*4*
12**
0122

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

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

যথারীতি, স্ট্যান্ডার্ড লুফোলগুলি প্রয়োগ হয় এবং বাইটের মধ্যে সংক্ষিপ্ততম সমাধান!

উদাহরণ:

নিম্নলিখিত উদাহরণগুলি সমস্ত সমাধানযোগ্য:

1121
1??*
12?*
0122

1110
1???
1110
0000

1110
3???
??20
*310

****
****
****
****

0000
0000
0000
0000

1100
*100
2321
??*2
13*2
1221
1*10
1110

1121
2*??
2*31
2220
1*10

নিম্নলিখিত উদাহরণগুলি সমস্ত অলসযোগ্য:

1110
2*31
3*??
2*4?
112?

01??11*211
12??2323*1
1*33*2*210
12?2122321
13?3101**1
1***101221

1***
3*52
2*31
12??
02??
01??

00000111
000012*1
00001*21
22101110
**100111
?31123*1
?311**31
**113*20

আমরা কি ধরে নিতে পারি যে বোর্ডটি কমপক্ষে একটি ঘরের সাথে আয়তক্ষেত্রাকার? এছাড়াও, আমরা কি ধরে নিতে পারি যে ইনপুটটি সর্বদা কমপক্ষে একটি সমাধান স্বীকার করবে? (উদাহরণস্বরূপ, 2?এর কোনও সমাধান নেই, যার অর্থ এটি মাইনসুইপারের আসল খেলা থেকে আসতে পারে না
Hence

2
মাইনসুইপারে এটির কোনও মূল্য নেই যা এখানে আপনার অতিরিক্ত তথ্য নিখোঁজ রয়েছে: খনিগুলির সংখ্যা।
edc65

@ মাঠমান্ডান হ্যাঁ, ইনপুটটি সর্বদা কমপক্ষে একটি ঘর এবং কমপক্ষে একটি বৈধ সমাধান সহ আয়তক্ষেত্রাকার হবে।
ডিজেএমসিএমহেম

উত্তর:


20

জিএনইউ প্রোলগ, 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 এর পরিবর্তে তিনটি সংলগ্ন উপাদানের সেটগুলিতে; এন উপাদানগুলির i3 টি তালিকা এন 3-টিপলসের তালিকায় স্থানান্তর করে )। আমরা অভ্যন্তরীণভাবে একটি কক্ষ সংরক্ষণ করি , যেখানে খনিটির জন্য x 1 এবং একটি ননমাইনের জন্য 0 এবং y সংলগ্ন খনিগুলির সংখ্যা; বোর্ডে এই সীমাবদ্ধতা প্রকাশ করে। বোর্ডের প্রতিটি সারিতে প্রযোজ্য ; এবং সুতরাং একটি বৈধ বোর্ড কিনা তা পরীক্ষা করে দেখুন ।x/ycrcz(r,M)M

দুর্ভাগ্যক্রমে, সরাসরি এই কাজটি করার জন্য প্রয়োজনীয় ইনপুট ফর্ম্যাটটি অযৌক্তিক, সুতরাং আমাকে একটি পার্সারও অন্তর্ভুক্ত করতে হয়েছিল (যা সম্ভবত প্রকৃত নিয়ম ইঞ্জিনের চেয়ে বেশি কোডের জন্য অ্যাকাউন্টস, এবং বেশিরভাগ সময় ডিবাগিংয়ে ব্যয় করেছিল; মাইনসুইপার বিধি ইঞ্জিনটি বেশ কাজ করেছে) প্রথমবার, তবে পার্সারটি থিঙ্কোতে পূর্ণ ছিল)। qএকটি একক কক্ষকে একটি অক্ষর কোড এবং আমাদের ফর্ম্যাটের মধ্যে রূপান্তর করে। বোর্ডের একটি লাইন রূপান্তর করে (সীমানা হিসাবে লাইনটির প্রতিটি প্রান্তে অজানা সংখ্যক প্রতিবেশী খনি সহ একটি ঘর রেখে যা একটি খনি হিসাবে পরিচিত knownx/ylpপুরো বোর্ডকে রূপান্তর করে (নীচের সীমানা সহ, তবে উপরের অংশটি বাদ দিয়ে)। এই সমস্ত ফাংশন হয় সামনের দিকে বা পিছনের দিকে চালানো যেতে পারে, এইভাবে উভয়ই পার্স করতে পারে এবং বোর্ডটিকে প্রিন্ট-মুদ্রণ করতে পারে। (তৃতীয় আর্গুমেন্টের সাথে কিছু বিরক্তিকর ঝাঁকুনি রয়েছে 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ব্যবহারিক মাইনসুইপার সলভার হিসাবে ব্যবহার করতে চান (কারণ এটি একটি সীমাবদ্ধ সমাধানকারী ব্যবহার করে, এটি অত্যন্ত দক্ষ)।


11

হাস্কেল, 193 169 168 বাইট

c '?'="*!"
c x=[x]
g x|t<-x>>" ",w<-length(words x!!0)+1=1==sum[1|p<-mapM c$t++x++t,and[sum[1|m<-[-1..1],n<-[j-w,j,j+w],p!!(m+n)=='*']==read[d]|(j,d)<-zip[0..]p,d>'/']]

ব্যবহারের উদাহরণ: g "1121 1??* 12?* 0122"-> True

এটি কীভাবে কাজ করে: যে ?কোনও দ্বারা প্রতিস্থাপিত *বা !(এর !অর্থ পরে উপেক্ষা করা) সহ সমস্ত সম্ভাব্য বোর্ডের তালিকা তৈরি করুন । এটি এর মাধ্যমে সম্পন্ন হয়েছে mapM cতবে আমরা ইনপুট স্ট্রিংয়ে একগুচ্ছ স্পেসগুলি পুনরায় সরবরাহ এবং সংযোজন করার আগে যাতে আমাদের সূচি সীমার বাইরে না যায়। এই জাতীয় প্রতিটি বোর্ডের জন্য এটি পরীক্ষা করুন যে এটি সমস্ত উপাদানগুলির (সূচক j) উপর লুপ করে একটি বৈধ বোর্ড এবং এটি যদি d>'/'তার প্রতিবেশী (সূচক n, m) এর উপরেও একটি সংখ্যা ( ) থাকে তবে এটি গণনা করুন *এবং সংখ্যার সাথে তুলনা করুন। অবশেষে বৈধ বোর্ডগুলির তালিকার দৈর্ঘ্য পরীক্ষা করুন।


7

গণিত, 214 192 190 180 176 174 168 165 বাইট

0&/@Cases[b="*";If[!FreeQ[#,q="?"],(x#0@MapAt[x&,#,#&@@#~Position~q])/@{b,0},BlockMap[If[#[[2,2]]==b,b,Count[#,b,2]]&,#~ArrayPad~1,{3,3},1]]&@#,#/.q->_,All]=={0}&

ইউ + এফ 4 এ 1 (ব্যক্তিগত ব্যবহার) ধারণ করে। এই নামবিহীন ফাংশনটি "?"(যেমন সমস্তগুলির "?"সাথে "*"বা এর পরিবর্তে 0) এর জন্য সমস্ত সম্ভাব্য সংমিশ্রণগুলি আবিষ্কার করে এবং সেখানে কেবলমাত্র একটি বৈধ সমাধান রয়েছে কিনা তা যাচাই করে।

ব্যাখ্যা

b="*";

সেট bকরুন "*"

!FreeQ[#,q="?"]

qস্ট্রিং সেট করুন "?"। ইনপুটটিতে আছে কিনা তা পরীক্ষা "?"করুন।

If[ ..., (x#0 ... ,0}, BlockMap[ ... ]]

যদি True...

(x#0@MapAt[x&,#,#&@@#~Position~q])/@{b,0}

প্রথম সংঘটন প্রতিস্থাপন q(= "?"সহ) b(= "*") অথবা 0(অর্থাত দুই আউটপুট), এবং সমগ্র ফাংশন আবার প্রয়োগ করুন।


যদি False...

#~ArrayPad~1

এর একটি স্তর দিয়ে ইনপুটটি প্যাড করুন 0

BlockMap[If[#[[2,2]]==b,b,Count[#,b,2]]&, ... ,{3,3},1]

অফসেট ১ এর সাথে ইনপুটটি 3 x 3 ম্যাট্রিকিতে ভাগ করুন প্রতিটি পার্টিশনের জন্য একটি ফাংশন প্রয়োগ করুন যাতে মাঝারি মানটি b(= "*") হয় তবে আউটপুটটি b(= "*") হয়, এবং যদি মধ্যমানের মান হয় না b(= "*"), আউটপুট ইনপুট b(= "*") এর সংখ্যা । এই পদক্ষেপটি সমস্ত নম্বর কক্ষকে পুনরায় মূল্যায়ন করে।


Cases[ ... ,#/.q->_,All]

সমস্ত ফলাফল থেকে, ইনপুট মেলে এমন একটি সন্ধান করুন

0&/@ ... =={0}

ইনপুটটি দৈর্ঘ্য 1 কিনা তা পরীক্ষা করে দেখুন।


7

পার্ল, 215 বাইট

213 বাইট কোড + -p0পতাকা (2 বাইট)।

/.*/;$c="@+";$_=A x$c."
$_".A x$c;s/^|$/A/mg;sub t{my($_)=@_;if(/\?/){for$i(0..8,"*"){t(s/\?/$i/r)}}else{$r=1;for$i(/\d/g){$r&=!/(...)[^V]{$c}(.$i.)[^V]{$c}(...)(??{"$1$2$3"=~y%*%%!=$i?"":R})/}$e+=$r}}t$_;$_=$e==1

কোডটির ধারণাটি হ'ল প্রতিটি সম্ভাবনা পরীক্ষা করে দেখা হয় যে সেখানে একটি এবং কেবলমাত্র এমন একটি আছে যা সম্পূর্ণ ভরাট বোর্ডকে বৈধ করে তোলে।

আরও পঠনযোগ্য, কোডটি দেখে মনে হচ্ছে:

/.*/ ; $ সি = "@ +" ; # একটি লাইনের আকার গণনা করুন। 
$ _ = একটি এক্স $ সি "। n $ _" একটি এক্স $ সি ; শুরুতে "A" এর একটি লাইন যোগ করুন এবং শেষে অন্যটি। 
এস / ^ | $ / / মিলিগ্রাম ; প্রতিটি লাইনের শুরুতে এবং শেষে একটি "এ" যুক্ত করুন।                     

# ফানসিওন যা আসলে সমস্যার সমাধান করে সাব টি { আমার $ _ = পপ ; # প্যারামিটারটি পান, এটি $ _ (রিজেসের ডিফল্ট আর্গুমেন্ট) এ সঞ্চয় করুন। যদি ( / \? / ) { # যদি অন্য কোনও অজানা চর থাকে। জন্য $ i এর ( 0. 8 , "*" ) { # প্রত্যেক সম্ভাবনা চেষ্টা 
            টন ( গুলি / \? / $ i এর / R ) # reccursive কল যেখানে প্রথম অজানা গৃহস্থালির কাজ প্রতিস্থাপিত করা হয়েছে } } অন্য {
 
     
        
            
        
     # আর অজানা চরিত্র নেই, সুতরাং বোর্ডটি বৈধ কিনা here 
        r = 1 এখানে আমরা পরীক্ষা করে দেখি ; # যদি দ == 1 শেষে, তারপর বোর্ড বৈধ, অন্যথায় এটা না জন্য $ i এর ( / \ ডি / ) { # বোর্ডের প্রতিটি সংখ্যা বর্তমানে # নিম্নলিখিত Regex চেক আছে যদি একটি সংখ্যা বেষ্টিত হয় এর # খুব বেশি বা খুব সামান্য খনি। # (এটি কীভাবে কাজ করে: যাদু!) & 
         r & =! /(...)[^V]{$c}(.$i.)[^V]{$c}(...)(??{"$1$2$3"=~y%*%%! = $ i? "": আর}) / } 
        $ ই + = $ r # বৈধ বোর্ডের সংখ্যা বৃদ্ধি করুন। } } 
$ T: _ ;  
          
            
            
             
        
    
 # পূর্ববর্তী ফাংশনটি কল করুন 
$ _ = $ ই == 1 # যদি কেবলমাত্র একটি বৈধ বোর্ড থাকে (তবে p _ -p পতাকাটির জন্য অন্তর্ভুক্তভাবে মুদ্রিত ধন্যবাদ) পরীক্ষা করা হয়। 

মাঝখানে রেজেক্স সম্পর্কে:

/(...)[^V]{$c}(.$i.)[^V]{$c}(...)(??{"$1$2$3"=~y%*%%!=$i?"":R})/

মনে রাখবেন যে [^V]কেবলমাত্র "character n" সহ কোনও চরিত্র।
সুতরাং ধারণাটি হ'ল: একটি লাইনে 3 চর, তারপরে 3 ( $iমাঝের সাথে), তারপরে 3 3 টি সংখ্যার এই 3 টি দলটি সারিবদ্ধ করা হয়েছে, আপনাকে ধন্যবাদ [^V]{$c}এবং আমাদের আগ্রহী সংখ্যাটি মাঝখানে।
এবং তারপরে, সেই 9 টি চরিত্রের মধ্যে (বোমা) "$1$2$3"=~y%*%%সংখ্যা গণনা করে *: এটির থেকে আলাদা হলে $iআমরা খালি স্ট্রিংটি ম্যাচ করার জন্য যুক্ত করি ( ""=> তাত্ক্ষণিক মিল, রেজেক্স সত্য ফিরে আসে), অন্যথায়, আমরা ম্যাচ করার চেষ্টা করে ব্যর্থ হয়ে বাধ্য করি R( যা স্ট্রিংয়ে থাকতে পারে না)।
Regex ম্যাচ, তাহলে বোর্ড বৈধ, তাই আমরা সেট $rকরতে 0সঙ্গে $r&=!/.../
এবং এজন্য আমরা কিছু যুক্ত করিAপ্রতিটি লাইনের চারপাশে সর্বত্র: সুতরাং বোর্ডের প্রান্তের কাছাকাছি থাকা সংখ্যার প্রান্তের ক্ষেত্রে আমাদের উদ্বেগের দরকার নেই: তাদের Aপ্রতিবেশী হিসাবে থাকবে , যা খনি নয় (অবশ্যই, প্রায় কোনও চর কাজ করতে পারে, আমি বেছে নিয়েছি A)।

আপনি কমান্ড লাইন থেকে প্রোগ্রামটি চালাতে পারেন:

perl -p0E '/.*/;$c="@+";$_=A x$c."\n$_".A x$c;s/^|$/A/mg;sub t{my($_)=@_;if(/\?/){for$i(0..8,"*"){t(s/\?/$i/r)}}else{$r=1;for$i(/\d/g){$r&=!/(...)[^V]{$c}(.$i.)[^V]{$c}(...)(??{"$1$2$3"=~y%*%%!=$i?"":R})/}$e+=$r}}t$_;$_=$e==1' <<< "1121
1??*
12?*
0122"

জটিলতা সবচেয়ে খারাপ হতে পারে না: এটি বোর্ডের সংখ্যা O(m*9^n)যেখানে এবং বোর্ডের কোষের সংখ্যা (মাঝখানে রেজেক্সের জটিলতা গণনা ছাড়াই, যা সম্ভবত বেশ খারাপ)। আমার মেশিনে, এটি 4 অবধি বেশ দ্রুত গতিতে কাজ করে এবং 5 ধীর হতে শুরু করে, 6 এর জন্য কয়েক মিনিট সময় নেয় এবং আমি বড় সংখ্যার জন্য চেষ্টা করিনি didn'tn?m?


3

জাভাস্ক্রিপ্ট (ES6), 221 229

g=>(a=>{for(s=i=1;~i;g.replace(x,c=>a[j++],z=j=0).replace(/\d/g,(c,p,g)=>([o=g.search`
`,-o,++o,-o,++o,-o,1,-1].map(d=>c-=g[p+d]=='*'),z|=c)),s-=!z)for(i=a.length;a[--i]='*?'[+(c=a[i]<'?')],c;);})(g.match(x=/\?/g)||[])|!s

যদি সমস্ত ইনপুট বৈধ হওয়ার প্রত্যাশা করা হয় - এটি কমপক্ষে 1 টি সমাধান সহ - তবে আমি এর s==1সাথে পরিবর্তন করে একটি বাইট সংরক্ষণ করতে পারিs<2

কম গল্ফড

g=>{
  a = g.match(/\?/g) || []; // array of '?' in a
  s = 1; // counter of solutions
  for(i=0; ~i;) // loop to find all configurations of ? and *
  {
    // get next configuration
    for(i = a.length; a[--i] = '*?'[+( c = a[i] < '?')], c; );
    z = 0; // init at 0, must stay 0 if all cells count is ok
    g
    .replace(/\?/g,c=>a[j++],j=0) // put ? and * at right places
    .replace(/\d/g,(c,p,g)=>(
       // look for mines in all 8 directions
       // for each mine decrease c
       // if c ends at 0, then the count is ok
       [o=g.search`\n`,-o,++o,-o,++o,-o,1,-1].map(d=>c-=g[p+d]=='*'),
       z|=c // z stays at 0 if count is ok
    )) // check neighbour count
    s-=!z // if count ok for all cells, decrement number of solutions
  }
  return s==0 // true if exactly one solution found
}

পরীক্ষা

F=
g=>(a=>{for(s=i=1;~i;g.replace(x,c=>a[j++],z=j=0).replace(/\d/g,(c,p,g)=>([o=g.search`
`,-o,++o,-o,++o,-o,1,-1].map(d=>c-=g[p+d]=='*'),z|=c)),s-=!z)for(i=a.length;a[--i]='*?'[+(c=a[i]<'?')],c;);})(g.match(x=/\?/g)||[])|!s

out=x=>O.textContent+=x+'\n'

Solvable=['1121\n1??*\n12?*\n0122'
,'1110\n1???\n1110\n0000'
,'1110\n3???\n??20\n*310'
,'****\n****\n****\n****'
,'0000\n0000\n0000\n0000'
,'1100\n*100\n2321\n??*2\n13*2\n1221\n1*10\n1110'
,'1121\n2*??\n2*31\n2220\n1*10']
Unsolvable=['1110\n2*31\n3*??\n2*4?\n112?'
,'01??11*211\n12??2323*1\n1*33*2*210\n12?2122321\n13?3101**1\n1***101221'
,'1***\n3*52\n2*31\n12??\n02??\n01??'
,'00000111\n000012*1\n00001*21\n22101110\n**100111\n?31123*1\n?311**31\n**113*20']
out('Solvable')
Solvable.forEach(t=>out(t+'\n'+F(t)+'\n'))
out('Unsolvable')
Unsolvable.forEach(t=>out(t+'\n'+F(t)+'\n'))
<pre id=O></pre>


ওপ বলেছেন যে আপনি এই বাইটটি গল্ফ করতে পারেন।
ধ্বংসাত্মক লেবু

@ আবিষ্কারযোগ্য জলছবি ধন্যবাদ, আমি সমস্ত সংশোধন করেছি এবং সত্যই আরও কিছু বাইট সংরক্ষণ করেছি
c

0

জাভাস্ক্রিপ্ট (নোড.জেএস) , 167 বাইট

s=>g=(r=c='',[p,...q]=s,w)=>w?0:p?(g(r+0,q,p=='*')+g(r+1,q,1/p),c==1):c-=-![...s].some((p,i)=>p>' '&&[-1,1,-q,-1-q,-2-q,q,q+1,q+2].map(j=>p-=~~r[i+j])|p,q=s.search`
`)

এটি অনলাইন চেষ্টা করুন!

যদিও ওপেন "ইনপুট সবসময় আয়তক্ষেত্রাকার হবে, কমপক্ষে একটি সমাধান আছে", মিথ্যা নমুনা 3 টি মিলছে না, তাই আমার এখনও <2 সমাধান নয় 1 টি সমাধান প্রয়োজন

s=>(        // p.s. Here "block" can also mean \n
  c=0,          // possible mine count
  g=(           // recursive
    r='',       // mine states
    [p,...q]=s, // known info to check possible state for a block
    w           // invert condition, stop if true
  )=>
    w?0:
      p?(       // for each block
        g(r+0,q,p=='*')+   // possibly not bomb if doesn't say so
        g(r+1,q,1/p),      // number/newline can't be bomb
        c==1               // only one bomb
      ):
        c-=-![...s].some(  // no block doesn't satisfy
          (p,i)=>
            p>' '&& // \n don't mean number
                    // other symbols turn into NaN when counting
            [-1,1,-q,-1-q,-2-q,q,q+1,q+2].map(j=>p-=~~r[i+j])
                    // subtract each neighbor, OOB = 0
            |p,     // difference between intended and actual
            q=s.search('\n') // how many blocks in a line
        )
)

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