मुझे लगा कि मैं इस अवसर का उपयोग एक नई रेटिना सुविधा को दिखाने के लिए करूंगा: मल्टी-स्टेज लूप्स। यह कई कार्यों को काफी कम कर देना चाहिए (विशेषकर सशर्त प्रतिस्थापन)।
ii
-
+`(.)\1|0
(.)-|(\d)(\d)
-$1$3$2
12
i3
23
i1
31
i2
)`(\d)i
i$1
^\D*$
$&0
रेटिना मेरी खुद की रेगेक्स-आधारित प्रोग्रामिंग भाषा है। स्रोत कोड को चरणों में बांटा जा सकता है: प्रत्येक चरण में दो रेखाएं होती हैं, जहां पहले में रेगेक्स (और संभवतः कुछ कॉन्फ़िगरेशन) होता है और दूसरी पंक्ति प्रतिस्थापन स्ट्रिंग होती है। चरणों को तब क्रम में STDIN पर लागू किया जाता है और अंतिम परिणाम STDOUT में मुद्रित किया जाता है।
आप -s
कमांड-लाइन स्विच के साथ एक स्रोत फ़ाइल के रूप में सीधे ऊपर का उपयोग कर सकते हैं । हालाँकि, मैं स्विच की गिनती नहीं कर रहा हूँ, क्योंकि आप प्रत्येक पंक्ति को एक अलग फ़ाइल में भी डाल सकते हैं (तब आप नई सुर्खियों के लिए 15 बाइट खो देते हैं, लेकिन अतिरिक्त फ़ाइलों के लिए +15 जोड़ सकते हैं)।
व्याख्या
इस समाधान के बारे में नई बात )
प्रचलित अवस्था में है। यह एक मल्टी-स्टेज लूप बंद करता है। कोई मेल नहीं है (
, जिसका अर्थ है कि लूप स्पष्ट रूप से पहले चरण में शुरू होता है। इसलिए, पहले 7 चरणों को दोहराया जाता है जब तक कि उनमें से सभी 7 के माध्यम से एक पूर्ण पास परिणाम को बदलना बंद कर देता है। ये 7 चरण बस विभिन्न परिवर्तनों का प्रदर्शन करते हैं जो धीरे-धीरे स्ट्रिंग में मैट्रिक्स की संख्या को कम करते हैं और चरणों को जोड़ते हैं। एक बार जब हम अंतिम परिणाम पर पहुंच जाते हैं, तो सात में से कोई भी पैटर्न किसी भी अधिक से मेल नहीं खाता है और लूप समाप्त होता है। बाद में, हम 0 को जोड़ते हैं यदि परिणाम में अभी तक कोई अंक नहीं है (जैसा कि उपर्युक्त चरणों के परिणाम सहित सभी पहचानों को छोड़ देते हैं)।
यहाँ व्यक्तिगत चरण क्या है:
ii
-
के सभी जोड़े को जोड़ती i
में -
चरण पात्रों को कम।
+`(.)\1|0
<empty>
अब अगर लगातार दो समान अक्षर बचे हैं, तो यह --
या तो दो समान अक्षर हैं । किसी भी मामले में, उन्हें गुणा करना पहचान देता है। लेकिन हमें पहचान की आवश्यकता नहीं है, इसलिए हम सभी को हटाते हैं, और स्पष्ट पहचान ( 0
ओं) को भी। यह चरण अपने आप में दोहराया जाता है +
जब तक कि परिणाम बदलना बंद न हो जाए। यह सुनिश्चित करता है कि जैसे चीजें 123321
पूरी तरह से हल हो जाती हैं, जैसे कि अगले चरण यह मान सकते हैं कि अंकों के सभी जोड़े अलग हैं।
(.)-|(\d)(\d)
-$1$3$2
यह वास्तव में एक (गोल्फ के लिए) में दो अलग-अलग रूपांतरण हैं। ध्यान दें कि यदि पहला वैकल्पिक मैच, $2
और $3
खाली हैं, और यदि दूसरा एक मैच $1
खाली है। तो यह इन दो चरणों में विघटित हो सकता है:
(\d)(\d)
-$2$1
यह सिर्फ अंकों के सभी जोड़े को स्वैप करता है और एक ऋण चिह्न जोड़ता है। जब से हम सभी को हटा दिया 0
है और सभी में समान जोड़े, यह केवल से मेल खाएगी 12
, 23
, 31
, 21
, 32
, 13
। यह कदम अजीब लग सकता है, लेकिन यह मुझे बाद में इनमें से आधे मामलों की जांच करने की अनुमति देता है, क्योंकि जिन्हें मैं संसाधित नहीं कर सकता, उन्हें अगले पुनरावृत्ति में यहां स्वैप किया जाएगा।
उपरोक्त चरण का अन्य भाग था:
(.)-
-$1
यह धीरे-धीरे -
सभी मार्गों को बाईं ओर ले जाता है (पुनरावृत्ति की एक स्थिति)। मैं ऐसा करता हूं कि अंततः वे एक दूसरे के बगल में हैं और पहले चरण में हल हो जाते हैं।
12
i3
23
i1
31
i2
ये तीन चरण अब केवल तीन जोड़ी उत्पादों को हल करते हैं। जैसा कि मैंने ऊपर कहा, यह केवल प्रासंगिक मामलों में से आधे को पकड़ लेगा, लेकिन अगले चरण में अन्य आधे को ध्यान में रखा जाएगा, पिछले चरण में सभी जोड़े को अदला-बदली के बाद।
)`(\d)i
i$1
यह लूप का अंतिम चरण है। यह एक के समान है -
जो बाईं ओर शिफ्ट होता है, सिवाय इसके i
। मुख्य अंतर यह है कि यह i
केवल अंकों के साथ स्वैप होता है। अगर मैं (.)i
उन मामलों में उपयोग करता हूं, जहां मुझे एक -i
या i-
दो मिलते हैं , तो उन्हें अनिश्चित काल के लिए स्वैप किया जाएगा और कार्यक्रम समाप्त नहीं होगा। तो यह केवल उन्हें -
संकेतों के दाईं ओर स्वैप करता है । यह पर्याप्त है - जब तक सभी -
और i
किसी बिंदु पर एक साथ दिखाई देते हैं, उन्हें सही ढंग से हल किया जा सकता है।
^\D*$
$&0
अंतिम चरण (लूप के बाहर)। याद रखें कि हमने हमेशा सभी पहचानों को नष्ट कर दिया है, इसलिए यदि परिणाम वास्तव में पहचान (एक चरण) है, तो हमारे पास आउटपुट में आवश्यक अंक नहीं होगा, इसलिए हम इसे वापस जोड़ते हैं।
एक उदाहरण के रूप में, यहां सभी मध्यवर्ती रूप हैं 0223202330203313021301011023230323
(लंघन चरणों में जो कोई परिवर्तन नहीं करते हैं):
0223202330203313021301011023230323
321321312 # Remove identities
-23-31-12-132 # Swap all pairs
-23-31-i3-132 # Resolve 12
-i1-31-i3-132 # Resolve 23
-i1-i2-i3-132 # Resolve 31
-i-1i-2i-3-312 # Move - to the left and swap pairs
-i-1i-2i-3-3i3 # Resolve 12
-i-i1-i2-3-i33 # Move i to the left
-i-i1-i2-3-i # Remove identities
--ii-1i-2-3i # Move - to the left
--ii-i1-2-i3 # Move i to the left
----i1-2-i3 # Resolve ii
i1-2-i3 # Remove identities
i-1-2i3 # Move - to the left
i-1-i23 # Move i to the left
-i-1i-32 # Move - to the left and swap pairs
-i-i1-32 # Move i to the left
--ii-1-23 # Move - to the left and swap pairs
--ii-1-i1 # Resolve 23
----1-i1 # Resolve ii
1-i1 # Remove identities
-1i1 # Move - to the left
-i11 # Move i to the left
-i # Remove identities. Now the loop can't change this any longer.
-i0 # Fix the result by adding in the 0.