हास्केल , 306 + 624 = 930 बाइट्स
कार्यक्रम 1: एक अनाम फ़ंक्शन एक डमी तर्क ले रहा है और एक स्ट्रिंग लौटा रहा है।
(\b c()->foldr(\a->map pred)b(show()>>c)`mappend`show(map(map fromEnum)$tail(show c):pure b))"İĴİóđđđÝöÝâÝæÝääē××êääē××İēÀħđĮâħēĕóİóòòĮááħááđéêâéêēááĮÀħ""(\b c()->foldr(\a->map pred)b(show()>>c)`mappend`show(map(map fromEnum)$tail(show c):pure b))"
इसे ऑनलाइन आज़माएं!
कार्यक्रम 2: q[[40,...]]
अंत में एक अनाम फ़ंक्शन एक डमी तर्क ले रहा है और एक स्ट्रिंग लौटा रहा है।
z~z=[[['@','0'..]!!4..]!!z]
q[x,q]_=z=<<x++q++[34,34]++x
q[[40,92,98,32,99,40,41,45,62,102,111,108,100,114,40,92,97,45,62,109,97,112,32,112,114,101,100,41,98,40,115,104,111,119,40,41,62,62,99,41,96,109,97,112,112,101,110,100,96,115,104,111,119,40,109,97,112,40,109,97,112,32,102,114,111,109,69,110,117,109,41,36,116,97,105,108,40,115,104,111,119,32,99,41,58,112,117,114,101,32,98,41,41,34],[304,308,304,243,273,273,273,221,246,221,226,221,230,221,228,228,275,215,215,234,228,228,275,215,215,304,275,192,295,273,302,226,295,275,277,243,304,243,242,242,302,225,225,295,225,225,273,233,234,226,233,234,275,225,225,302,192,295]]
इसे ऑनलाइन आज़माएं!
चरित्र सेट 1 (स्थान शामिल है):
"$()-:>E\`abcdefhilmnoprstuw×ÝáâäæéêñòóöđēĕħĮİĴ
चरित्र सेट 2 (न्यूलाइन शामिल):
!'+,.0123456789<=@[]_qxz~
चूंकि केवल सेट 1 में गैर-एएससीआईआई अक्षर होते हैं, उनके यूटीएफ -8 बाइट्स भी निराशाजनक हैं।
यह काम किस प्रकार करता है
प्रोग्राम 1 को आम तौर पर लैम्ब्डा एक्सप्रेशन, स्पेस और कोष्ठक, बिलिन अल्फ़ान्यूमेरिक फ़ंक्शंस के मुफ्त उपयोग और अंत में स्ट्रिंग शाब्दिक के रूप में क्वीन डेटा के साथ लिखा जाता है।
- प्रोग्राम 1 का स्वयं का कोर कोड स्ट्रिंग शाब्दिक डेटा में बदल जाता है बस इसे उद्धरण चिह्नों के साथ आस-पास किया जाता है।
- इसका समर्थन करने के लिए, प्रत्येक बैकस्लैश का अनुसरण किया जाता है
a
या b
, जो राउंडट्रिप के माध्यम से वैध भागने क्रम बनाता है show
।
- एक और छोटा लाभ यह है
a
, b
और c
केवल निचले मामले पत्र हैं जिनके ASCII कोड 100 से कम हैं, जो प्रोग्राम 2 द्वारा उपयोग किए गए संख्यात्मक एन्कोडिंग में एक अंक बचाते हैं।
- प्रोग्राम 2 के मूल कोड का स्ट्रिंग शाब्दिक एन्कोडिंग गैर-एएससीआईआई यूनिकोड का उपयोग करके अधिक बाधित है: प्रत्येक वर्ण में मूल वर्णों के साथ कोई ओवरलैप नहीं है यह सुनिश्चित करने के लिए अपने कोड बिंदु में 182 जोड़ा गया है।
- 182 128 हुआ करता था, जब तक मुझे एहसास हुआ कि मैं इस तथ्य का दुरुपयोग कर सकता हूं कि 182 प्रोग्राम 1 कोड के डिकोडिंग को छोटा करने के लिए स्ट्रिंग शाब्दिक की लंबाई से दोगुना है। (एक बोनस के रूप में, कार्यक्रम 2 नईलाइन्स का उपयोग कर सकता है।)
प्रोग्राम 2 आम तौर पर शीर्ष स्तर फ़ंक्शन समीकरणों (अंतिम अनाम एक को छोड़कर), चरित्र शाब्दिक और दशमलव संख्या, सूची / रेंज सिंटैक्स और ऑपरेटरों के साथ और Int
अंत में एस की सूचियों की सूची के रूप में क्वीन डेटा के साथ लिखा जाता है ।
- प्रोग्राम 1 के मूल कोड को अंतिम दोहरे उद्धरण के साथ, इसके कोड बिंदुओं की सूची के रूप में एन्कोड किया गया है।
- प्रोग्राम 2 के मूल कोड को प्रोग्राम 1 में प्रयुक्त स्ट्रिंग शाब्दिक के कोड बिंदुओं की सूची के रूप में एन्कोड किया गया है, फिर भी 182 तक ऊपर की ओर स्थानांतरित कर दिया गया।
वॉकथ्रू, प्रोग्राम 1
b
और c
लैम्बडा अभिव्यक्ति के अंतिम तर्क के रूप में, क्रमशः कार्यक्रम 2 और 1 के लिए स्ट्रिंग शाब्दिकों के मान हैं। ()
पीपीसीजी के नियम को संतुष्ट करने के लिए केवल एक डमी तर्क है कि कार्यक्रम को एक फ़ंक्शन को परिभाषित करना चाहिए।
foldr(\a->map pred)b(show()>>c)
यह b
प्रोग्राम की कोर कोड को स्ट्रिंग को डिकोड करता map pred
है show()>>c == c++c
, जिसकी लंबाई के बराबर कई बार इसे लागू करके या 182
।
tail(show c)
स्ट्रिंग c
को प्रोग्राम 1 के मूल कोड में कनवर्ट करता है , जिसमें अंतिम डबल उद्धरण जोड़ा जाता है।
:pure b
स्ट्रिंग के साथ एक सूची में इसे जोड़ती है b
।
map(map fromEnum)$
कोड बिंदुओं की सूची में स्ट्रिंग्स को कनवर्ट करता है।
`mappend`show(...)
परिणामी सूचियों को क्रमबद्ध करता है और अंत में इसे कार्यक्रम 2 के मूल कोड में जोड़ देता है।
वॉकथ्रू, प्रोग्राम 2
- टॉपवेल
z~z=[[['@','0'..]!!4..]!!z]
एक फ़ंक्शन है जो कोड पॉइंट्स को वापस वर्णों में परिवर्तित करता है (लिखने के लिए आवश्यक है क्योंकि सभी वर्ण toEnum
उपलब्ध नहीं हैं।)
- इसके कोड पॉइंट तर्क को भी कहा जाता है
z
। आलसीपन मार्कर ~
का इस स्थिति में कोई प्रभाव नहीं है, लेकिन एक अंतरिक्ष चरित्र से बचा जाता है।
['@','0'..]
ASCII कोड 64 पर शुरू होने वाली एक बैकवर्ड स्टेपिंग लिस्ट रेंज है, फिर प्रत्येक चरण में 16 नीचे कूदते हैं।
- को लागू करने
!!4
के लिए इस के लिए एक देता है \NUL
चरित्र।
- रैपिंग कि एक
[ ..]
सीमा में सभी पात्रों की एक सूची देता है, जो !!z
अनुक्रमित करता है।
- चरित्र अंत में एक एकल सूची में लिपटे हुए है। यह अनुपलब्ध और के बजाय का
z
उपयोग कर सूची पर समारोह मानचित्रण की अनुमति देता है ।=<<
map
<$>
- उच्चस्तरीय
q[x,q]_=z=<<x++q++[34,34]++x
एक समारोह Quine डेटा सूची से कार्यक्रम 1 का निर्माण है।
x
प्रोग्राम 1 की कोर के लिए डेटा (एक अंतिम दोहरे उद्धरण सहित) और आंतरिक q
कार्यक्रम के मूल के लिए डेटा है। 2. _
केवल एक स्ट्रिंग के बजाय अंतिम अनाम फ़ंक्शन को फ़ंक्शन करने के लिए एक और डमी तर्क है।
x++q++[34,34]++x
ASCII कोड 34 के साथ दो दोहरे उद्धरण चिह्नों सहित टुकड़ों को समेटता है।
z=<<
z
कोड अंक से वर्णों में बदलने के लिए कार्यक्रम के मानचित्रण द्वारा प्रोग्राम 1 का निर्माण करता है ।
- फ़ाइनल
q[[40,...]]
एक गुमनाम फंक्शन है q
जिसे क्वीन डेटा के साथ जोड़ा जाता है।