एक और समाधान
यह मेरी राय में, साइट पर सबसे दिलचस्प समस्याओं में से एक है। मुझे इसे शीर्ष पर वापस लाने के लिए डेडकोड को धन्यवाद देना होगा ।
^((^|xx)(^|\3\4\4)(^|\4x{12})(^x|\1))*$
39 बाइट्स , बिना किसी शर्त या दावे के ... जैसे। विकल्प, जैसा कि उनका उपयोग किया जा रहा है ( ^|
), एक प्रकार का सशर्त है, "प्रथम पुनरावृत्ति," और "पहले पुनरावृत्ति नहीं" के बीच चयन करने के लिए।
इस रेगेक्स को यहां काम करने के लिए देखा जा सकता है: http://regex101.com/r/qA5pK3/1
पीसीआरई और पायथन दोनों ही रेगेक्स की सही व्याख्या करते हैं, और यह पर्ल में n = 128 तक परीक्षण किया गया है , जिसमें n 4 -1 और n 4 +1 शामिल हैं ।
परिभाषाएं
सामान्य तकनीक पहले से पोस्ट किए गए अन्य समाधानों की तरह ही है: एक स्व-संदर्भित अभिव्यक्ति को परिभाषित करें जो प्रत्येक बाद के पुनरावृत्ति पर एक असीमित क्वांटिफायर ( ) के साथ आगे के अंतर फ़ंक्शन, डी एफ के अगले कार्यकाल के बराबर लंबाई से मेल खाती है *
। आगे के अंतर समारोह की एक औपचारिक परिभाषा:
इसके अतिरिक्त, उच्चतर ऑर्डर अंतर कार्यों को भी परिभाषित किया जा सकता है:
या, आम तौर पर:
आगे के अंतर फ़ंक्शन में बहुत सारे दिलचस्प गुण हैं; यह अनुक्रम है कि व्युत्पन्न निरंतर कार्यों के लिए क्या है। उदाहरण के लिए, एक n वें क्रम के बहुपद का डी f हमेशा एक n-1 वें क्रम का बहुपद होगा, और किसी भी i के लिए , यदि D f i = D f i + 1 है , तो फ़ंक्शन f घातीय है, उसी तरह से कि e x की व्युत्पत्ति स्वयं के बराबर है। जिसके लिए सबसे सरल असतत समारोह च = डी च है 2 एन ।
f (n) = एन 2
इससे पहले कि हम उपरोक्त समाधान की जांच करें, चलो कुछ आसान से शुरू करें: एक रेक्सक्स जो स्ट्रिंग से मेल खाता है जिसकी लंबाई एक पूर्ण वर्ग है। आगे अंतर समारोह की जांच:
मतलब, पहला पुनरावृत्ति लंबाई 1 , दूसरी लंबाई 3 की एक स्ट्रिंग , तीसरी लंबाई 5 की एक स्ट्रिंग , आदि से मेल खाना चाहिए, और सामान्य रूप से, प्रत्येक पुनरावृत्ति एक स्ट्रिंग से दो लंबे समय तक मेल खाना चाहिए। संबंधित विवरण इस कथन से लगभग प्रत्यक्ष है:
^(^x|\1xx)*$
यह देखा जा सकता है कि पहला पुनरावृत्ति केवल एक से मेल खाएगा x
, और प्रत्येक बाद का पुनरावृत्ति एक स्ट्रिंग से दो बार पिछले की तुलना में अधिक समय तक मेल खाएगा, बिल्कुल निर्दिष्ट के रूप में। यह भी पर्ल में एक आश्चर्यजनक रूप से कम सही वर्ग परीक्षण का अर्थ है:
(1x$_)=~/^(^1|11\1)*$/
इस रेगेक्स को किसी भी n- gonal लंबाई से मेल खाने के लिए सामान्यीकृत किया जा सकता है :
त्रिकोणीय संख्या:
^(^x|\1x{1})*$
वर्ग संख्या:
^(^x|\1x{2})*$
पेंटागनल नंबर:
^(^x|\1x{3})*$
षट्कोणीय संख्या:
^(^x|\1x{4})*$
आदि।
f (n) = एन 3
N 3 पर जा रहा है , एक बार फिर से फ़ॉरवर्ड डिफरेंस फ़ंक्शन की जाँच कर रहा है:
यह तुरंत स्पष्ट नहीं हो सकता है कि इसे कैसे लागू किया जाए, इसलिए हम दूसरे अंतर फ़ंक्शन की भी जांच करते हैं:
तो, फ़ॉरवर्ड फ़र्क फ़ंक्शन एक स्थिरांक से नहीं बढ़ता है, बल्कि एक रैखिक मूल्य होता है। यह अच्छा है कि D f 2 का प्रारंभिक (' -1 th') मूल्य शून्य है, जो दूसरे पुनरावृत्ति पर एक आरंभीकरण को बचाता है। परिणामी रेगेक्स निम्नलिखित है:
^((^|\2x{6})(^x|\1))*$
पहला पुनरावृति 1 से मेल खाएगा , पहले की तरह, दूसरा एक स्ट्रिंग 6 लंबे ( 7 ) से मेल खाएगा, तीसरा 12 स्ट्रिंग ( 19 ), आदि से मेल खाएगा ।
f (n) = n 4
एन 4 के लिए आगे का अंतर कार्य :
दूसरा फॉरवर्ड डिफरेंस फंक्शन:
तीसरा फ़र्क फ़र्क:
अब वह बदसूरत है। डी एफ 2 और डी एफ 3 के लिए प्रारंभिक मूल्य क्रमशः गैर-शून्य, 2 और 12 दोनों हैं, जिनके लिए जिम्मेदार होना चाहिए। आप शायद अब तक समझ गए हैं कि रेगेक्स इस पैटर्न का पालन करेगा:
^((^|\2\3{b})(^|\3x{a})(^x|\1))*$
क्योंकि डी एफ 3 की लंबाई से मेल खाना चाहिए 12 सेकंड यात्रा पर, एक जरूरी है 12 । लेकिन क्योंकि यह प्रत्येक अवधि में 24 से बढ़ जाता है , अगले गहरे घोंसले को दो बार लागू करना चाहिए, जिसका अर्थ है b = 2 । अंतिम बात यह है कि डी एफ 2 को इनिशियलाइज़ करें । क्योंकि D f 2 सीधे D f को प्रभावित करता है, जो कि आखिरकार जिसे हम मैच करना चाहते हैं, उसके मूल्य को इस मामले में सीधे regex में उचित परमाणु को सम्मिलित करके आरंभ किया जा सकता है (^|xx)
। अंतिम रेगेक्स तब बन जाता है:
^((^|xx)(^|\3\4{2})(^|\4x{12})(^x|\1))*$
उच्चतर आदेश
एक पांचवें क्रम के बहुपद को निम्नलिखित regex के साथ मिलान किया जा सकता है:
^((^|\2\3{c})(^|\3\4{b})(^|\4x{a})(^x|\1))*$
f (n) = n 5 एक काफी आसान एक्सर्साइज़ है, क्योंकि दूसरे और चौथे फॉरवर्ड डिफरेंस फंक्शन के लिए शुरुआती मान शून्य हैं:
^((^|\2\3)(^|\3\4{4})(^|\4x{30})(^x|\1))*$
छह आदेश बहुपद के लिए:
^((^|\2\3{d})(^|\3\4{c})(^|\4\5{b})(^|\5x{a})(^x|\1))*$
सातवें क्रम के बहुपदों के लिए:
^((^|\2\3{e})(^|\3\4{d})(^|\4\5{c})(^|\5\6{b})(^|\6x{a})(^x|\1))*$
आदि।
ध्यान दें कि सभी बहुपद का मिलान इस तरह से नहीं किया जा सकता है, यदि कोई आवश्यक गुणांक गैर-पूर्णांक हो। उदाहरण के लिए, n 6 के लिए आवश्यक है कि a = 60 , b = 8 , और c = 3/2 । यह इस उदाहरण में काम किया जा सकता है:
^((^|xx)(^|\3\6\7{2})(^|\4\5)(^|\5\6{2})(^|\6\7{6})(^|\7x{60})(^x|\1))*$
यहाँ मैंने b को 6 में बदल दिया है , और c से 2 को , जिसमें उक्त मानों के समान उत्पाद है। यह महत्वपूर्ण है कि उत्पाद के रूप में, परिवर्तन नहीं करता है एक · ख · ग · ... नियंत्रण निरंतर अंतर समारोह है, जो छठे क्रम बहुपद के लिए है डी एफ 6 । एक प्रारंभ करने में: वहाँ उपस्थित दो प्रारंभ परमाणुओं हैं डी एफ के लिए 2 , के साथ के रूप में एन 4 , और पांचवें अंतर समारोह प्रारंभ करने में अन्य 360 जबकि एक ही समय से लापता दो में जोड़ने, ख ।