क्या नियमित अभिव्यक्ति एक प्रोग्रामिंग भाषा है?


27

शैक्षणिक अर्थ में, क्या नियमित अभिव्यक्ति एक प्रोग्रामिंग भाषा के रूप में योग्य हैं?

मेरी जिज्ञासा की प्रेरणा एक SO प्रश्न है जिसे मैंने अभी देखा था जिसमें पूछा गया था कि "क्या एक्स को एक्सजेक्स कर सकते हैं?" और यह मुझे आश्चर्यचकित करता है कि उनके उपयोग के संभावित समाधानों के बारे में सामान्य अर्थों में क्या कहा जा सकता है।

मैं मूल रूप से पूछ रहा हूं, "क्या नियमित अभिव्यक्ति ट्यूरिंग पूर्ण है"?


9
तो मूल रूप से, आप पूछ रहे हैं "नियमित अभिव्यक्ति पूर्ण हो रही है"?
FrustratedWithFormsDesigner

यह अच्छा होगा यदि कोई इसके अलावा विस्तृत हो, लेकिन हां
एरोन एनोडाइड

4
"ट्यूरिंग एक्सप्रेशन एज़

5
(1 मिनट बाद एक संपादित करें) और यदि आप प्रश्न और स्पष्टीकरण के उस मार्ग का नेतृत्व करना चाहते हैं, तो आप शायद सीएससी एक्सचेंज को देखना चाहते हैं । पंप लेम्मा के लिए सबसे आसान खंडन कि "एक नियमित रूप से भाषा से मेल कर सकते हैं एक ^ nb ^ n" (जो एक ट्यूरिंग मशीन द्वारा तुलनीय है)।

1
मुझे लगता है कि वह पूछ रहा है कि क्या वह अपने "प्रोग्रामिंग भाषाओं" अनुभाग के तहत इसे फिर से शुरू कर सकता है। उस मामले में जवाब नहीं है। यह "टेक्नोलॉजीज" सेक्शन के अंतर्गत आता है।
नील

जवाबों:


46

रेगुलर एक्सप्रेशंस एक विशेष प्रकार का औपचारिक व्याकरण है जिसका उपयोग स्ट्रिंग्स और अन्य पाठ्य सूचनाओं को पार्स करने के लिए किया जाता है जिन्हें औपचारिक भाषा सिद्धांत में "नियमित भाषा" के रूप में जाना जाता है। वे प्रोग्रामिंग भाषा नहीं हैं। वे कोडिंग के लिए एक शॉर्टहैंड के रूप में अधिक हैं जो अन्यथा लागू करने के लिए बेहद थकाऊ होंगे और कभी-कभी आर्कगे लुकिंग रेगेक्स की तुलना में भी अधिक भ्रमित होंगे।

प्रोग्रामिंग भाषाओं को आम तौर पर उन भाषाओं के रूप में परिभाषित किया जाता है जो ट्यूरिंग कंप्लीट हैं । ऐसी भाषाओं को किसी भी कम्प्यूटेशनल फ़ंक्शन को संसाधित करने में सक्षम होना चाहिए । रेगेक्स इस श्रेणी में फिट नहीं होता है।

यदि आप एक भाषा चाहते हैं जो रेगेक्स जैसी दिखती है, तो जे को आज़माएं।


1
+1, मैंने देखा लेकिन नियमित अभिव्यक्तियों की ट्यूरिंग पूर्णता की एक अच्छी चर्चा / अव्यवस्था नहीं पा सका।
FrustratedWithFormsDesigner

1
@ davidk01 - सेलुलर ऑटोमेटा पूर्ण रूप से ट्यूरिंग किया जा सकता है (हालांकि अच्छे संकलक खोजने में कठिन हैं), नियमित अभिव्यक्ति नहीं हैं। आप गैर-तुच्छ अभिकलन कर सकते हैं, हां, लेकिन काफी तुच्छ चीजें हैं जो आप भी नहीं कर सकते हैं। ट्यूरिंग पूर्ण सेलुलर ऑटोमेटा को एक प्रोग्रामिंग भाषा माना जा सकता है, क्योंकि सिद्धांत रूप में आप उनके साथ कोई भी प्रोग्राम लिख सकते हैं जो आप किसी अन्य भाषा के साथ कर सकते हैं।
पीएसआर

