रेटिना , 61 55 बाइट्स
^((.)(?<!\2.+))*((){7}((?<-4>)(.)(?!(?<-4>.)*\4\6))*)*$
चूँकि यह केवल एक एकल रेगीक्स है, रेटिना मैच मोड में चलेगा और इसमें पाए जाने वाले मैचों की संख्या की रिपोर्ट करेगा, जो 1
मान्य अनुक्रमों के लिए होगा और 0
अन्यथा। यह गोल्फ की भाषाओं की तुलना में प्रतिस्पर्धी नहीं है, लेकिन मैं इसके साथ काफी खुश हूं, यह देखकर मैंने 260 बाइट्स के राक्षस के साथ शुरुआत की।
व्याख्या
^((.)(?<!\2.+))*
यह बिट चर लंबाई के अनूठे अक्षरों के एक उपसर्ग का उपभोग करता है, अर्थात यह संभावित रूप से अधूरे अग्रणी चंक से मेल खाता है। लुकबाइंड यह सुनिश्चित करता है कि इस बिट में मिलान किया गया कोई भी अक्षर पहले स्ट्रिंग में दिखाई नहीं दिया है।
अब शेष इनपुट के लिए, हम वर्णों को दोहराए बिना 7 के विखंडन का मिलान करना चाहते हैं। हम इस तरह के एक कबाड़ का मिलान कर सकते हैं:
(.)(?!.{0,5}\1)(.)(?!.{0,4}\2)(.)(?!.{0,3}\3)...(.)(?!.?\5).
यानी हम एक ऐसे चरित्र से मेल खाते हैं जो अन्य 6 वर्णों के लिए प्रकट नहीं होता है, फिर वह जो अन्य 5 वर्णों के लिए प्रकट नहीं होता है और इसी तरह। लेकिन इसके लिए काफी भयानक कोड पुनरावृत्ति की आवश्यकता होती है, और हमें एक अनुगामी (संभावित रूप से अधूरा) अलग से मिलान करना होगा।
बचाव के लिए समूहों को संतुलित करना! मैच करने का एक अलग तरीका
(.)(?!.{0,5}\1)
एक कैप्चर स्टैक पर 5 खाली मैचों को पुश करना है और इसे खाली करने का प्रयास करना है:
(){5}(.)(?!(?<-1>.)*\2)
*
कम से कम शून्य पुनरावृत्ति की अनुमति देता है {0,5}
, और क्योंकि हमने पांच कैप्चर को धकेल दिया है, यह 5 बार से अधिक पॉप करने में सक्षम नहीं होगा। यह इस पैटर्न के एकल उदाहरण के लिए लंबा है, लेकिन यह बहुत अधिक पुन: प्रयोज्य है। चूँकि हम नकारात्मक लुकअप में पॉपिंग कर रहे हैं , यह लुकहेड पूरा होने के बाद वास्तविक स्टैक को प्रभावित नहीं करता है। इसलिए लुकहेड के बाद, हमें स्टैक पर अभी भी 5 तत्व मिले हैं, कोई फर्क नहीं पड़ता कि अंदर क्या हुआ। इसके अलावा, हम बस प्रत्येक लुकहेड से पहले स्टैक से एक तत्व को पॉप कर सकते हैं, और कोड को एक लूप में चला सकते हैं, स्वचालित रूप से लुकहेड की चौड़ाई को 5 से घटाकर 0. करने के लिए। ताकि वास्तव में लंबे समय तक वास्तव में छोटा किया जा सके
(){7}((?<-1>)(.)(?!(?<-1>.)*\1\3))*
(आप दो अंतर देख सकते हैं: हम 5 के बजाय 7 धक्का दे रहे हैं। एक अतिरिक्त कब्जा है क्योंकि हम प्रत्येक पुनरावृत्ति से पहले पॉप करते हैं, इसके बाद नहीं। दूसरा वास्तव में आवश्यक है ताकि हम स्टैक से 7 बार पॉप कर सकें (जब से हम चाहते हैं) लूप को 7 बार चलाने के लिए), हम लुकहैड के अंदर उस ऑफ-बाय-वन एरर को यह सुनिश्चित करके ठीक कर सकते हैं कि \1
स्टैक पर अभी भी कम से कम एक एलिमेंट बाकी है।)
इसकी ख़ासियत यह है कि यह अनुगामी अपूर्ण चंक से भी मेल खा सकता है, क्योंकि हमें इसे 7 बार दोहराने की आवश्यकता नहीं है (यह सिर्फ आवश्यक अधिकतम है, क्योंकि हम स्टैक से अधिक बार पॉप नहीं कर सकते हैं)। इसलिए हमें केवल इतना करना है कि इसे दूसरे लूप में लपेटें और सुनिश्चित करें कि हम पाने के लिए स्ट्रिंग के अंत तक पहुंच गए हैं
^((.)(?<!\2.+))*((){7}((?<-4>)(.)(?!(?<-4>.)*\4\6))*)*$