क्या मैं खानों को झाड़ू लगा सकता हूँ?


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

आपका काम या तो एक प्रोग्राम या फ़ंक्शन लिखना है जो एक वैध माइंसवीपर बोर्ड लेता है और यह निर्धारित करता है कि यह सॉल्व है या नहीं। "मान्य माइनस्वीपर बोर्ड" से मेरा मतलब है कि इनपुट हमेशा आयताकार होगा, कम से कम एक समाधान होगा, और इसमें अन्य अमान्य वर्ण नहीं होंगे।

आपका इनपुट वर्णों की एक श्रेणी, तार की एक सरणी, नई रेखाओं से युक्त एक स्ट्रिंग आदि हो सकता है। आउटपुट एक सत्य मूल्य होना चाहिए अगर यह सॉल्व है और यदि नहीं है तो मिथ्या मान है। मैं प्रदर्शन को लेकर बहुत चिंतित नहीं हूं, लेकिन आपके समाधान को सैद्धांतिक रूप से किसी भी आकार के इनपुट के लिए काम करना चाहिए ।

हमेशा की तरह, मानक कमियां लागू होती हैं और बाइट्स जीत में सबसे छोटा समाधान होता है!

उदाहरण:

निम्नलिखित उदाहरण सभी हल हैं:

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?कोई समाधान नहीं है, जिसका अर्थ है कि यह माइनस्वीपर के एक वास्तविक खेल से नहीं आ सकता है। इसलिए इसे "माइनस्वीपर बोर्ड" नहीं माना जाता है ... हाँ?)
गणितम्

2
यह कुछ भी नहीं है कि MineSweeper में आपके पास एक अतिरिक्त जानकारी है जो यहां गायब है: खानों की संख्या।
edc65

@ मथमैंडन हां, इनपुट हमेशा आयताकार होगा जिसमें कम से कम एक सेल और कम से कम एक वैध समाधान होगा।
DJMcMayhem

जवाबों:


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 के बजाय तीन आसन्न तत्वों के सेट पर; n तत्वों iकी 3 सूचियों को n 3-ट्यूपल्स की सूची में स्थानांतरित करता है )। हम आंतरिक रूप से एक सेल को स्टोर करते हैं , जहां x एक खदान के लिए 1 और नॉनमाइन के लिए 0 है, और y समीपवर्ती खानों की संख्या है; इस बाधा को बोर्ड पर व्यक्त करता है। बोर्ड की हर पंक्ति पर लागू होता है; और यह देखने के लिए कि क्या एक वैध बोर्ड है।x/ycrcz(r,M)M

दुर्भाग्य से, इस काम को सीधे करने के लिए आवश्यक इनपुट प्रारूप अनुचित है, इसलिए मुझे एक पार्सर भी शामिल करना पड़ा (जो कि शायद वास्तविक नियम इंजन की तुलना में अधिक कोड के लिए होता है, और अधिकांश समय डिबगिंग में खर्च होता है; माइनस्वीपर नियम इंजन बहुत अच्छा काम करता है; पहली बार, लेकिन पार्सर थिंकोस से भरा था)। qएक चरित्र कोड और हमारे प्रारूप के बीच एक एकल सेल धर्मान्तरित । बोर्ड की एक पंक्ति को परिवर्तित करता है (एक सेल को छोड़कर जो एक खदान के रूप में जाना जाता है, लेकिन एक सीमा के रूप में लाइन के प्रत्येक किनारे पर अज्ञात खानों की संख्या के साथ);x/ylpपूरे बोर्ड को परिवर्तित करता है (नीचे की सीमा सहित, लेकिन शीर्ष को छोड़कर)। इन सभी कार्यों को आगे या पीछे चलाया जा सकता है, इस प्रकार बोर्ड को पार्स और सुंदर प्रिंट दोनों किया जा सकता है। (तीसरे तर्क के साथ कुछ कष्टप्रद झंझट है p, जो बोर्ड की चौड़ाई को निर्दिष्ट करता है, इसका कारण यह है कि प्रोलॉग में एक मैट्रिक्स प्रकार नहीं है, और अगर मैं बोर्ड को आयताकार होने के लिए विवश नहीं करता हूं, तो कार्यक्रम में जाएगा एक अनंत लूप बोर्ड के चारों ओर उत्तरोत्तर व्यापक सीमाओं की कोशिश कर रहा है।)