1
यह भी ध्यान रखना महत्वपूर्ण है कि रीगेक्स जो कि प्राणवायु परीक्षण ( montreal.pm.org/tech/neil_kandalgaonkar.shtml#primality_regex ) करता है, पर्ल रेगेक्स की विशेषताओं का उपयोग करता है जो शैक्षणिक अर्थों में "रेगुलर एक्सप्रेशंस" से अधिक शक्तिशाली हैं - अर्थात्, संग्रहीत समूह। । नियमित भाषाओं को मनमानी स्मृति की आवश्यकता नहीं हो सकती है।
एरिक डब्ल्यू।

5
@WorldEngineer: दिलचस्प और उपयोगी प्रोग्रामिंग भाषाएं हैं जो ट्यूरिंग पूर्ण नहीं हैं। Datalog, SQL और ACL2 कुछ उदाहरण हैं जो दिमाग में आते हैं, साथ ही प्रकार-सिद्धांत-आधारित प्रमेय सिद्ध करने वाली चीजों में इस्तेमाल किए जाने वाले किसी भी संख्या में दृढ़ता से सामान्य होने वाले लैम्ब्डा कैल्कुली हैं।
रयान क्यूलपेपर 22'12

1
सभी प्रोग्रामिंग भाषाएं पूरी तरह से ट्यूरिंग नहीं कर रही हैं। उदाहरण के लिए, एक्सएमएल जैसी विशुद्ध रूप से संदर्भ-मुक्त घोषित भाषाएं जो एक दुभाषिया के साथ जोड़े बिना पूरी नहीं होती हैं, प्रोग्रामिंग भाषा मानी जा सकती हैं। यह सब 'प्रोग्रामिंग भाषा' की आपकी परिभाषा पर निर्भर करता है। आपको एक 'नियमित' भाषा को 'संदर्भ-मुक्त' भाषा में बदलने की ज़रूरत है, एक पुश-डाउन स्टैक है। फिर यह सभी तरह से नीचे कछुए है।
इवान प्लाइस

14

यदि " एक्स और वाई की अलग-अलग परिभाषाओं का उपयोग किया जाता है, तो" एक्सवाई " प्रकार के प्रश्नों का उत्तर देना मुश्किल है । यह हो सकता है कि कुछ परिभाषाओं के लिए, उत्तर "हां" है, और कुछ परिभाषाओं के लिए उत्तर "नहीं" है। खासकर यदि उत्तर तकनीकी विवरण पर निर्भर करता है जहां विभिन्न परिभाषाएं भिन्न होती हैं। इसके अलावा इस चर्चा में कुछ गलत जानकारी है, इसलिए कृपया लंबे उत्तर के साथ धैर्य रखें।

" प्रोग्रामिंग भाषा " से हमारा क्या तात्पर्य है ?

एक सरल जवाब "प्रोग्राम बनाने के लिए इस्तेमाल की जाने वाली भाषा" हो सकता है। ज़रूर, लेकिन: किस तरह के कार्यक्रम? उस भाषा के बारे में क्या जो कुछ प्रकार के कार्यक्रमों को बनाने के लिए इस्तेमाल की जा सकती है , लेकिन अन्य प्रकार के कार्यक्रमों के लिए नहीं? चरम मामलों की व्याख्या करने के लिए यहां दो विशिष्ट उदाहरण दिए गए हैं:

1) एम नामक एक काल्पनिक भाषा इस तरह से काम करती है: यदि कार्यक्रम में एकल अक्षर "एम" शामिल है, तो यह माइन्सवेपर का खेल बनाता है। बाकी सब कुछ एक सिंटैक्स त्रुटि है।

सहज रूप से, यह "प्रोग्रामिंग भाषा" कहने से हमारा तात्पर्य नहीं है । लेकिन एम का विपणन विभाग यह तर्क दे सकता है कि यह तकनीकी रूप से परिभाषा को पूरा करता है, क्योंकि इसका उपयोग प्रोग्राम बनाने के लिए किया जा सकता है। यकीन है, संकलक आपके लिए कुछ महत्वपूर्ण भागों को करता है, लेकिन यह है कि संकलक क्या करते हैं, नहीं? C भाषा का एक कंपाइलर भी कुछ सरल शब्दों को दर्जनों प्रोसेसर निर्देशों में तब्दील करता है। एम कंपाइलर अभी और आगे बढ़ता है और आपके काम को और भी सरल बना देता है।

