हास्केल , 1080 1033 बाइट्स
;
f=
g
ij=f
a =hi
hi = g
hij= ij
g ' ' =0
g '"' =0;
g '$' =0;
g '&' =0-0
g '(' =0-0-0
g '*' =0-0-0;
g ',' =0-0-0;
g '.' =0-0-0-0
g '0' =0-0-0-0-0
g '2' =0-0-0-0-0;
g '4' =0-0-0-0-0;
g '6' =0; g '8' =0
g ':' =0; g '<' =0-0
g '>' =0; g '@' =0-0;
g 'B' =0; g 'D' =0-0;
g 'F' =0; g 'H' =0-0-0
g 'J' =0; g 'L' =0-0-0-0
g 'N' =0; g 'P' =0-0-0-0;
g 'R' =0; g 'T' =0-0-0-0;
g 'V' =0; g 'X' =0-0-0-0-0
g 'Z' =0; g '^' =0; g '`' =0
g 'b' =0; g 'd' =0; g 'f' =0;
g 'h' =0; g 'j' =0; g 'l' =0;
g 'n' =0; g 'p' =0; g 'r' =0-0
g 't' =0; g 'v' =0; g 'x' =0-0-0
g 'z' =0; g '\92' =0-0; g '|' =0;
g '~' =0; g y = 1 ;z=0; i(-0)z=z;
i m('\10':y ) ="y"; ; ; ; ; ; ; ;
i m(mnmnmnmnm:y ) = i(m - 1 ) y ; ;
i k m ="y"; ; k i [ ] =01<1010101010;
k m('\10':y ) = k(m + 1 )(i m y ) ; ;
k m y =01>10; m o = k 1$'\10':o ; ; ;
o i('\10':y ) = o i y ; ; ; ; ; ; ; ; ;
o i(k:y )|g k<i = o(1 - i ) y ; ; ; ; ; ;
o i(k:y )|g k>i = o(1 - i ) y ; ; ; ; ; ;
o i [ ] =01<10; o i y =01>10;v=01>10101010
s y|o 1 y = m y|o(-0) y = m y ; s y =v; ; ;
इसे ऑनलाइन आज़माएं!
व्याख्या
हास्केल के लिए यह काफी दिलचस्प काम रहा है।
समानता
शुरू करने के लिए हमें यह निर्धारित करने के कुछ तरीके की आवश्यकता होती है कि क्या चरित्र में समान या विषम कोड-बिंदु है। सामान्य तरीका यह हो सकता है कि कोड-पॉइंट प्राप्त करने के लिए और इसे 2 से मॉड किया जाए। हालांकि, जैसा कि किसी को पता हो सकता है, किसी वर्ण के कोड-पॉइंट को प्राप्त करने के लिए एक आयात की आवश्यकता होती है, जो स्रोत प्रतिबंध के कारण इसका मतलब है कि यह नहीं हो सकता है उपयोग किया गया। एक अधिक अनुभवी हास्केलर पुनरावृत्ति का उपयोग करने के लिए सोचेंगे। हम टाइपकास्टियों Charका हिस्सा हैं Enumइसलिए हम उनके पूर्ववर्तियों और उत्तराधिकारियों को प्राप्त कर सकते हैं। हालांकि predऔर succक्योंकि वे वैकल्पिक बाइट समता नहीं है भी दोनों व्यर्थ कर रहे हैं।
तो यह हमें बहुत अटक गया हम बहुत आकर्षण के साथ किसी भी हेरफेर नहीं कर सकते हैं। इसका समाधान सब कुछ हार्डकोड करना है। हम शाब्दिक के रूप में (अधिकांश) वर्णों का प्रतिनिधित्व कर सकते हैं, बाधाओं से हमें परेशानी होती है क्योंकि 'यह अजीब है इसलिए यह चर के बगल में नहीं हो सकता है जिससे अधिकांश विषम वर्णों को व्यक्त करना शाब्दिक असंभव हो। इसलिए हम सभी बाइट्स को हार्ड कोड करते हैं, और फिर अंत में विषम बाइट्स के लिए सभी कैच जोड़ते हैं।
समस्या बाइट्स
आप देख सकते हैं कि कुछ बाइट्स ऐसे भी हैं जिनके लिए सिंगल-कोट्स में रैप करके शाब्दिक नहीं बनाया जा सकता है। वे unprintables, newlines और हैं \। जब तक हम उनमें से किसी का भी उपयोग नहीं करते हैं, तब तक हमें unprintables के बारे में चिंता करने की आवश्यकता नहीं है। वास्तव में, हम अभी भी टैब की तरह अजीब unprintables का उपयोग कर सकते हैं, मैं अभी जरूरत नहीं है। न्यूलाइन को काफी हद तक नजरअंदाज किया जा सकता है क्योंकि इसे प्रोग्राम से वैसे भी ट्रिम किया जाएगा। (हम न्यूलाइन शामिल कर सकते हैं, क्योंकि यह कोड-पॉइंट बल्कि सुविधाजनक है, लेकिन हमें इसकी आवश्यकता नहीं है)। यह पत्तियां \, अब \कोडपॉइंट 92 है, जो आसानी से एक विषम संख्या है जिसके बाद सम संख्या है, इसलिए यह पूरी तरह से मान्य है। बाद में जब हमें न्यूलाइन का प्रतिनिधित्व करने की आवश्यकता होती है तो हम ध्यान देंगे कि यह सौभाग्य से इसी संपत्ति के पास है ।\92 इस तरह से शाब्दिक रूप से evens और बाधाओं के बीच वैकल्पिक होता है'\92''\10'
समस्याओं को दूर करना
अब वास्तविक कोड लिखना शुरू करने के लिए हमें एक पंक्ति में एक बड़ी संख्या में वर्ण डालने में सक्षम होना चाहिए। ऐसा करने के लिए मैंने कैप लिखा:
;
f=
g
ij=f
a =hi
hi = g
hij= ij
टोपी कुछ भी नहीं करता है सिवाय मान्य हास्केल के। मुझे शुरू में ऐसी परिभाषाएँ बनाने की उम्मीद थी जो बाद में कोड में हमारी मदद करेगी, लेकिन ऐसा नहीं हुआ। टोपी बनाने के आसान तरीके भी हैं, उदाहरण के लिए व्हॉट्सएप और सेमीकोलन, लेकिन वे इस तरह से बाइट नहीं बचाते हैं इसलिए मैंने इसे बदलने की जहमत नहीं उठाई।
Hardcoder
इसलिए अब जब मेरे पास एक पंक्ति में पर्याप्त स्थान है तो मैं हार्डकॉन्डिंग मान शुरू करता हूं। यह ज्यादातर सुंदर उबाऊ है, लेकिन कुछ चीजें रुचि की हैं। एक बार के लिए लाइनें शुरू होने में अधिक समय लगता है तो हम ;एक लाइन पर कई घोषणाएं करने के लिए उपयोग कर सकते हैं , जो हमें एक टन बाइट्स बचाता है।
दूसरा यह है कि चूंकि हम हमेशा एक पंक्ति को gहर एक के साथ शुरू नहीं कर सकते हैं इसलिए अक्सर हमें लाइनों को थोड़ा सा इंडेंट करना पड़ता है। अब हास्केल वास्तव में इंडेंटेशन की परवाह करता है, इसलिए वह इस बारे में शिकायत करेगा। हालाँकि अगर इंडेंटेड लाइन से पहले आखिरी लाइन अर्धविराम में खत्म हो जाती है तो वह इसे अनुमति देगा। क्यों? मैं बेहोश नहीं हुआ, लेकिन यह काम करता है। इसलिए हमें बस लाइनों के अंत में अर्धविराम लगाने के लिए याद रखना होगा।
बिल्डिंग ब्लॉक्स
एक बार हार्डकॉडर हो जाने के बाद यह कार्यक्रम के अंत तक आसानी से चल रहा है। हमें कुछ सरल कार्यों का निर्माण करने की आवश्यकता है। पहले मैं एक संस्करण का निर्माण करता हूं drop, जिसे कहा जाता है i। iइसमें से अलग dropहै कि अगर हम स्ट्रिंग के अंत को छोड़ने का प्रयास करते हैं तो यह वापस लौटता है "y"। iड्रॉप से भी अलग है कि अगर यह एक नई लाइन को छोड़ने का प्रयास करता है तो यह वापस आ जाएगा "y", ये उपयोगी होंगे क्योंकि बाद में जब हम यह सत्यापित कर रहे हैं कि प्रोग्राम एक त्रिकोण है, तो यह हमें Falseअंतिम लाइन पूरी नहीं होने पर या जब वापस लौटने की अनुमति देगा एक लाइन जल्दी खत्म होती है।
अगला हमारे पास है kknरोंरोंTruenkएन + १False
हम तो के लिए एक उपनाम बनाने k, m। mबस है kके साथ 1पहला तर्क में, और एक नई पंक्ति दूसरा तर्क के लिए prepended।
अगला हमारे पास है o। oएक संख्या और एक स्ट्रिंग लेता है। यह निर्धारित करता है कि स्ट्रिंग बाइट्स (न्यूलाइन्स को नजरअंदाज करते हुए g) समानता में वैकल्पिक है (हमारा उपयोग करके ) इनपुट नंबर से शुरू होता है।
अंत में हमारे पास sजो oदोनों के साथ चलता है , 1और 0यदि वह सफल हो जाता है तो वह हार जाता है m। यदि यह विफल रहता है तो यह दोनों ही वापस लौटता है False। यह वह फ़ंक्शन है जो हम चाहते हैं। यह निर्धारित करता है कि इनपुट त्रिकोणीय और वैकल्पिक है।