मूल समाधान: जावास्क्रिप्ट - 261 255 228 227 179 153 अक्षर
/(\d)(\1(\d|.{6}|.{9})|(\d|.{6}|.{9})\1|.{7}\1(.|.{9})|(.|.{9})\1.{7}|(.{7,9}|.{17})\1.{8}|.{8}\1(.{7,9}|.{17}))\1/.test(s.replace(/\n/g,'A'))?'yes':'no'
यह मानते हुए कि परीक्षण करने के लिए स्ट्रिंग चर में है s
(यह एक समारोह बनाने के लिए f
तो जोड़ने f=s=>
के लिए एक संकेत से इनपुट लेने के लिए तो जगह ले, कोड या की शुरुआत करने के लिए अन्यथा, s
साथ prompt()
)।
आउटपुट कंसोल के लिए है।
3 rd समाधान: जावास्क्रिप्ट (ECMAScript 6) - 178 वर्ण
p=x=>parseInt(x,36);for(t="2313ab1b8a2a78188h9haj9j8iaiir9r",i=v=0;s[i];i++)for(j=0;t[j];v|=s[i]==s[i+a]&s[i]==s[i+b]&i%9<8&(b>3|(i+b-a)%9<8))a=p(t[j++]),b=p(t[j++]);v?'yes':'no'
मैं 2 ले लिया nd समाधान, नीचे, (जो कुछ विन्यास में पात्रों के लिए जाँच करने के लिए नियमित अभिव्यक्ति का उपयोग करता है) और यह फिर से काम सिर्फ नियमित अभिव्यक्ति का उपयोग किए बिना एक ही विन्यास में समान पात्रों के लिए स्ट्रिंग की जाँच करने के।
बेस -36 स्ट्रिंग "2313ab1b8a2a78188h9haj9j8iaiir9r"
ऑफ़सेट के जोड़े को जाँचने के लिए देता है - यानी जोड़ी23
में जाँच का परिणाम होता है कि अगर मैं वें चरित्र (i + 2) वें चरित्र और (i + 3) वें चरित्र (नियमित अभिव्यक्ति के बराबर ) के समान है (.).\1\1
- कुछ अतिरिक्त जांच के साथ यह सुनिश्चित करें कि असमान चरित्र एक नई पंक्ति नहीं है)।
2 nd समाधान: जावास्क्रिप्ट (ECMAScript 6) - 204 वर्ण
p=x=>parseInt(x,18);g=a=>a?a>1?"(.|\\n){"+a+"}":".":"";f=(x,a,b)=>RegExp("(.)"+g(a)+"\\1"+g(b)+"\\1").test(x);for(t="10907160789879h8",i=v=0;t[i];v|=f(s,x,y)||f(s,y,x))x=p(t[i++]),y=p(t[i++]);v?'yes':'no'
बेस -18 स्ट्रिंग से लिए गए मानों के जोड़े का उपयोग करके कई नियमित अभिव्यक्तियाँ (अधिक विवरण के लिए नीचे देखें) बनाता है 10907160789879h8
और OR
सभी परीक्षणों को लेता है । इसे और कम करने के लिए आप ध्यान दे सकते हैं कि नियमित अभिव्यक्तियाँ उन जोड़ियों में आती हैं जहाँ एक दूसरे का "उल्टा" होता है (क्षैतिज रूप से और लंबवत रूप से 3-इन-पंक्ति के लिए नियमित अभिव्यक्तियों की अनदेखी करना क्योंकि ओपी कहता है कि वे कभी उपस्थित नहीं होंगे - यदि आप 0088
बेस -18 स्ट्रिंग में उन परीक्षणों को वापस जोड़ना चाहते हैं )।
व्याख्या
मान्य चालों के सभी संभावित विन्यासों को शामिल करते हुए 16 नियमित अभिव्यक्तियों से शुरू करें:
REs=[
/(\d)\1\1/, // 3-in-a-row horizontally
/(\d).\1\1/, // 3-in-a-row horizontally after left-most shifts right
/(\d)\1.\1/, // 3-in-a-row horizontally after right-most shifts left
/(\d)(?:.|\n){9}\1\1/, // 3-in-a-row horizontally after left-most shifts down
/(\d)(?:.|\n){7}\1.\1/, // 3-in-a-row horizontally after middle shifts down
/(\d)(?:.|\n){6}\1\1/, // 3-in-a-row horizontally after right-most shifts down
/(\d)\1(?:.|\n){6}\1/, // 3-in-a-row horizontally after left-most shifts up
/(\d).\1(?:.|\n){7}\1/, // 3-in-a-row horizontally after middle shifts up
/(\d)\1(?:.|\n){9}\1/, // 3-in-a-row horizontally after right-most shifts up
/(\d)(?:.|\n){7,9}\1(?:.|\n){8}\1/, // 3-in-a-row vertically (with optional top shifting left or right)
/(\d)(?:.|\n){7}\1(?:.|\n){9}\1/, // 3-in-a-row vertically after middle shifts right
/(\d)(?:.|\n){9}\1(?:.|\n){7}\1/, // 3-in-a-row vertically after middle shifts left
/(\d)(?:.|\n){8}\1(?:.|\n){7}\1/, // 3-in-a-row vertically after bottom shifts right
/(\d)(?:.|\n){8}\1(?:.|\n){9}\1/, // 3-in-a-row vertically after bottom shifts left
/(\d)(?:.|\n){17}\1(?:.|\n){8}\1/, // 3-in-a-row vertically after top shifts down
/(\d)(?:.|\n){8}\1(?:.|\n){17}\1/, // 3-in-a-row vertically after bottom shifts up
];
( नोट: क्षैतिज रूप से (0 वें ) और लंबवत रूप से 9 के भाग के लिए रेक्सक्स वें अप्रासंगिक हैं क्योंकि ओपी कहता है कि इनसे मेल खाने वाले इनपुट कभी भी मौजूद नहीं होंगे। )
इनपुट के खिलाफ उन में से प्रत्येक का परीक्षण यह निर्धारित करता है कि विन्यास का एक मान्य चाल पाया जा सकता है।
हालाँकि, नियमित अभिव्यक्तियों को इन 6 को देने के लिए जोड़ा जा सकता है:
/(\d)(?:.|(?:.|\n){9}|(?:.|\n){6})?\1\1/ // Tests 0,1,3,5
/(\d)\1(?:.|(?:.|\n){9}|(?:.|\n){6})?\1/ // Tests 0,2,6,8
/(\d)(?:.|\n){7}\1(?:.|(?:.|\n){9})\1/ // Tests 4,10
/(\d)(?:.|(?:.|\n){9})\1(?:.|\n){7}\1/ // Tests 7,11
/(\d)(?:(?:.|\n){7,9}|(?:.|\n){17})\1(?:.|\n){8}\1/ // Tests 9,14
/(\d)(?:.|\n){8}\1(?:(?:.|\n){7,9}|(?:.|\n){17})\1/ // Tests 9a,12,13,15
तब इन्हें एक नियमित अभिव्यक्ति में जोड़ा जा सकता है:
/(\d)(?:.|(?:.|\n){9}|(?:.|\n){6})?\1\1|(\d)\2(?:.|(?:.|\n){9}|(?:.|\n){6})?\2|(\d)(?:.|\n){7}\3(?:.|(?:.|\n){9})\3|(\d)(?:.|(?:.|\n){9})\4(?:.|\n){7}\4|(\d)(?:(?:.|\n){7,9}|(?:.|\n){17})\5(?:.|\n){8}\5|(\d)(?:.|\n){8}\6(?:(?:.|\n){7,9}|(?:.|\n){17})\6/
जिसे बस इनपुट के खिलाफ परीक्षण करने की आवश्यकता है।
परीक्षण के मामलों
कुछ परीक्षण मामलों जो अन्य लोगों को उपयोगी लग सकते (का उपयोग कर के इनपुट प्रारूप के अनुरूप नहीं है केवल 1-7 अंक लेकिन है कि आसानी से ठीक किया है और केवल एक 8x4 ग्रिड है - के बाद से है कि कम से कम सभी वैध आदानों की एक परीक्षण के लिए आवश्यक है )।
इनपुट स्ट्रिंग से एक मैप के प्रारूप में 16 से ऊपर नियमित अभिव्यक्ति के कौन से मेल खाते हैं।
Tests={
"12345678\n34567812\n56781234\n78123456": -1, // No Match
"12345678\n34969912\n56781234\n78123456": 1, // 3-in-a-row horizontally after left-most shifts right
"12345678\n34567812\n59989234\n78123456": 2, // 3-in-a-row horizontally after right-most shifts left
"12345978\n34567899\n56781234\n78123456": 3, // 3-in-a-row horizontally after left-most shifts down
"12345978\n34569892\n56781234\n78123456": 4, // 3-in-a-row horizontally after middle shifts down
"12345678\n34967812\n99781234\n78123456": 5, // 3-in-a-row horizontally after right-most shifts down
"12399678\n34967812\n56781234\n78123456": 6, // 3-in-a-row horizontally after left-most shifts up
"12345678\n34597912\n56789234\n78123456": 7, // 3-in-a-row horizontally after middle shifts up
"12345998\n34567819\n56781234\n78123456": 8, // 3-in-a-row horizontally after right-most shifts up
"12945678\n34597812\n56791234\n78123456": 9, // 3-in-a-row vertically after top shifts right
"12349678\n34597812\n56791234\n78123456": 9, // 3-in-a-row vertically after top shifts left
"12345978\n34569812\n56781934\n78123456": 10, // 3-in-a-row vertically after middle shifts right
"92345678\n39567812\n96781234\n78123456": 11, // 3-in-a-row vertically after middle shifts left
"12945678\n34967812\n59781234\n78123456": 12, // 3-in-a-row vertically after bottom shifts right
"12349678\n34569812\n56781934\n78123456": 13, // 3-in-a-row vertically after bottom shifts left
"12395678\n34567812\n56791234\n78193456": 14, // 3-in-a-row vertically after top shifts down
"12345698\n34567892\n56781234\n78123496": 15, // 3-in-a-row vertically after bottom shifts up
"12345678\n34567899\n96781234\n78123456": -1, // No match - Matches (.)\1.\1 but not 3 in a row
"12345679\n99567812\n56781234\n78123456": -1, // No match - Matches (.).\1\1 but not 3 in a row
};
संपादित करें 1
\d
एस के साथ बदलें .
- 6 अक्षरों को बचाता है।
संपादित करें 2
के (?:.|\n)
साथ बदलें [\s\S]
और अतिरिक्त गैर-कैप्चरिंग समूहों को हटा दिया और वापस संदर्भ (जैसा कि m-buettner द्वारा सुझाया गया है ) और हां / नहीं आउटपुट में जोड़ा गया।
संपादित करें 3
- एक बेस -18 स्ट्रिंग से अलग-अलग नियमित एक्सप्रेशन बनाने के लिए ECMAScript 6 समाधान जोड़ा गया।
- क्षैतिज रूप से ( m-buettner द्वारा सुझाए गए ) 3-in-a-row के परीक्षण हटा दिए गए ।
संपादित करें ४
एक और (छोटा) समाधान और दो और गैर-मिलान परीक्षण मामले जोड़े।
संपादित करें ५
संपादित करें ६
- नियमित अभिव्यक्ति के बिट्स के संयोजन द्वारा छोटा मूल समाधान (जैसा कि वादिम द्वारा सुझाया गया है )।