रेगेक्स (पीसीआरई फ्लेवर), 66 (65 by) बाइट्स
यह देखते हुए कि मार्टिन एंडर और जेएटिया , दो रेगेक्स जीनियस, ने इस कोड गोल्फ के रेगेक्स समाधान लिखे, मैंने खरोंच से अपना लिखा। प्रसिद्ध प्राइम-चेकिंग रेगेक्स मेरे समाधान में कहीं भी प्रकट नहीं होता है।
यदि आप नहीं चाहते हैं कि यह आपके लिए कुछ ख़राब रेगेक्स मैजिक खराब हो तो इसे न पढ़ें। यदि आप स्वयं इस जादू का पता लगाने के लिए शॉट लेना चाहते हैं, तो मैं अत्यधिक ECMAScript अंकुश में कुछ समस्याओं को हल करके शुरू करने की सलाह देता हूं:
- प्राइम नंबर से मिलान करें (यदि आप regex में ऐसा करने से पहले से परिचित नहीं हैं)
- 2 की मैच शक्तियों (यदि आपने पहले से ऐसा नहीं किया है)। या सिर्फ रेगेक्स गोल्फ के माध्यम से अपना काम करें , जिसमें प्राइम और पॉवर्स शामिल हैं। दोनों क्लासिक और Teukon समस्या सेट करना सुनिश्चित करें।
N की शक्तियों से मेल खाने के लिए सबसे छोटा तरीका खोजें जहाँ N कुछ स्थिर है (यानी रेगेक्स में निर्दिष्ट है, इनपुट नहीं) जो कि समग्र हो सकता है (लेकिन होना आवश्यक नहीं है)। उदाहरण के लिए, 6 की मैच शक्तियों।
Nth शक्तियों के मिलान का एक तरीका खोजें, जहाँ N कुछ स्थिर है = = 2। उदाहरण के लिए, सही वर्गों का मिलान करें। (वार्मअप के लिए, प्रमुख शक्तियों का मिलान करें ।)
सही गुणन कथनों का मिलान करें। त्रिकोणीय संख्याओं का मिलान करें।
मैच फाइबोनैचि संख्या (यदि आप मेरे जैसे पागल हैं), या यदि आप किसी छोटी चीज़ से चिपके रहना चाहते हैं, तो घातांक के सही बयानों का मिलान करें (वार्मअप के लिए, 2 की शक्ति के आधार 2 में लघुगणक मैच के रूप में लौटें - बोनस, किसी भी संख्या के लिए भी ऐसा ही करें, फिर भी उसे पसंद करें), या फैक्टरियल नंबर (वार्मअप के लिए, प्राइमरी नंबर से मिलान करें )।
प्रचुर संख्या में मिलान करें (यदि आप मेरे जैसे पागल हैं)
अनुरोधित परिशुद्धता के लिए एक अपरिमेय संख्या की गणना करें (उदाहरण 2 के वर्गमूल द्वारा इनपुट को विभाजित करें, एक मैच के रूप में गोल परिणाम लौटाएं)
( मेरे द्वारा लिखा गया रेगेक्स इंजन मदद का हो सकता है, क्योंकि यह एकरी मैथ रेगीक्स में बहुत तेज है और इसमें एक यूरी संख्यात्मक मोड शामिल है, जो प्राकृतिक संख्या की रेंज का परीक्षण कर सकता है (लेकिन इसमें एक स्ट्रिंग्स मोड भी है जो गैर-अनपेक्षित रेगेक्स, या यूरी का मूल्यांकन कर सकता है। सीमांकक के साथ)। डिफ़ॉल्ट रूप से यह ईसीएमएस्क्रिप्ट संगत है, लेकिन इसमें वैकल्पिक एक्सटेंशन हैं (जो चुनिंदा पीसीआरटी के सबसेट, या यहां तक कि आणविक लुकहेड को जोड़ सकते हैं, कुछ ऐसा जो किसी अन्य रेगीक्स इंजन के पास नहीं है)।
अन्यथा, पर पढ़ें, और इस GitHub Gist (चेतावनी, कई स्पॉइलर) को भी पढ़ें , जो बढ़ती संख्या के प्राकृतिक कार्यों से निपटने के लिए ECMAScript regex को आगे बढ़ाने की यात्रा को आगे बढ़ाती है, जो कि टेकोन के पहेलियों के सेट से शुरू होती है, उनमें से सभी गणितीय नहीं हैं, जिसने इसे चमकाया। यात्रा)।
इस समस्या के अन्य रेगेक्स समाधानों के साथ, इनपुट को दो संख्याओं के रूप में दिया गया है, जिसमें एक विशेष सीमा का प्रतिनिधित्व करते हुए, अल्पविराम द्वारा अलग किया गया है। केवल एक नंबर लौटा है। रेगेक्स को उन सभी नंबरों को वापस करने के लिए संशोधित किया जा सकता है जो अलग-अलग मैचों के रूप में एक ही सबसे छोटे सबसे बड़े प्रमुख कारक को साझा करते हैं, लेकिन इसके लिए चर-लंबाई लुकअप की आवश्यकता होगी और या तो \K
एक लुकहेड में डाल दिया जाएगा या एक मैच के बजाय कैप्चर के रूप में परिणाम लौटाएगा ।
छोटी प्राइम फैक्टर द्वारा बार-बार निहित विभाजन का उपयोग यहां की तकनीक मैच स्ट्रिंग्स में उपयोग किए जाने के समान है, जिसकी लंबाई एक चौथी शक्ति का उत्तर है जिसे मैंने कुछ समय पहले पोस्ट किया था।
कोई आगे की हलचल के साथ:
((.+).*),(?!.*(?=\1)(((?=(..+)(\5+$))\6)*)(?!\2)).*(?=\1)\K(?3)\2$
आप इसे यहाँ आज़मा सकते हैं।
और मुक्त रिक्ति संस्करण, टिप्पणियों के साथ:
# No ^ anchor needed, because this algorithm always returns a
# match for valid input (in which the first number is less than
# or equal to the second number), and even in /g mode only one
# match can be returned. You can add an anchor to make it reject
# invalid ranges.
((.+).*), # \1 = low end of range; \2 = conjectured number that is the
# smallest number in the set of the largest prime factor of each
# number in the range; note, it is only in subsequent tests that
# this is implicitly confined to being prime.
# We shall do the rest of our work inside the "high end of range"
# number.
(?! # Assert that there is no number in the range whose largest prime
# factor is smaller than \2.
.*(?=\1) # Cycle tail through all numbers in the range, starting with \1.
( # Subroutine (?3):
# Find the largest prime factor of tail, and leave it in tail.
# It will both be evaluated here as-is, and later as an atomic
# subroutine call. As used here, it is not wrapped in an atomic
# group. Thus after the return from group 3, backtracking back
# into it can increase the value of tail – but this won't mess
# with the final result, because only making tail smaller could
# change a non-match into a match.
( # Repeatedly divide tail by its smallest prime factor, leaving
# only the largest prime factor at the end.
(?=(..+)(\5+$)) # \6 = tool to make tail = \5 = largest nontrivial factor of
# current tail, which is implicitly the result of dividing it
# by its smallest prime factor.
\6 # tail = \5
)*
)
(?!\2) # matches iff tail < \ 2
)
# now, pick a number in the range whose largest prime factor is \2
.*(?=\1) # Cycle tail through all numbers in the range, starting with \1.
\K # Set us up to return tail as the match.
(?3) # tail = largest prime factor of tail
\2$ # Match iff tail == \2, then return the number whose largest
# prime factor is \2 as the match.
एल्गोरिथ्म को आसानी से सबमाउटीन की एक प्रति के साथ सबरूटीन कॉल की जगह, और मैच को कैप्चर ग्रुप के रूप में \ K का उपयोग करके ECMAScript में पोर्ट किया जा सकता है। परिणाम लंबाई में 80 बाइट्स है:
((x+)x*),(?!.*(?=\1)((?=(xx+)(\4+$))\5)*(?!\2)).*(?=\1)(((?=(xx+)(\8+$))\9)*\2$)
इसे ऑनलाइन आज़माएं!
ध्यान दें कि सही कार्यक्षमता की हानि के साथ 1 बाइट (66 से 65 बाइट्स ) द्वारा आकार ((.+).*)
को बदलना ((.+)+)
, लेकिन रेक्सएक्स घातीयता में विस्फोट हो जाता है।
इसे ऑनलाइन आज़माएं! (79 बाइट ECMAScript घातीय-मंदी संस्करण)