हास्केल , 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
, निर्माण की गई क्वाइन के साथ कुछ भी नहीं करने के लिए मिलता है, जिसे वापस कर दिया जाता है।