एक परिमित राज्य मशीन का वर्णन करना आसान है जो 9 के गुणकों को पहचानता है: अंक योग (मॉड 9) का ट्रैक रखें और जो भी अंक स्वीकार किया जाता है उसे आगे जोड़ें। इस तरह के एक एफएसएम में केवल 9 राज्य हैं, बहुत सरल! एफएसएम-पहचान और नियमित भाषाओं के बीच समानता से, 9. के गुणकों के लिए एक नियमित अभिव्यक्ति है। हालांकि, ऐसी किसी भी नियमित अभिव्यक्ति की संभावना है ... बहुत ... लंबी। के रूप में, एक गीगाबाइट के आदेश पर होने की संभावना।
3. के गुणकों के लिए https://www.quaxio.com/triple/ पर एक काम किया गया उदाहरण है। पृष्ठ के निचले भाग पर, लेखक कुछ हद तक "हाथ से अनुकूलित" समाधान प्रदान करता है जो भोले रूपांतरण से थोड़ा छोटा है। FSM regex करने के लिए।
चुनौती:
9. के गुणकों का पता लगाने के लिए आपको एक regex बनाना चाहिए। चूंकि इस तरह के regex के बहुत लंबे होने की उम्मीद है, मैं पूछता हूं कि आप एक ऐसा प्रोग्राम प्रदान करें जो आपके regex का प्रिंट आउट ले सके। (यदि आप वास्तव में पूरे रेगेक्स देना चाहते हैं, तो शायद इसे कहीं और होस्ट करें और इसे यहां लिंक करें!)
आपको अपने प्रोग्राम के आउटपुट की सटीक वर्ण गणना हमें बताने में सक्षम होना चाहिए - इसलिए ऐसा प्रोग्राम होना जो बस एक निश्चित लंबाई तक सभी रीजैक्स की कोशिश करता है, जब तक कि यह एक ऐसा काम नहीं करता है, तब तक स्वीकार्य नहीं है जब तक कि यह जल्दी से पर्याप्त रूप से नहीं चलता है। इसे पूरा करने के लिए चलाएं और हमें परिणामी रेगेक्स की लंबाई दें!
अंक कम से कम आउटपुट रेगेक्स होने के लिए हैं, न कि प्रोग्राम की लंबाई पर आधारित, बिल्कुल। चूंकि रेगेक्स "प्रोग्राम" है, जिसके लिए मैं पूछ रहा हूं, और यह बहुत आसानी से यहां प्रसारित करने के लिए बहुत लंबा है, मैं अभी भी इस कोड-गोल्फ को टैग कर रहा हूं।
नियम:
- इनपुट में केवल मिलान वाले वर्ण शामिल होंगे
[0-9]*
। - आपका रेगेक्स 9 के गुणकों से मेल खाना चाहिए , लेकिन कुछ और नहीं। ऐसे मामले जो पूरी तरह से अंकीय 0-9 से नहीं बने हैं और जो अमान्य इनपुट हैं, वे आपकी इच्छा के अनुसार मिलान या विफल हो सकते हैं।
- इस प्रेरणा को देखते हुए कि यह डीएफए द्वारा आसानी से पहचाना जाता है, परिणामस्वरूप रेगेक्स को वास्तव में अधिक थ्योरिटिक शब्दावली में नियमित अभिव्यक्ति होना चाहिए , अर्थात, केवल ऑपरेटर जिसके तहत नियमित भाषाएं बंद हैं। सटीक होने के लिए, केवल उन्हीं चीजों की अनुमति है:
- शाब्दिक, चरित्र पर्वतमाला (
[ab]
,[a-f]
,[^k]
), क्लीन तारा (*
), लंगर (^
और$
), कोष्ठक के माध्यम से समूहीकरण, प्रत्यावर्तन (|
), वैकल्पिक शब्दों (?
), एक या अधिक शब्द (+
), lookaheads ((?=)
), नकारात्मक lookaheads ((?!)
), lookbehinds ((?<=)
), नकारात्मक lookbehinds ((?<!)
), सशर्त (जैसा कि https:// www. अनियमित-expressions.info/conditional.html -(?(?=test)then|else)
) में, और बंधे हुए लंबाई का बैकरेफेरेंस ( नीचे देखें)।
- शाब्दिक, चरित्र पर्वतमाला (
- उन चीजों के उदाहरण जिन्हें अनुमति नहीं है :
- मनमाने ढंग से लंबाई, आगे के संदर्भ, पुनरावृत्ति, सबरूटीन्स, लूपिंग निर्माण, निष्पादन योग्य कोड, 'एक्वल' के किसी भी रूपांतर, या एक अंकगणितीय मूल्य के लिए स्ट्रिंग निर्माण के लिए अंतर्निहित निर्माण।
- बैकरेफरेंस जो एक बंधी-बंधाई लंबाई वाली स्ट्रिंग को दिखाया जा सकता है, स्वीकार्य हैं, क्योंकि वे परिमित अवस्था में संग्रहीत की जा सकती हैं और भाषा की नियमितता में परिवर्तन नहीं करती हैं। उदाहरण के लिए, रेगेक्स
(..2.[3-5])4\1.\1
स्वीकार्य है, क्योंकि कैप्चरिंग ग्रुप पर बाध्य लंबाई है\1
। यह एक नियमित निर्माण है। इस तरह के एक निर्माण(2*)0\1
स्वीकार्य नहीं है, क्योंकि कब्जा किए गए समूह को परिमित स्थिति में संग्रहीत नहीं किया जा सकता है। - आपका रेगेक्स अपनी इच्छानुसार पूर्णांक वाले प्रमुख शून्य के साथ पूर्णांक को स्वीकार या अस्वीकार करने के लिए स्वतंत्र है। हालांकि, स्ट्रिंग
"0"
को स्वीकार किया जाना चाहिए।
^(0|9|(?<c>1|(?<c>2|(?<c>3|(?<c>4|(?<c>5|(?<c>6|(?<c>7|(?<c>8))))))))((?<-c>){9})?)*$(?(c).)