2) यदि आप प्रसिद्ध टर्बो पास्कल के मूल संस्करण को स्थापित करते हैं, तो आप कई प्रकार के कार्यक्रम लिख सकते हैं। लेकिन आप वेब ब्राउज़र में चलने वाला गेम नहीं लिख सकते, क्योंकि आवश्यक एपीआई बस वहां नहीं है।

तो क्या वास्तव में वह चीज़ है जो टर्बो पास्कल को एक प्रोग्रामिंग भाषा बनाती है, लेकिन एम के पास नहीं है? सीधे शब्दों में, आप पास्कल में एम की तुलना में अधिक कर सकते हैं । लेकिन कल्पना करें कि हमारे पास एक एमनेट है, जो एक वेब ब्राउज़र में चलने वाला माइन्सवीपर गेम बनाता है। तो अब हमारे पास कुछ ऐसा है जो पास्कल कर सकता है और एमनेट नहीं कर सकता है, लेकिन हमारे पास कुछ ऐसा भी है जो एमनेट कर सकता है और पास्कल नहीं कर सकता है। हमें पास्कल के फायदे, और एमनेट अप्रासंगिक के लाभों पर विचार क्यों करना चाहिए?

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

वास्तव में एक एल्गोरिथ्म क्या है, और इससे भी महत्वपूर्ण बात यह है कि "कोई भी एल्गोरिथ्म" क्या है? कंप्यूटर विज्ञान में हम ट्यूरिंग-पूर्ण शब्द का उपयोग करते हैं । विचार यह है कि कंप्यूटर भाषाओं का एक सेट है, जहां उनमें से प्रत्येक उन सभी को अनुकरण करने में सक्षम है । उन भाषाओं में से एक ट्यूरिंग मशीन है, यही वजह है कि उन्हें ऐसा कहा जाता है। पास्कल है, सी है, जावा है, पाइथन है, लिस्प है, स्मालटाक है, एक्सएसएलटी भी है। हमारे काल्पनिक एम और एमनेट नहीं हैं। आप किसी भी विश्वविद्यालय में एक सभ्य कंप्यूटर विज्ञान पाठ्यक्रम प्रदान करने के बारे में अधिक जान सकते हैं, लेकिन विचार यह है कि ट्यूरिंग-पूर्ण भाषा कुछ भी नहीं कर सकती हैयदि आप उन्हें न्यूनतम आवश्यक एपीआई देते हैं, तो एक और ट्यूरिंग-पूर्ण भाषा कर सकती है। (यदि आप पास्कल को कुछ वेब-ब्राउज़र एपीआई देते हैं, तो आप वेब ब्राउज़र में सभी प्रकार के गेम बना सकते हैं। यदि आप एम को वेब-ब्राउज़र एपीआई देते हैं, तो आप अभी भी केवल माइनस्वीपर बनाने में सक्षम हैं।) हम रूपक से कह सकते हैं। आप एक प्रोग्रामिंग भाषा से सभी एपीआई को हटाते हैं, जो महत्वपूर्ण सामान है।

" नियमित अभिव्यक्ति " से हमारा क्या तात्पर्य है ?

विभिन्न प्रोग्रामिंग भाषाएं उन्हें थोड़ा अलग तरीके से लागू करती हैं। लेकिन मूल विचार यह था कि नियमित अभिव्यक्ति तथाकथित नियमित भाषाओं को व्यक्त करती है । ध्यान दें कि हम यहां प्रोग्रामिंग भाषाओं के बारे में नहीं बोलते हैं, लेकिन मानव भाषाओं के बारे में (छद्म-)। कल्पना कीजिए कि आपको कुछ विदेशी जनजाति बोलने वाली भाषा लगती है जिसमें केवल "बा", "बाबा", "बाबा" और इतने ही शब्द हैं। आप इस भाषा का मौखिक रूप से वर्णन कर सकते हैं "एक शब्दांश 'बा' एक या अधिक बार दोहराया" या "(बा) +" के रूप में एक नियमित अभिव्यक्ति का उपयोग कर।

नियमित अभिव्यक्तियों को व्यक्त करना चाहिए: "कुछ भी नहीं", "यह पत्र", "यह, उसके बाद", "यह या वह", "यह, एक या अधिक बार दोहराया", और "यह नहीं"। - वह गणितीय परिभाषा है। और कुछ भी पिछले घटकों से निर्मित एक सुविधाजनक शॉर्टकट है। उदाहरण के लिए "इसे दोहराया, दो या तीन बार" का अनुवाद "इस" के रूप में किया जा सकता है, इसके बाद, इसके बाद (यह या कुछ भी नहीं) ", लेकिन" बा {2,3} "लिखने के लिए" बाबा की तुलना में अधिक सुविधाजनक हो सकता है। (बी 0 ए)?"।