mमुख्य Minesweeper हल फ़ंक्शन है। यह इनपुट स्ट्रिंग को पार्स करता है, एक बोर्ड को एक सही बॉर्डर के साथ उत्पन्न करता है (बोर्ड pके अधिकांश को बदलने के लिए पुनरावर्ती मामले का उपयोग करके , फिर शीर्ष सीमा को उत्पन्न करने के लिए सीधे आधार मामले को कॉल करता है, जिसमें नीचे की सीमा के समान संरचना है)। तब यह कॉल करता हैz(r,[R|M])Minesweeper रूल्स इंजन को चलाने के लिए, जो (इस कॉल पैटर्न के साथ) एक जेनरेटर बन जाता है जो केवल वैध बोर्ड बनाता है। इस बिंदु पर, बोर्ड को अभी भी बाधाओं के एक सेट के रूप में व्यक्त किया गया है, जो संभवतः हमारे लिए अजीब है; हम शायद बाधाओं का एक सेट हो सकता है जो एक से अधिक बोर्ड का प्रतिनिधित्व कर सकता है। इसके अतिरिक्त, हमने अभी तक कहीं भी निर्दिष्ट नहीं किया है कि प्रत्येक वर्ग में अधिकतम एक खदान है। जैसे, हमें प्रत्येक वर्ग के स्पष्ट रूप से "वेवफॉर्म को ढहाने" की आवश्यकता है, इसे विशेष रूप से या तो एक (एकल) मेरा या एक नॉनलाइन होना चाहिए, और ऐसा करने का सबसे आसान तरीका यह है कि इसे पार्सर बैकवर्ड ( var(V)ऑन पर) के माध्यम से चलाया जाए q(63,V)केस को ?पीछे की तरफ से चल रहे केस को रोकने के लिए डिज़ाइन किया गया है , और इस तरह बोर्ड को डिप्रेस करने पर यह पूरी तरह से ज्ञात होने पर मजबूर करता है)। अंत में, हम पार्स बोर्ड से लौटते हैंm; mइस प्रकार एक जनरेटर बन जाता है जो आंशिक रूप से अज्ञात बोर्ड लेता है और इसके अनुरूप सभी ज्ञात बोर्डों को उत्पन्न करता है।

यह वास्तव में माइनस्वीपर को हल करने के लिए पर्याप्त है, लेकिन प्रश्न स्पष्ट रूप से यह जांचने के लिए कहता है कि क्या सभी समाधान खोजने के बजाय एक ही समाधान है। जैसे, मैंने एक अतिरिक्त विधेय लिखा, sजो जनरेटर mको एक सेट में परिवर्तित करता है , और फिर दावा करता है कि सेट में ठीक एक तत्व है। इसका मतलब है कि struthy (वापस आ जाएगी yes) अगर वहाँ वास्तव में ठीक एक समाधान है, या falsey (है no) अगर वहाँ एक से अधिक या एक से कम है।

dसमाधान का हिस्सा नहीं है, और बायटेकाउंट में शामिल नहीं है; यह स्ट्रिंग्स की एक सूची को मुद्रित करने के लिए एक फ़ंक्शन है, हालांकि यह एक मैट्रिक्स था, जो mएएससीआईआई कोड की एक सूची के रूप में स्ट्रिंग द्वारा उत्पन्न बोर्डों का निरीक्षण करने के लिए संभव बनाता है (जीएनयू प्रोलॉग स्ट्रिंग्स को प्रिंट करता है, क्योंकि यह दो समान रूप से व्यवहार करता है; यह प्रारूप पढ़ने के लिए काफी कठिन है)। यह परीक्षण के दौरान उपयोगी है, या यदि आप 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}&

इसमें U + F4A1 (निजी उपयोग) शामिल है। इस अनाम फ़ंक्शन के लिए सभी संभावित संयोजन मिलते हैं "?"(यानी सभी के "?"साथ "*"या उसके स्थान पर 0) और जाँच करता है कि क्या केवल एक वैध समाधान है।

व्याख्या

b="*";

को सेट bकरें "*"

