CJam, 33 32 20 19 17 बाइट्स
@ Sp3000 और @ मार्टिनबटनर से बड़े पैमाने पर समर्थन के साथ संशोधित संस्करण:
qN/_z]{:e`z,3<}/|
इसे ऑनलाइन आज़माएं
योगदान
- @ Sp3000 ने मेरे मूल एल्गोरिथ्म के लिए एक महत्वपूर्ण सरलीकरण का सुझाव दिया।
- @ मार्टिनबटनर ने संशोधित दृष्टिकोण के लिए अपने पागल गोल्फिंग कौशल को लागू किया, जिसके परिणामस्वरूप निश्चित रूप से कम कोड की तुलना में मैं सरलीकरण पर विचार करने के बाद भी आ गया था।
एल्गोरिथम और सबूत
निम्नलिखित पहेली को क्षैतिज रूप से अलग करने के लिए मापदंड बताते हैं। ऊर्ध्वाधर मामले को पंक्तियों के बजाय स्तंभों को देखकर या चरित्र मैट्रिक्स को स्थानांतरित करके और फिर से पंक्तियों को देखकर निर्धारित किया जा सकता है।
मैं एक ही अक्षर के अधिकतम अनुक्रम के लिए "खिंचाव" शब्द का उपयोग करूँगा। उदाहरण के लिए, निम्नलिखित पंक्तियों में क्रमशः 1, 2 और 3 स्ट्रेच हैं:
AAAAAAAA
BBBAAAAA
AABBBAAA
मैं एक पंक्ति / पहेली के लिए "इंटरलॉक्ड" शब्द का उपयोग करूंगा जो अलग नहीं हो सकता।
मुख्य अवलोकन यह है कि पहेली अलग-अलग स्लाइड कर सकती है यदि और केवल यदि सभी पंक्तियों में अधिकतम 2 खंड हैं । या उलट, यह इंटरलॉक किया जाता है अगर और केवल अगर 2 से अधिक हिस्सों के साथ कोई पंक्ति है ।
निम्नलिखित एक सख्त गणितीय प्रमाण के रूप में योग्य नहीं हो सकता है, लेकिन मेरा मानना है कि यह एक ठोस व्याख्या के लिए बनाता है कि ऐसा क्यों होना चाहिए।
यह देखना आसान है कि पहेली इंटरलॉक की गई है यदि इसमें 2 से अधिक हिस्सों की पंक्तियाँ हैं। 3 स्ट्रेच वाली पंक्ति को देखते हुए:
BBBAAB
यह स्पष्ट है कि यह पहेली को अलग-अलग फिसलने से रोकता है क्योंकि A
स्ट्रेच के बीच खिंचाव बंद B
है। इसका मतलब है कि पंक्ति इंटरलॉक की गई है, जो बदले में पूरी पहेली को इंटरलॉक कर देती है।
प्रमाण की विपरीत दिशा स्पष्ट नहीं है। हमें यह दिखाने की ज़रूरत है कि कोई इंटरलॉक की गई पहेलियाँ नहीं हैं जहाँ सभी पंक्तियों में केवल 1 या 2 स्ट्रेच हों। कुछ टिप्पणियों के साथ शुरू:
- केवल 1 स्ट्रेच वाली पंक्तियाँ इंटरलॉक होने वाली पहेली में योगदान नहीं करती हैं, क्योंकि वे बिना किसी टकराव के किसी भी दिशा में स्लाइड कर सकती हैं।
- यदि 2 स्ट्रेच वाली सभी पंक्तियों का क्रम समान है
A
और B
, पहेली स्पष्ट रूप से इंटरलॉक नहीं की गई है। इस मामले में, सभी A
कोशिकाएं सभी कोशिकाओं से बची रहती हैं B
, या इसके विपरीत, और दो टुकड़ों को अलग करने पर कोई टकराव नहीं होता है।
एकमात्र मुश्किल मामला पहेली होगा जहां हमारे पास अलग-अलग क्रम के 2 हिस्सों के साथ पंक्तियाँ हैं। मैं यह दिखाने जा रहा हूं कि दी गई विशिष्टताओं के तहत ऐसी पहेलियाँ मौजूद नहीं हैं । यह दिखाने के लिए, आइए एक आंशिक पहेली को देखें जिसमें यह विन्यास है, जहां .
वाइल्डकार्ड हैं:
.......
AAABBBB
.......
BBAAAAA
.......
अब, विनिर्देश का कहना है कि दोनों A
और B
सेल सभी वैध पहेली में बस जुड़े हुए हैं। बनाने के A
ऊपर आंशिक पहेली में जुड़े कोशिकाओं, हम दो विकल्प हैं:
हम B
उदाहरण के लिए, एक के चारों ओर लूप करते हैं :
..AAAAAA
AAABBBBA
.......A
BBAAAAAA
........
ऐसा करने के लिए, हम अनपेक्षित रूप से एक पंक्ति को 3 खंडों तक बढ़ाते हैं, इसलिए यह हमें कभी भी एक मान्य पहेली नहीं देगा जहां सभी पंक्तियों में अधिकतम 2 खंड हैं।
हम उन्हें एक सीधे रास्ते पर जोड़ते हैं:
.......
AAABBBB
..A....
BBAAAAA
.......
A
कोशिकाओं अब बस जुड़े हुए हैं, और अभी भी अधिक से अधिक 2 हिस्सों के साथ कोई भी पंक्ति रहे हैं। हालांकि, B
कोशिकाओं को भी बस जुड़ा होना चाहिए। सीधा रास्ता अब जुड़ा हुआ A
कोशिकाओं द्वारा अवरुद्ध है , और कोशिकाओं को जोड़ने का एकमात्र तरीका B
कोशिकाओं में से एक के चारों ओर लूप A
है। यह केस 1 पर वापस जाता है, जहां हम 3 स्ट्रेच की पंक्तियों को बनाए बिना ऐसा नहीं कर सकते।
स्ट्रेच को गिनने के लिए, कार्यान्वयन CJam RLE ऑपरेटर का उपयोग करता है।
संहिता की व्याख्या
qN/ Get input and split at newlines.
_z Make a transposed copy.
] Wrap the original and transposed puzzle in an array so that we can
loop over the two.
{ Start of loop over original and transposed puzzle.
:e` Apply RLE to all rows.
z, Transpose the matrix with the RLE rows, and take the element count of the
result. Or in other words, take the column count. This will be the length
of the longest row after RLE.
3< Check the length for less than 3.
}/ End of loop over original and transposed puzzle.
| Or the results of the two.