वास्तविक जीवन में, "नियमित अभिव्यक्तियों" का एक विशिष्ट कार्यान्वयन इससे अधिक लागू होता है। उदाहरण के लिए, गणितीय परिभाषा है, और "ए.बी.ए.", "aabaa", "aaabaaa" की एक भाषा इतने पर का उपयोग कर - "एक" एस के किसी भी संख्या, एक "बी" के बाद, जिसके बाद ही "एक की संख्या "s - एक नियमित भाषा नहीं है। हालांकि, आज उपयोग किए जाने वाले कई "नियमित अभिव्यक्तियाँ", "इससे पहले कि हम एक ही चीज़" का अतिरिक्त अवधारणा का उपयोग करते हुए, इसे "(a +) b \ 1" के रूप में लिखा गया है, का पता लगा सकते हैं। इस अतिरिक्त अवधारणा का उपयोग करते हुए, हम कुछ शांत चीजें कर सकते हैं, उदाहरण के लिए अक्षरों की प्रमुख संख्या से मिलकर शब्दों का पता लगा सकते हैं । फिर भी, हम कोई एल्गोरिथ्म नहीं कर सकते ... स्पष्टीकरण के लिए क्यों,

इसलिए, मूल विषय पर वापस: नियमित अभिव्यक्तियाँ हैं (या तो इस प्रकार परिभाषित की गई हैं: चॉम्स्की पदानुक्रम में नियमित भाषाओं का वर्णन करने वाले भाव? या जैसे: पूर्व, प्लस 1 ऑपरेशन) एक प्रोग्रामिंग भाषा (परिभाषित: ट्यूरिंग-पूर्ण)? जवाब है नहीं । नहीं, आप नियमित भावों का उपयोग करके किसी भी एल्गोरिथ्म को लागू नहीं कर सकते हैं , और किसी भी एल्गोरिथ्म को लागू करने की क्षमता वह है जो कंप्यूटर विज्ञान का अध्ययन करने वाले लोग आमतौर पर प्रोग्रामिंग भाषा के सार के रूप में समझते हैं।

बेशक, कोई भी एक अलग परिभाषा पर जोर देकर जवाब बदल सकता है । जैसा कि मैंने शुरुआत में लिखा था, तकनीकी विवरण यहाँ महत्वपूर्ण हैं। यदि आप उन्हें गलत पाते हैं, तो आपको गलत जवाब मिलता है।

और यदि आप तकनीकी विवरणों में रुचि नहीं रखते हैं , तो उत्तर हो सकता है: क्या आप कार्यक्रम बनाने के लिए नियमित अभिव्यक्ति (और कुछ नहीं) का उपयोग कर सकते हैं? नहीं, तो इसे प्रोग्रामिंग भाषा क्यों कहें? (हालांकि, इस तरह का उत्तर डाउनलोड किया गया और यहां हटा दिया गया, यही वजह है कि मैंने यह लंबा संस्करण लिखा।)

संपादित करें: इसके अलावा, कोई भी कुछ नए सुविधाओं के साथ "नियमित अभिव्यक्ति" के अपने नए संस्करण को लागू करने वाला एक पुस्तकालय बना सकता है। कुछ समय में, नई सुविधाएँ पूरे सिस्टम के लिए ट्यूरिंग-पूर्ण बनने के लिए पर्याप्त हो सकती हैं। एक तुच्छ उदाहरण कुछ नए वाक्यविन्यास का उपयोग करके ट्यूरिंग-पूर्ण भाषा को एम्बेड करना होगा; लेकिन यह कम स्पष्ट रूप से भी हो सकता है। शायद यह पहले से ही हुआ है।


0

.Net में, न केवल Regex वैकल्पिक और लुकराईड के विभिन्न संयोजनों का उपयोग करते हुए, कई प्रकार के सशर्त रूप को संभाल सकता है, बल्कि अपने स्वयं के स्टैक में हेरफेर भी कर सकता है।

(?xm)
    (?>
        <(?<Tagname>table)[^>]*>
    )
