पर्ल, 43 बाइट्स
map{say if$_==eval s/./+$&**$+[0]/gr}<>..<>
इसे ऑनलाइन आज़माएं!
रेगेक्स वास्तव में शक्तिशाली है, तुम लोग।
व्याख्या
पहली चीज़ जो कोड करती है <>, उसे इनपुट के रूप में दो पूर्णांकों को पढ़ा जाता है , और पहले से दूसरे तक एक सीमा बनाता है ..। यह तब mapइस श्रेणी के माध्यम से पुनरावृति करने के लिए मानक फ़ंक्शन का उपयोग करता है , और प्रत्येक मान के लिए निम्न कोड लागू करता है say if$_==eval s/./+$&**$+[0]/gr:। यह जिबरिश जैसा दिखता है, और यह इस तरह का है, लेकिन यहां वास्तव में क्या हो रहा है।
mapनिहित रूप से चर में इसके वर्तमान मूल्य को संग्रहीत करता है $_। कई पर्ल फ़ंक्शंस और ऑपरेशन इस वैल्यू का उपयोग करते हैं जब कोई नहीं दिया जाता है। इसमें नियमित अभिव्यक्तियाँ शामिल हैं, जैसे s///प्रतिस्थापन संचालक।
प्रतिस्थापन रेगेक्स के चार भाग हैं:
- हेरफेर करने के लिए स्ट्रिंग। आमतौर पर, ऑपरेटर
=~को एक स्ट्रिंग में रेगेक्स लागू करने के लिए उपयोग किया जाता है, लेकिन यदि यह ऑपरेटर अनुपस्थित है, तो रेगेक्स को निहित चर पर लागू किया जाता है $_, जिसमें mapफ़ंक्शन के माध्यम से हमारा वर्तमान नंबर होता है।
- खोज करने के लिए स्ट्रिंग। इस स्थिति में, हम वाइल्डकार्ड द्वारा निरूपित किसी एकल गैर-नई वर्ण रेखा को खोज रहे हैं
.। वास्तव में, हम प्रत्येक व्यक्तिगत अंक को कैप्चर कर रहे हैं।
- साथ बदलने के लिए स्ट्रिंग। हम
+एक गणितीय चिह्न के बाद एक प्लस चिन्ह का प्रतिस्थापन कर रहे हैं , जो कुछ जादुई पर्ल चर के साथ मिश्रित है जो सब कुछ काफी आसान बना देता है।
विशेष स्केलर वैरिएबल में $&हमेशा अंतिम सफल रेगेक्स कैप्चर की संपूर्णता होती है, जो इस मामले में एकल अंक है। विशेष सरणी चर में @+हमेशा अंतिम सफल मैच के लिए पोस्टमैच ऑफसेट की सूची होती है , अर्थात मैच के बाद पाठ का सूचकांक । पाठ का $+[0]सूचकांक $_तुरंत निम्नलिखित है $&। के मामले में 135, हम अंक को कैप्चर करते हैं 1, और 135पाठ के सूचकांक को तुरंत बाद में (अर्थात् 35) 1 है, जो हमारा प्रतिपादक है। इसलिए, हम $&(1) की शक्ति $+[0](1) को उठाना चाहते हैं और 1. प्राप्त करना चाहते हैं। हम 3 को 2 की शक्ति तक बढ़ाना चाहते हैं और 9. प्राप्त करना चाहते हैं। हम 5 को 3 की शक्ति तक बढ़ाना चाहते हैं और 125 प्राप्त करना चाहते हैं।
यदि इनपुट था 135, तो परिणामी स्ट्रिंग है +1**1+3**2+5**3।
- रेगेक्स-संशोधित झंडे। यहां हम दो रेगेक्स झंडे का उपयोग कर रहे हैं -
/gऔर /r। /gदुभाषिया को पहले मिलने के बाद प्रतिस्थापन जारी रखने के लिए कहता है (अन्यथा हम साथ समाप्त हो जाएंगे +1**135)। /rदुभाषिया को मूल स्ट्रिंग को संशोधित नहीं करने के लिए कहता है , और बदले में स्ट्रिंग को प्रतिस्थापन के बाद क्या होगा। यह महत्वपूर्ण है, क्योंकि अन्यथा, यह अधिलेखित हो जाएगा $_, और हमें इसकी तुलना उद्देश्यों के लिए करने की आवश्यकता है।
एक बार संपूर्ण प्रतिस्थापन हो जाने के बाद, हमें एक गणितीय अभिव्यक्ति मिलती है, जिसका मूल्यांकन evalफ़ंक्शन के साथ किया जाता है। +1**1+3**2+5**3में मूल्यांकन किया जाता है 1 + 9 + 125 = 135, जिसकी तुलना मूल संख्या से की जाती है 135। चूंकि ये दोनों समान हैं, कोड संख्या को प्रिंट करता है।