ReRegex , 294 275 बाइट्स
बेहतर 'फ़ंक्शन' परिभाषाओं का उपयोग करके 19 बाइट्स सहेजे गए
मैं कहूंगा कि यह केवल एक रेगेक्स भाषा के लिए बहुत अच्छा है।
बेस लिबर यूनरी और डेसीमल के बीच रूपांतरण की अनुमति देता है (जिसे चुनौती के रूप में स्पष्ट रूप से दशमलव के रूप में आवश्यक है), लेकिन बाइनरी का समर्थन नहीं करता है; इसलिए मुझे यह लिखना पड़ा कि स्क्रिप्ट के हिस्से के रूप में इसमें 120 बाइट्स जोड़े गए।
#import base
b(\d*):(_*)\2_b/b1$1:$2b/b(\d*):(_+)\2b/b0$1:$2b/b(\d+):b/$1/b:b/0/B(_*):1/B$1$1_:/B(_*):0/B$1$1:/B(_*):B/$1/j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/j(\d*),\1\d{0,7}:,?(.*)/,$2,/,((_+)_+),(\2),/,$1,/,(_+),(\1_*),/,$2,/^,(_*),$/d<$1>/j,b:u<(?#input)>b:
इसे ऑनलाइन आज़माएं!
अलग-अलग Regexes द्वारा।
#import base
b(\d*):(_*)\2_b/b1$1:$2b/
b(\d*):(_+)\2b/b0$1:$2b/
b(\d+):b/$1/
b:b/0/
B(_*):1/B$1$1_:/
B(_*):0/B$1$1:/
B(_*):B/$1/
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
,((_+)_+),(\2),/,$1,/
,(_+),(\1_*),/,$2,/
^,(_*),$/d<$1>/
j,b:u<(?#input)>b:
कदम
सबसे पहले, हम 'बेस' लाइब्रेरी को आयात करते हैं, जो दो रेगीक्स देता है। एक जो एकता u<numbers>
में परिवर्तित होती है। और एक जो d<unary_underlines>
दशमलव में वापस परिवर्तित होता है । ऐसा इसलिए है क्योंकि चुनौती को बेस 10 में आईओ की आवश्यकता होती है।
फिर हम मुट्ठी भर रीजैक्स को परिभाषित करते हैं जो अनरी को बाइनरी में बदलते हैं।
b(\d*):(_*)\2_b/b1$1:$2b/
b(\d*):(_+)\2b/b0$1:$2b/
b(\d+):b/$1/
b:b/0/
इनमें से सबसे पहले, कुछ द्विआधारी अंकों के बाद वैकल्पिक रूप से b(\d*):(_*)\2_b/b1$1:$2b/
खोज की b
जाती है, फिर एक :
, फिर किसी भी राशि को रेखांकित किया जाता है, उसके बाद एक ही राशि के अंडरलाइन प्लस एक, और अंत में दूसराb
।
उसके बाद हम b1
पहले से बाइनरी अंकों :
और उसके बाद अंडरस्कोर के पहले हाफ को प्रतिस्थापित करते हैं , और अंत में अंतिमb
।
इसलिए यह जाँच करता है कि यदि यूनरी दो से विभाज्य नहीं है, और यदि ऐसा है, तो 1 से यह द्विआधारी अंक का संकेत देता है, फिर इसे दो से एक घटाता है।
दूसरा एक, b(\d*):(_+)\2b/b0$1:$2b/
लगभग वैचारिक है, हालांकि एक अतिरिक्त के लिए जाँच नहीं करता है _
, जिसका अर्थ है कि यह केवल मेल खाता है यदि यह दो से विभाज्य है, और इस मामले में प्रीपेन्ड करता है0
इसके बजाय ।
यदि हम एक अंक से बाहर हैं, और यदि ऐसा है तो तीसरा एक चेक बाइनरी अंकों को छोड़ने के लिए पैडिंग को स्ट्रिप्स करता है।
पिछले एक चेक अगर कोई बाइनरी अंकों की आपूर्ति नहीं होती है, और उस स्थिति में बस निकल जाती है 0
।
रेगेक्स के अगले समूह को हम बाइनरी को वापस एकता में बदलने के लिए परिभाषित करते हैं, और थोड़ा और अधिक सरल हैं।
B(_*):1/B$1$1_:/
B(_*):0/B$1$1:/
B(_*):B/$1/
इस समूह में से सबसे पहले, B(_*):1/B$1$1_:/
इसके प्रतिपक्षी की तरह, एक का पता लगाता है B
, उसके बाद किसी भी मात्रा में यूनरी अंक, तब :1
। यह मिलान के लिए जाँच नहीं करता हैB
इस मामले में , क्योंकि यह केवल एक समय में एक अंक की खोज कर रहा है। यदि यह मिलान किया जाता है, तो यह पहले से मिलान किए गए अंकों की संयुक्त राशि को दोगुना कर देता है और एक को जोड़ता है, फिर एक को हटा देता है।
दूसरा, B(_*):0/B$1$1:/
पहले के मुकाबले मैच के 0
बजाय लगभग वैचारिक है1
, और एक अतिरिक्त गैरी अंक नहीं जोड़ता है।
इनमें से अंतिम B(_*):B/$1/
, यह जांचता है कि क्या कोई बाइनरी अंक नहीं हैं, और यदि ऐसा नहीं है तो यूनरी को खोल देता है। इसके विपरीत के विपरीत, इसके लिए विशेष 0 मामले की आवश्यकता नहीं है।
आगे हम j
रेगीज़ को परिभाषित करते हैं , जो एक विभाजन कार्य के रूप में कार्य करता है।
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
सबसे पहले, j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
सबसे भारी उठाने का काम करता है। यह खोज करता है j
, वैकल्पिक रूप से द्विआधारी अंकों के बाद जो कि "इंक्रीमेंटर" है, फिर एक अल्पविराम के बाद इंक्रीमेंटर और उसके बाद बाइनरी नंबर के बाद 8 बाइनरी अंक, फिर ए :
। 8 अंकों में से पहला वृद्धिशील से जुड़ा होता है, इस प्रकार इसे बढ़ाता है, फिर सब कुछ लेकिन बाइनरी इनपुट से उन 8 अंकों को :
निम्नलिखित के बाद जोड़ दिया जाता है ,
। तो (अगर हम 8 के बजाय 2 अंकों का उपयोग कर रहे थे) j,1001:
बन जाएगा j1:1001:,01
तो j10:1001,01,11
। इसके अतिरिक्त, संलग्न सरणी तत्व एस में लिपटे हुए हैं B
, उन्हें वापस एकात्मक में बदलने के लिए।
अन्य, j(\d*),\1\d{0,7}:,?(.*)/,$2,/
जाँचता है कि वृद्धिशील के बाद जाँच करने के लिए 8 से कम बाइनरी अंक हैं या नहीं, और यदि ऐसा है, तो ,
एस में लिपटे सरणी के अलावा सब कुछ हटा देता है । उदाहरण के लिए।,_,___,
सरणी के निर्माण के दौरान और बाद में हम तुलना करने वाले अवशेषों को परिभाषित करते हैं।
,((_+)_+),(\2),/,$1,/
,(_+),(\1_*),/,$2,/
इनमें से पहला, ,((_+)_+),(\2),/,$1,/
अल्पविराम की कुछ राशि की जाँच करता है, फिर कुछ अल्पांश की, फिर एक अल्पविराम की, फिर एक अल्पविराम की, पहली अल्पविराम की मात्रा। इसके बाद इसे ,
एस से घिरे पहले तत्व में अंडरस्कोर की कुल मात्रा के साथ बदल देता है ।
बाद वाला, ,(_+),(\1_*),/,$2,/
अल्पविराम की जाँच करता है, जिसके बाद कुछ राशि अंडरस्कोर होती है, उसके बाद एक अन्य अल्पविराम, फिर वही राशि या अधिक अंडरस्कोर, और एक अंतिम अल्पविराम। इसके बजाय सही तत्व छोड़ देंगे।
अंत में, जब इस प्रकार मेल खाते हुए तत्व बचे होते हैं ^,(_*),$
, तो हम आस-पास के अल्पविरामों को हटाते हैं और वापस दशमलव के माध्यम से परिवर्तित करते हैं d<>
। फिर कोई और अधिक रेगीक्स आग लगा सकता है और आउटपुट प्रस्तुत किया जाता है।
इनपुट को शुरू में टेम्प्लेट में रखा जाता है j,b:u<(?#input)>b:
, जो पहले दशमलव इनपुट को unary में परिवर्तित करता है, जैसे 5
-> j,b:_____b:
, फिर परिणामी unary to बाइनरी, j,101:
फिर बाइनरी को विभाजित करता है (जो उदाहरण के लिए काम नहीं करता है), सबसे बड़ा तत्व प्राप्त करता है, कनवर्ट करता है वापस दशमलव में, और किया।