(?(Tagname)
    (
        </(?(?!\k'Tagname')(?<-Tagname>))*\k'Tagname'>(?<-Tagname>)
    |
        (?>
            <(?<Tagname>[a-z][^\s>]*)[^>]*>
        )
    |
        [^<]+
    )+?
    (?(Tagname)(?!))
)

यह, उदाहरण के लिए, एक छोटा सा स्निपेट है जिसे मैंने HTML तालिका को पुनः प्राप्त करने के लिए लिखा था। अन्य रेगेक्स इंजनों के विपरीत, यह कैप्चर कलेक्शन (पुश, पिक्चर और पॉप) के ढेर को नियंत्रित करता है, और नेस्टेड ऑब्जेक्ट्स को संभाल सकता है। मेरे पास एक अधिक जटिल है, लेकिन यह सॉर्टा मालिकाना है।

मुझे लगता है कि इस उदाहरण में, रेगेक्स को एक प्रोग्रामिंग भाषा की सभी बुनियादी आवश्यकताओं के रूप में देखा जा सकता है। इसमें चर, इनलाइन मेमोरी, सशर्त, इनपुट और आउटपुट हैं, यह इस मामले में कई रेगेक्स कंपाइल इंजनों में से एक का उपयोग करके संकलित करता है)।

रेगेक्स के साथ HTML (अधिक) पार्स करने के लिए उपयोग किए जाने वाले स्क्वाकिंग के जवाब में, मैं आगे गया और एक पूर्व-टाइप की गई प्रतिक्रिया पोस्ट की जिसे मैं पोस्ट कर सकता हूं: पार्सिंग HTML

निम्नलिखित उदाहरण (सिर्फ एक प्रदर्शन) निम्नलिखित है:

Function Regex("<(td>)((?:[^<]*(?(?!</\1)<))*)</\1")
    Group(0) = "<"
    Group(1) = "td>"
    Group(0) += Group(1)
    Group(2) = LoopMethod()
    Group(0) += Group(2)
    Group(0) += "</" & Group(1)
    Return Group()
End Function

Function LoopMethod()
    retGroup = ""
    Do
        tmpGroup = Everything that is NOT an Opening HTML Delimeter
        If the Text following tmpGroup Does NOT Equal "</" & Group(1) Then
            tmpGroup += "<"
            retGroup += tmpGroup
        Else
            Exit Do
        End If
    Loop
    Return retGroup
End Function

HTML तोते के लिए फिर से: HTML पार्सिंग

यह एक सरल रीगेक्स लूपिंग एंड कंडिशनिंग (एल्गोरिदम?) दिखाता है। केवल एक चीज गायब है वास्तविक गणितीय गणना। यह एक अधिक विस्तृत नियमित अभिव्यक्ति है जो सिर्फ विशिष्ट "(। *?)" विधि की तुलना में अधिक कुशलता से एक टीडी सेल को खींचती है।

लेकिन यहां तक ​​कि एक रेगेक्स उत्साही और स्व-घोषित मास्टर के रूप में, मैं किसी को भी बताने के लिए नहीं जाऊंगा कि रेगेक्स एक प्रोग्रामिंग भाषा है। खुद के खिलाफ मेरा अपना तर्क है कि यह अकेले नहीं खड़ा हो सकता है, इसे किसी अन्य प्रोग्रामिंग भाषा इंजन द्वारा समर्थित होने के दौरान अपने स्वयं के इंजन के माध्यम से चलाना होगा।


यदि आप इसे "टेस्ट" करते हैं और यह काम नहीं करता है, तो आपको पता होना चाहिए कि अधिकांश रेगेक्स इंजन "परीक्षक" हैंडल नहीं करते हैं। नेट रेगेक्स (बैलेंसिंग ग्रुप्स)। आपको वास्तव में एक .Net प्रोग्राम में इसका उपयोग करना होगा।
सुमेरे

3
हे भगवान, यह प्राइमा फेशिया सबूत है कि क्यों आपको html को पार्स करने के लिए रेगेक्स का उपयोग कभी नहीं करना चाहिएकभी।
ताकारॉय

@Tacroy किसी को तोता के साथ HTML पार्स करने के बारे में तोते की सलाह को देखकर अच्छा लगा। जबकि बेहोश दिल के लिए नहीं, संदर्भ के समान पार्सर बनाने के लिए स्टैक के साथ ऊपर की तरह रेगेक्स का संयोजन एक बुनियादी (और कुशल) नुस्खा है।
इवान प्लाइस

