सीजाम, ( 58 56 54 48 46 x 2) * 48% = 44.16
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
जो प्रिंट करता है
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
प्रत्येक पंक्ति में गैर-अंतरिक्ष वर्ण दो परस्पर द्वारों के बीच समान रहते हैं।
लेकिन अब वास्तव में मीठा हिस्सा है:
{`"_~"+{_,94\m2/S*a_+\*{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~N/23f/Wf%N*}_`'"#)!*}_~
एक रानी है! :)
इसका परीक्षण यहां करें।
यह काम किस प्रकार करता है
मैं आपको सलाह देता हूं कि आप पहले मेरे अन्य सबमिशन पर स्पष्टीकरण पढ़ें, क्योंकि यह सामान्य रूप से सीजेएम में क्विनिंग की मूल बातें बताता है।
यह थोड़ा पेचीदा मामला है। आपसी क्वीन के लिए, अन्य मामले में, मैं प्रत्येक पंक्ति से पहले या बाद में रिक्त स्थान जोड़कर ब्लॉक के स्ट्रिंग प्रतिनिधित्व को संशोधित करता हूं, और 0 के साथ 0 स्वैप कर रहा हूं, ताकि परिणामी कार्यक्रम रिक्त स्थान को विपरीत छोर पर रखे।
ध्यान दें कि रिक्त स्थान पारस्परिक योग को बिल्कुल प्रभावित नहीं करते हैं। पहले एक में, वे एक ब्लॉक में हैं, जो वास्तव में उपयोग नहीं किया गया है, और दूसरे में वे पूरे कोड के आसपास हैं।
दोनों को मिलाते समय एक नियमित रूप से क्वीन प्राप्त करने के लिए, हमें उस सभी संशोधन को करने से बचने का एक तरीका खोजने की आवश्यकता है। ध्यान दें कि व्हाट्सएप और कोड की संरचना का मतलब है कि दोनों को मिलाकर, हम एक क्वीन की संपूर्णता को दूसरे में सम्मिलित करते हैं। इसलिए यदि हम पूरे संशोधन कोड को एक ब्लॉक में रखते हैं, तो हम उस ब्लॉक को उसकी वास्तविक सामग्री के आधार पर चला सकते हैं।
तो अब मुझे यह ब्लॉक मिल गया है ... आपसी रजाई के लिए, इसमें केवल वह कोड होता है जिसे मैं वास्तव में चलाना चाहता हूं। संयुक्त रानी के लिए, इसमें पूरी तरह से एक बार फिर से एक यादृच्छिक स्थिति में होता है, जिसका कोई मतलब नहीं है ... लेकिन चूंकि यह एक ब्लॉक है, इसलिए यह स्वचालित रूप से नहीं चलता है। तो हम यह निर्धारित कर सकते हैं कि उस ब्लॉक की सामग्री के आधार पर स्ट्रिंग को संशोधित करना है या नहीं। इसके _`'"#)!
लिए जो है। यह ब्लॉक को डुप्लिकेट करता है, इसे एक स्ट्रिंग में परिवर्तित करता है, वर्ण की खोज करता है "
(जो, आपसी रजाई में, केवल ब्लॉक के बाहर दिखाई देता है ) - -1
यदि चरित्र नहीं मिला है तो खोज रिटर्न और अन्यथा एक सकारात्मक पूर्णांक -, परिणाम बढ़ाता है। और इसे तार्किक रूप से नकार देता है। तो अगर एक "
पाया गया था तो 0
यह पैदावार 1
। अब हम बस करते हैं*
, जो एक बार ब्लॉक को निष्पादित करता है, यदि परिणाम 1 था और अन्यथा बिल्कुल नहीं।
अंत में, यह है कि संशोधित कोड कैसे काम करता है:
_,94\m2/S*a_+\*N/23f/Wf%N*
_, "Duplicate the quine string and get its length.";
94\m "Subtract from 94.";
2/ "Divide by two.";
S* "Create a string with that many spaces. This will be
an empty string for the first mutual quine, and contain
23 spaces for the second mutual quine.";
a_+ "Create an array that contains this string twice.";
\* "Join the two copies together with the quine string.";
N/ "Split into lines.";
23f/ "Split each line into halves (23 bytes each).";
Wf% "Reverse the two halves of each line.";
N* "Join with a newline.";
बाउंटी का दावा, (12 x 10) * 48% = 57.6
यह बताता है कि इस कोड को कुछ संशोधनों के साथ बहुत आसानी से अधिक लाइनों में विभाजित किया जा सकता है। हम 2 वर्णों को जोड़ते हैं, एक पंक्ति में 48 प्राप्त करने के लिए, जिसे हम तब आसानी से 8 से विभाजित कर सकते हैं, ताकि हमारे पास कोड के 6 वर्णों और 6 स्थानों के साथ 8 पंक्तियाँ हों। ऐसा करने के लिए हमें कुछ संख्याओं को बदलने और एक ऑपरेटर या दो को पुनर्व्यवस्थित करने की भी आवश्यकता है, इसलिए वे दोनों पंक्तियों में विभाजित नहीं हैं। यह हमें 12 x 8 आकार के साथ एक कार्यशील संस्करण देता है ... एक आवश्यकता से। तो हम सिर्फ दो पंक्तियों को जोड़ते हैं जो कुछ भी नहीं करते हैं (1 धक्का, 1 पॉप, 1 धक्का, 1 पॉप पॉप ...), इसलिए 12 x 10 पर जाएं :
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
पिछले एक के रूप में यह पैदा करता है
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
(साइड नोट: मध्यवर्ती लाइनों पर बाएं और दाएं को बारी-बारी से रखने की आवश्यकता नहीं है, केवल पहली और अंतिम पंक्ति की स्थिति महत्वपूर्ण है। अन्य सभी लाइनों के लिए बाएं और दाएं को मनमाने ढंग से चुना जा सकता है।)
और शुद्ध संयोग के माध्यम से, पूर्ण रानी अभी भी काम करती है:
{`"_~"{`"_~"
+{129X+{129X
$,m2/S$,m2/S
*a_+\**a_+\*
N/6f/1N/6f/1
;1;1;1;1;1;1
;1;1;1;1;1;1
;Wf%N*;Wf%N*
}_`'"#}_`'"#
)!*}_~)!*}_~
(मैं संयोग कहता हूं, क्योंकि जो भाग आंतरिक कोड को निष्पादित नहीं करने का ध्यान रखता है वह अब अजीब तरह से दूसरे क्वीन के साथ मिल जाता है, लेकिन यह अभी भी ठीक काम करने के लिए होता है।)
कहा जा रहा है कि, मैं 1;
अपनी मूल जमावट की ४४ पंक्तियाँ जोड़ सकता था ताकि बाउंटी आवश्यकता को पूरा किया जा सके, लेकिन 12 x 10
एक बहुत अच्छा लगता है। ;)
संपादित करें: हाहा, जब मैंने कहा कि "शुद्ध संयोग" मैं अधिक स्थान पर नहीं हो सकता था। मैंने देखा कि अंतिम क्वीन अब वास्तव में कैसे काम करती है, और यह बिल्कुल हास्यास्पद है। तीन नेस्टेड ब्लॉक हैं (4 वास्तव में, लेकिन अंतर अप्रासंगिक है)। उन 3 ब्लॉकों के अंतरतम का एकमात्र महत्वपूर्ण हिस्सा यह है कि इसमें एक "
(और वह नहीं जो मूल प्रस्तुत में किया गया था, लेकिन बहुत '"
ही इस चरित्र के लिए जाँच करने के लिए अंत में उपयोग किया जाता है)। तो क्वीन की मूल संरचना है:
{`"_~"{`"_~"+{___'"___}_`'"#)!*}_~)!*}_~
आइए इसे विच्छेदित करें:
{`"_~" }_~ "The standard CJam quine.";
{`"_~"+ }_~ "Another CJam quine. Provided it doesn't do
anything in the rest of that block, this
will leave this inner block as a string on
the stack.";
) "Slice the last character off the string.";
! "Negate... this yields 0.";
* "Repeat the string zero times.";
तो यह वास्तव में कुछ अजीब जादू करता है, लेकिन क्योंकि आंतरिक ब्लॉक स्टैक पर एक स्ट्रिंग छोड़ देता है, )!*
ऐसा होता है कि एक खाली स्ट्रिंग में बदल जाता है। एकमात्र शर्त यह है कि आंतरिक ब्लॉक में सामान के बाद +
स्टैक के लिए कुछ भी नहीं किया जाता है, तो आइए उस पर नज़र डालें:
{___'"___} "Push a block which happens to contain
quotes.";
_`'"#)!* "This is from the original code and just
removes the block if it does contain
quotes.";