9 के गुणक के लिए रेगेक्स


14

एक परिमित राज्य मशीन का वर्णन करना आसान है जो 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"को स्वीकार किया जाना चाहिए।

2
संबंधित , निश्चित नहीं है कि यह एक डुप्लिकेट माना जाएगा
एएससीआईआई-केवल 23

आह, हम्म! मैंने "रेगेक्स मल्टीपल" की खोज की थी, लेकिन "रेगेक्स डिविजबल" नहीं। मुझे लगता है कि यह बहुत ही समान है, हाँ।
एलेक्स मेइबर्ग

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

200 से कम किबिबाइट्स का समाधान संभव है, इसलिए यह बहुत बड़ा नहीं होगा
टन हास्पेल

3
.NET के एक्सटेंशन का उपयोग करके समाधान:^(0|9|(?<c>1|(?<c>2|(?<c>3|(?<c>4|(?<c>5|(?<c>6|(?<c>7|(?<c>8))))))))((?<-c>){9})?)*$(?(c).)
नील

जवाबों:


3

हास्केल , 207,535 202,073 बाइट्स

5,462 बाइट्स जहां संभव हो के 0|9बजाय का उपयोग करके बचाया [09]

digits n
  | x == 0    = "0|9"
  | otherwise = show x
  where x = mod n 9

regex 0 = "[09]*"
regex n = (regex' n (-1) (-1)) ++ "*"

regex' 0 start end = digits (end - start)
regex' n start end = '(':(regex' 0 start end) ++ (concat ['|':(regex' (n-x) (start-x) (-1)) ++ (regex (n-x))
                                                  ++ (regex' (n-x) (-1) (end-x)) | x <- [1..n]]) ++ ")"

main = do
  putStr ("^" ++ (regex 8) ++ "$")

इसे ऑनलाइन आज़माएं!

चीजों को शुरू करने के लिए लिंक किए गए लेख के फुटनोट्स में दिए गए रेगेक्स का बस एक त्वरित अनुकूलन।

उत्पादन रीगेक्स का पास्टिबिन , हरमन लाउएनस्टीन के सौजन्य से।

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


आप यह भी परीक्षण कर सकते हैं कि आपकी विधि 2 से विभाज्यता के लिए क्या देती है (जैसा कुछ होना चाहिए /even$/) और 5 से विभाज्यता (कुछ ऐसा होना चाहिए /[05]$/)। PS: अपने कोड की भाषा का उल्लेख करें
Ton Hospel

यहां आउटपुट के साथ एक पास्टबिन है ( हजारों बाइट्स को बचाने के लिए ([09]|प्रतिस्थापित सभी घटनाओं के साथ (0|9|)
हरमन एल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.