!FreeQ[#,q="?"]

qस्ट्रिंग पर सेट करें "?"। जांचें कि क्या "?"इनपुट में है।

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

यदि True...

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

पहले की घटना की जगह q(= "?") के साथ b(= "*") या 0(यानी दो outputs), और पूरे समारोह फिर से लागू होते हैं।


यदि False...

#~ArrayPad~1

की एक परत के साथ इनपुट पैड 0

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

ऑफसेट 1 के साथ 3 x 3 मैट्रिसेस में इनपुट को विभाजित करें। प्रत्येक विभाजन के लिए, एक फ़ंक्शन लागू करें जैसे कि यदि मध्य मान b(= "*") है, तो आउटपुट b(= "*") है, और यदि मध्य मान b(= "*") नहीं है, तो आउटपुट इनपुट में b(= "*") की संख्या है । यह चरण सभी संख्या कोशिकाओं का पुनर्मूल्यांकन करता है।


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

सभी परिणामों से, उन लोगों को ढूंढें जो इनपुट से मेल खाते हैं

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

जांचें कि क्या इनपुट लंबाई 1 है।


7

पर्ल, 215 बाइट्स

कोड + -p0झंडे (2 बाइट्स) के 213 बाइट्स ।

/.*/;$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

कोड का विचार हर संभावना का परीक्षण करना है और देखना है कि क्या एक और केवल एक ही है जो पूरी तरह से भरे बोर्ड की ओर जाता है जो मान्य है।

अधिक पठनीय, कोड जैसा दिखता है:

/.* / ; $ c = "@ +" ; # एक रेखा का आकार गिनें। 
$ _ = ए x $ सी "एन + $ _" एक एक्स $ सी ; # शुरुआत में "ए" की एक पंक्ति और अंत में दूसरी जोड़ें। 
s / ^ | $ / / मिलीग्राम              ; # प्रत्येक पंक्ति के प्रारंभ और अंत में एक "ए" जोड़ें।        

# Funcion है कि वास्तव में समस्या का हल उप टी { मेरी $ _ = पॉप ; # पैरामीटर प्राप्त करें, इसे $ _ में संग्रहीत करें (डिफ़ॉल्ट तर्क regex के लिए)। अगर ( / \ /? ) { # अगर कोई अन्य अज्ञात चार है। के लिए $ मैं ( 0. 8 , "*" ) { # हर संभावना की कोशिश 
            टी ( रों / \? / $ i / आर ) # reccursive कॉल जहां पहले अज्ञात चार प्रतिस्थापित किया गया है
 
     
        
            
         } } किसी और {
     # कोई और अधिक अज्ञात चरित्र नहीं है, इसलिए यहां हम जांचते हैं कि क्या बोर्ड वैध है 
        $ r = 1 ; # अगर आर == 1 अंत में, तो बोर्ड मान्य है, अन्यथा यह नहीं है के लिए $ मैं ( / \ घ / ) { # मंडल प्रत्येक संख्या वर्तमान के लिए # निम्नलिखित regex जांच करता है कि वहाँ है एक नंबर घिरा हुआ है या तो # बहुत अधिक या बहुत कम खानों से। # (यह कैसे काम करता है: जादू!) 
         $ r & =! /(...)[^V]{$c}(.$i.)[^V]{$c}(...)(??{"$1$2$3"=~y%*%%! = $ i? "": R}) / } 
        $ e + = $ r # मान्य बोर्डों की संख्या बढ़ाएँ। } } 
टी $ _ ;  
          
            
            
             
        
    
 # पिछले फ़ंक्शन को कॉल करें 
$ _= $ e == 1 # चेक करता है कि क्या केवल एक वैध बोर्ड है ($ _ स्पष्ट रूप से -p ध्वज के लिए धन्यवाद मुद्रित है)। 

बीच में regex के बारे में:

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

ध्यान दें कि [^V]केवल "किसी भी वर्ण सहित, \ n" के लिए खड़ा है।
तो विचार यह है: एक पंक्ति पर 3 चार, फिर अगले पर 3 ( $iबीच में), फिर अगले पर 3। 3 संख्याओं के उन 3 समूहों को संरेखित किया जाता है, [^V]{$c}जिसकी हम धन्यवाद करते हैं और जिस संख्या में हम रुचि रखते हैं वह बीच में है।
और फिर, उन 9 पात्रों "$1$2$3"=~y%*%%में *(बम) की संख्या को गिना जाता है : यदि यह इससे अलग है $i, तो हम मिलान करने के लिए एक खाली स्ट्रिंग जोड़ते हैं ("" => तत्काल मिलान, रेग्जक्स सच लौटता है), अन्यथा, हम मिलान करने की कोशिश करके एक असफलता को बल देते हैं R( जो स्ट्रिंग में नहीं हो सकता है)।
रेगुलर एक्सप्रेशन से मेल खाता है, तो बोर्ड मान्य नहीं है, तो हम सेट किया गया है $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)जगह nहै जहां ?बोर्ड पर संख्या है , और mबोर्ड पर कोशिकाओं की संख्या है (बीच में रेगेक्स की जटिलता की गिनती के बिना, जो शायद बहुत बुरा है)। मेरी मशीन पर, यह 4 तक के लिए बहुत तेजी से काम करता है ?, और 5 धीमा हो जाता है, 6 के लिए कुछ मिनट लगते हैं, और मैंने बड़ी संख्या के लिए प्रयास नहीं किया।


3

जावास्क्रिप्ट (ईएस 6), 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>


Op ने कहा है कि आप उस बाइट को गोल्फ कर सकते हैं।
विनाशकारी नींबू

@DestructibleWatermelon धन्यवाद, मैंने सभी को संशोधित किया और कुछ और बाइट्स
बचाए

0

जावास्क्रिप्ट (Node.js) , 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 मेल नहीं खाता है, इसलिए मुझे अभी भी 1 समाधान की आवश्यकता है, <2 समाधान नहीं

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.