हास्केल , 3 quines, 1119 बाइट्स
क्वीन 1, 51 बाइट्स
एक गुमनाम IOकार्रवाई सीधे स्टडआउट करने के लिए मुद्रण।
putStr`mappend`print`id`"putStr`mappend`print`id`"
इसे ऑनलाइन आज़माएं!
क्वीन 2, 265 बाइट्स
फ़ंक्शन fएक डमी तर्क लेता है और एक स्ट्रिंग लौटाता है।
f c=[b=<<g]!!0++show g;b c=[[[show 9!!0,show 1!!0..]!!6..]!!c];g=[93,0,90,52,82,89,52,51,51,94,84,24,24,39,34,34,106,95,102,110,0,94,50,89,0,90,52,82,82,82,106,95,102,110,0,48,24,24,39,35,106,95,102,110,0,40,24,24,39,37,37,84,24,24,45,37,37,84,24,24,90,84,50,94,52]
इसे ऑनलाइन आज़माएं!
काफी 3, 803 बाइट्स
LANGUAGEप्रागमा के बाद सब कुछ एक डमी तर्क लेने और एक स्ट्रिंग वापस करने के लिए एक अनैतिक कार्य है।
{-#LANGUAGE CPP#-}(\q(_:_:_:_:_:_:_:_:z)y(#)_->(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z)'\''__TIME__(\(?)v k x->v$k?x)$ \(&)(%)v->v&'{'&'-'&'#'&'L'&'A'&'N'&'G'&'U'&'A'&'G'&'E'&' '&'C'&'P'&'P'&'#'&'-'&'}'&'('%'\\'&'q'&'('&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'z'&')'&'y'&'('&'#'&')'&'_'&'-'&'>'&'('&'y'&'('%'\\'&'k'&' '&'x'&'-'&'>'%'\''&'&'%'\''&':'&'q'&':'&'k'&':'&'q'&':'&'x'&')'&'#'&'y'&'('%'\\'&'k'&' '&'x'&'-'&'>'%'\''&'%'%'\''&':'&'q'&':'%'\''%'\\'%'\\'%'\''&':'&'k'&':'&'q'&':'&'x'&')'&'$'&'y'&'('&':'&')'&'#'&'y'&'('&':'&')'&'$'&' '%'\\'&'x'&'-'&'>'&'x'&')'&'z'&')'%'\''%'\\'%'\''%'\''&'_'&'_'&'T'&'I'&'M'&'E'&'_'&'_'&'('%'\\'&'('&'?'&')'&'v'&' '&'k'&' '&'x'&'-'&'>'&'v'&'$'&'k'&'?'&'x'&')'&'$'&' '%'\\'&'('&'&'&')'&'('&'%'&')'&'v'&'-'&'>'&'v'
इसे ऑनलाइन आज़माएं!
वर्ण
क्विन 1:
"S`adeimnprtu
2:
!+,.0123456789;<=[]bcfghosw
3:
#$%&'()-:>?ACEGILMNPTU\_kqvxyz{}
यह काम किस प्रकार करता है
काफी 1
putStr`mappend`print`id`"putStr`mappend`print`id`"
Quine 1 मेरे हालिया गोल्फ का एक संशोधित संस्करण है जिसमें आप एक क्वीन उत्तर (H.PWiz द्वारा सुधार के साथ):
- चूंकि पूर्ण कार्यक्रमों की आवश्यकता नहीं है, इसलिए
main=हटा दिया गया है।
<>और $उनके पास समानार्थी शब्दों ने ले ली है mappendऔर id।
यह अन्य वर्णों के लिए महत्वपूर्ण पात्रों =<>और सहायक ऑपरेटर $को मुक्त करता है।
काफी 2
f c=[b=<<g]!!0++show g;b c=[[[show 9!!0,show 1!!0..]!!6..]!!c];g=[93,0,......]
Quine 2 मेरे हाल ही के पारस्परिक विशेष रूप से Quines उत्तर के 2 को प्रोग्राम करने के लिए कुछ इसी तरह के तरीकों का उपयोग करता है , लेकिन खुद को सीधे और विशेष रूप से चरित्र शाब्दिक का उपयोग करने से बचने के लिए अनुकूलित किया जाता है, जो कि quine के लिए आवश्यक हैं। 3. इन दोनों को showफ़ंक्शन की मदद से हासिल किया जाता है , जो कि सरासर किस्मत से अभी तक इसके किसी भी पात्र का इस्तेमाल नहीं किया है।
यह क्वीन रिक्त स्थान के बजाय टैब का उपयोग करता है, लेकिन मैंने पठनीयता के लिए नीचे रिक्त स्थान का उपयोग किया है।
gकोड के अंत में पूर्णांकों की सूची के रूप में, quine data है। प्रत्येक संख्या बाकी कोड से एक चरित्र का प्रतिनिधित्व करती है।
- संख्या द्वारा स्थानांतरित कर दिया जाता है
9, ताकि टैब है 0। यह फ़ंक्शन और चर नामों के लिए निचले अक्षरों को 2 अंकों में फिट करने की अनुमति देकर एन्कोडिंग को थोड़ा छोटा करता है।
b c=[[[show 9!!0,show 1!!0..]!!6..]!!c] एक संख्या को एक चरित्र में बदलने के लिए एक फ़ंक्शन है (वास्तव में एक एक चरित्र स्ट्रिंग)।
[[show 9!!0,show 1!!0..]!!6..]एक कैरेक्टर रेंज एक टैब कैरेक्टर से शुरू होती है, जिसे इसमें अनुक्रमित किया जाता है !!c।
- टैब वर्ण स्वयं एक अन्य श्रेणी में अनुक्रमणिका द्वारा निर्मित होता है
[show 9!!0,show 1!!0..], अंक वर्णों से शुरू होता है '9'और '1'8 के चरणों में नीचे कूदता है।
- अंक वर्णों को
showसंबंधित अंक के स्ट्रिंग में अनुक्रमित करके उत्पादित किया जाता है ।
f c=[b=<<g]!!0++show gमुख्य कार्य है। cएक डमी तर्क है।
b=<<g=<<प्रत्येक gवर्ण को उसके वर्ण में बदलने के लिए उपयोग करता है । ( =<<उदाहरण के बजाय उदाहरण के लिए एक सूची में इसके लौटे चरित्र को लपेटने की आवश्यकता mapक्यों है b।)
show gस्ट्रिंग की gसूची का प्रतिनिधित्व करता है , और ++तार को व्यक्त करता है।
- क्योंकि
=<<पहले से कम है ++, कुछ ब्रैकेटिंग की जरूरत है। ()(क्वीन 3 के लिए आरक्षित) का उपयोग करने से बचने के लिए, [...]!!0एक तत्व के साथ एक सूची में अनुक्रमित करता है।
काफी 3
अन्य quines के डिजाइन से, quine 3 में अभी भी कोष्ठक, लंबोदर भाव, वर्ण शाब्दिक और स्ट्रिंग / सूची निर्माणकर्ता तक पहुंच है :। यह एक समारोह है कि निर्माण करने के लिए पर्याप्त होगी पहले जोड़ता एक स्ट्रिंग के लिए Quine के कोड।
दुर्भाग्य से, सभी निचले मामले स्वर (कभी-कभी को छोड़कर y) का उपयोग किया गया है, जिससे कोई उपयोगी अल्फ़ान्यूमेरिक बिलिन फ़ंक्शन नहीं रह गया है। भी []""गए हैं। कोड का बहाना शुरू करने के लिए एक खाली स्ट्रिंग का निर्माण करने का यह कोई सामान्य तरीका नहीं है।
हालाँकि, लगभग सभी बड़े अक्षर अभी भी उपलब्ध हैं, इसलिए LANGUAGEभाषा विस्तार पाने के लिए एक प्रचार संभव है। फिर से सरासर भाग्य, CPP(सक्षम सी पूर्वप्रक्रमक) केवल अपरकेस अक्षरों के साथ नाम का एकमात्र भाषा एक्सटेंशन है। और CPP मैक्रो में अक्सर बड़े नाम होते हैं।
तो आवश्यक खाली स्ट्रिंग प्राप्त करने के लिए, क्वीन सक्षम CPPकरता __TIME__है, फार्म का एक स्ट्रिंग स्थिरांक प्राप्त करने के लिए मैक्रो का उपयोग करता है "??:??:??"(आसानी से हमेशा एक ही लंबाई की गारंटी है), और उस पर पैटर्न मैच।
{-#LANGUAGE CPP#-}(\q(_:_:_:_:_:_:_:_:z)y(#)_->(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z)'\''__TIME__(\(?)v k x->v$k?x)$ \(&)(%)v->v&'{'&'-'&......
भाषा के प्रचार के बाद, क्वीन में एक लैम्बडा अभिव्यक्ति होती है, जो इन मापदंडों को इन चार तर्कों के लिए बाध्य करती है ( _बाद में लागू होने के लिए अंतिम डमी पैरामीटर छोड़कर ):
qकरने के लिए बाध्य '\'', एक एकल उद्धरण चरित्र दे;
_:_:_:_:_:_:_:_:zबाध्य __TIME__, उर्फ एक स्ट्रिंग की तरह "??:??:??", इस प्रकार zएक खाली स्ट्रिंग बनाना;
yसे जुड़ा हुआ है (\(?)v k x->v$k?x), एक लैम्ब्डा कॉम्बीनेटर का उपयोग बाईं संबद्ध ("फोल्डल") से दाईं संबद्ध ("फोल्डर") फॉर्म में आने के लिए क्वाइन डेटा को परिवर्तित करने में मदद करने के लिए किया जाता है;
- ऑपरेटर , क्वीन डेटा को ही
(#)बाध्य \(&)(%)v->v&'{'&'-'&...करता है।
क्वीन डेटा को चर्च एन्कोडिंग के रूप में दिया जाता है, मापदंडों के साथ एक लैम्ब्डा अभिव्यक्ति (&)(%)v।
- एक्सप्रेशन को तुरंत करने के लिए विशेष मानों की अभिव्यक्ति को लागू करके
(&), (%)और vइस एन्कोडिंग का उपयोग या तो क्वीन के मुख्य कोड का निर्माण करने के लिए किया जा सकता है या फिर क्वीन डेटा प्रतिनिधित्व को स्वयं बनाने के लिए।
- हास्केल के डिफ़ॉल्ट निर्धारण नियम के अनुसार,
&और मेमने के %अंदर बाएं सहयोगी संचालक बनें। इस प्रकार वर्ण पैरामीटर vबाईं ओर से आरंभिक जोड़ के साथ संयुक्त हो जाते हैं ।
- अधिकांश पात्रों के लिए
k, एक अनुरूप है &'k'।
- जब
kहै 'या \, जो चरित्र शाब्दिक के अंदर से बचने की जरूरत है, तो इसके बजाय एन्कोडिंग है %'\k'।
चूंकि डेटा एन्कोडिंग को साहचर्य छोड़ दिया जाता है, लेकिन तार एक सही साहचर्य तरीके से निर्मित होते हैं, इसलिए y = (\(?)v k x->v$k?x)कंबाइनेटर को बेमेल पुल को पेश किया जाता है।
y(...)कोन डेटा (&)और (%)ऑपरेटरों के रूप में उपयोग करने के लिए उपयुक्त कार्यों का निर्माण करने का इरादा है ।
vतार से तार तक एक फ़ंक्शन है (क्वीन डेटा के इच्छित vउदाहरण हैं)।
kएक चरित्र, xएक स्ट्रिंग और ?एक ऑपरेटर है जो उन्हें एक नए स्ट्रिंग में जोड़ता है। (कोर कोड के (?)=(:)लिए। वास्तव में क्वीन डेटा प्रतिनिधित्व के पुनर्निर्माण के लिए, यह अधिक जटिल है।)
- इस प्रकार
y(?)v k = \x->v$k?xतार से तार तक एक और कार्य है।
यह कैसे परिवर्तनशीलता का एक उदाहरण के रूप में, यदि (&)=y(:):
(v&k1&k2&k3) x
= (((v&k1)&k2)&k3) x
= y(:)(y(:)(y(:)v k1)k2)k3 x
= y(:)(y(:)v k1)k2 (k3:x)
= y(:)v k1 (k2:(k3:x))
= v (k1:(k2:(k3:x)))
= v (k1:k2:k3:x)
आमतौर पर, जब (#)क्वीन डेटा फ़ंक्शन होता है और f1,f2स्ट्रिंग के साथ वर्णों के संयोजन के कार्य होते हैं:
(y(f1)#y(f2)$v) x
= (...(y(f1)(y(f1)v '{') '-')...) x
= v(f1 '{' (f1 '-' (... x)))
साथ (&)=y(f1)और (%)=y(f2), और यह निर्धारित डेटा का उपयोग करता है f1और f2साथ में डेटा के वर्णों को संयोजित करने के लिए x, और फिर परिणामी स्ट्रिंग को पास करता है v।
मुख्य मेमने की अभिव्यक्ति का शरीर यह सब एक साथ रखता है:
(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z
'&':q:k:q:xएक चरित्र के लिए kपहले जोड़ता है &'k'स्ट्रिंग के लिए xहै, जबकि '%':q:'\\':k:q:xपहले जोड़ता है %'\k', जो उनके मूल Quine डेटा रूप हैं।
- इस प्रकार
y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x, क्वीन डेटा प्रतिनिधित्व के पुनर्निर्माण के लिए सही मानदंड हैं, जो अंतिम z(खाली स्ट्रिंग) से जुड़ा हुआ है , और फिर निम्नलिखित फ़ंक्शन पर पारित किया गया।
y(:)#y(:) अन्य संशोधन के बिना, एक स्ट्रिंग के लिए क्वीन के कोर कोड को प्रस्तुत करने के लिए सही पैरामीटर हैं।
- अंत में
\x->x, निर्माण की गई क्वाइन के साथ कुछ भी नहीं करने के लिए मिलता है, जिसे वापस कर दिया जाता है।