1
तोता स्क्वाकिंग के जवाब में। मैंने इसे बनाया है: पार्सिंग HTML
सुमेरे

यदि यह संदर्भ संवेदनशील भाषाओं को स्वीकार करता है तो यह एक नियमित अभिव्यक्ति नहीं है। यह कुछ अन्य डीएसएल है जो रेगेक्स का सुपरसेट है। वेंडर का नाम नहीं बदलता है कि
कैलथ

0

हालाँकि, नियमित अभिव्यक्ति में कोई एक / ट्यूरिंग पूर्ण प्रोग्रामिंग लैंग्वेज नहीं है, जैसा कि पिछले उत्तरों द्वारा समझाया गया है, यदि आप नियमित एक्सप्रेशंस के साथ रिप्लेसमेंट की बार-बार की जाने वाली क्रियाओं का उपयोग करने की अनुमति देते हैं, तो हाँ, आप रेगुलर एक्सप्रेशन का उपयोग करके किसी भी ट्यूरिंग मशीन को इनकोड कर सकते हैं:

नियमित अभिव्यक्ति के साथ बार-बार ढूंढना / बदलना एक ट्यूरिंग-पूर्ण प्रोग्रामिंग लैंग्वेज है

परिणामस्वरूप, आप एक ही खोज का उपयोग करके किसी भी कम्प्यूटेशनल फ़ंक्शन की गणना कर सकते हैं और जावास्क्रिप्ट नियमित अभिव्यक्ति को बार-बार बदल सकते हैं।

ट्यूरिंग-पूर्णता साबित करने के लिए, ट्यूरिंग मशीन को नियमित अभिव्यक्ति खोज / प्रतिस्थापित करने के लिए एनकोड करना पर्याप्त है। मान लें कि संपादक की स्थिति है:

0000#12345:01-5:0#0000000

जिस पर एक पाठक के साथ प्रतीकों के टेप के रूप में पढ़ा जा सकता है:

[left symbols]#[set of states]:[set of symbols]-[current state]:[current symbol]#[right symbols]

नियम 5 में राज्य 5 में पढ़ने, 1 लिखने और उसके राज्य को 3 में बदलने और बाईं ओर बढ़ने के लिए, हम इसे निम्नलिखित संकेतन का उपयोग करते हुए सार करते हैं:

5:0 => 1, 3:[left]

हम पिछले अंकन को खोज नियमित अभिव्यक्ति में कूटबद्ध करते हैं:

(\d)#(1)(2)(3)(4)(5):(0)(1)-5:0#

और इसकी प्रतिस्थापन अभिव्यक्ति (जावास्क्रिप्ट जैसी)

#12345:01-$4:$1#$8

ठीक है, अब कई नियमों को कैसे एनकोड करना है? हम नियमित अभिव्यक्ति खोज के लिए orऑपरेटर के साथ संयोजन का उपयोग |करते हैं, और हम प्रतिस्थापन में परिणामों को जोड़ते हैं, ऑफसेट के साथ समूह संख्याओं को आंकते हैं। उदाहरण के लिए, आइए हम चार नियमों के सेट पर विचार करें।

5:0 => 1, 3:left
3:0 => 1, 5:right
5:1 => 1, 5:right
3:1 => 1: 3:stop

हम उन्हें एक खोज में बदल देते हैं और अभिव्यक्ति की जगह लेते हैं:

Search:
(\d)#(1)(2)(3)(4)(5):(0)(1)-5:0#|#(1)(2)(3)(4)(5):(0)(1)-3:0#(\d)|#(1)(2)(3)(4)(5):(0)(1)-5:1#(\d)|#(1)(2)(3)(4)(5):(0)(1)-3:1#

Replace by:
$15$23#12345:01-$4$13$21$27:$1$16$24$31#$8

अपने पसंदीदा जावास्क्रिप्ट इंजन में इसे आज़माएँ:

function turingstep(s) {
  return s.replace(/(\d)#(1)(2)(3)(4)(5):(0)(1)-5:0#|#(1)(2)(3)(4)(5):(0)(1)-3:0#(\d)|#(1)(2)(3)(4)(5):(0)(1)-5:1#(\d)|#(1)(2)(3)(4)(5):(0)(1)-3:1#/g,"$15$23#12345:01-$4$13$21$27:$1$16$24$31#$8");
}

var tape = "0000#12345:01-5:0#0000000"
for(var i = 0; i < 6; i++) {
  console.log(tape)
  tape = turingstep(tape)
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.