आपसी नकारात्मक विचार


22

यह प्रिंट ऑफ नेगेटिव ऑफ योर कोड और गोल्फ से एक पारस्परिक क्वीन से प्रेरित था


वर्णों की एक आयत पर विचार करें , जो निम्नलिखित प्रतिबंधों को पूरा करती हैं:

  1. केवल मुद्रण योग्य ASCII वर्णों से मिलकर बनता है
  2. 1 से अधिक दोनों आयाम
  3. प्रत्येक पंक्ति और प्रत्येक स्तंभ में कम से कम एक स्थान होता है।
  4. प्रत्येक पंक्ति और प्रत्येक स्तंभ में कम से कम एक गैर-स्थान वर्ण होता है।

उदाहरण के लिए, निम्नलिखित एक मान्य 6x4 आयत है:

%n 2e 
1  g 3
 &* __
 3  

इस आयत के लिए एक नकारात्मक को समान आयामों की एक आयत के रूप में परिभाषित किया गया है, जिसमें सभी स्थान गैर-अंतरिक्ष वर्णों द्वारा प्रतिस्थापित किए गए हैं, और सभी गैर-स्थान वर्ण रिक्त स्थान द्वारा प्रतिस्थापित किए गए हैं। उपरोक्त आयत का एक नकारात्मक हो सकता है:

  f  ^
 33 > 
9  $  
^ }|Q'

किसी स्थान को बदलने के लिए किसी भी गैर-अंतरिक्ष मुद्रण योग्य ASCII वर्ण का उपयोग किया जा सकता है।

कार्य

आपका कार्य आयताकार स्रोत कोड के साथ एक प्रोग्राम लिखना है, जो स्वयं के लिए एक मान्य नकारात्मक आउटपुट करता है। मूल के समान भाषा में नकारात्मक आउटपुट भी एक मान्य प्रोग्राम होना चाहिए, और यह मूल के स्रोत को आउटपुट करना चाहिए।

या तो आउटपुट के अंत में एक एकल अनुगामी न्यूलाइन को छोड़कर, कोई अनुगामी व्हाट्सएप जोड़ा या हटाया नहीं जा सकता है, जो वैकल्पिक है।

किसी भी प्रोग्राम को स्रोत कोड पढ़ने की अनुमति नहीं है; न ही REPL वातावरण ग्रहण किया जा सकता है।

स्कोरिंग

आपका स्कोर आपके कोड के आयामों का उत्पाद है (यानी यदि आपका स्रोत कोड 12 बाई 25 आयत में है, तो आपका स्कोर 12 * 15 = 180 है)। इसके अतिरिक्त, एक टिप्पणी में उपयोग किए गए प्रत्येक चरित्र के लिए, आपका स्कोर 2 से बढ़ जाता है (यदि आप /* .. */अपने कोड में एक बार उपयोग करते हैं, और आपका कोड 10 में 10 आयत है, तो आपका स्कोर 10 * 10 + 8 * 2 = 116 होगा)।

सबसे कम स्कोर जीतता है।

यदि कोई टाई है, तो प्रोग्राम में कम से कम संख्या में रिक्त स्थान के साथ सबमिशन (या तो मूल या नकारात्मक, जो भी कम स्थान है) जीतता है।

यदि अभी भी एक टाई बनी हुई है, तो पहले वाला उत्तर जीत जाएगा।

-52% का बोनस है , अगर मूल और नकारात्मक को एक साथ मिलाकर एक सामान्य क्वीन का उत्पादन होता है। उदाहरण के लिए:

Original   Negative   Combined
 A A       B B        BABA
A A         B B       ABAB

@Optimizer यही कारण है कि मैंने बोनस को अनिवार्य नहीं किया।
es1024

1
मैं सिर्फ नकारात्मक आपसी क्वीन भाग के बारे में बात कर रहा हूं;)
ऑप्टिमाइज़र

@ मार्टिनबटनर आह, मेरा बुरा। मैं अजीब तरह से सोच रहा था।
ऑप्टिमाइज़र

1
क्या कोई ग में ऐसा कर सकता है? +1 जो कोई भी पहले करेगा!
मेगाटॉम

जवाबों:


15

सीजाम, ( 51 49 47 46 45 42 x 2) * 48% = 40.32

{])"_~"+S41*'R+@,[{N@S}{SN@}{W=N]_}]=~}_~ 
                                         R

उपरोक्त कोड चलाने से यह आउटपुट मिलता है:

                                         R
{])"_~"+S41*'R+@,[{N@S}{SN@}{W=N]_}]=~}_~ 

जो चल रहा है, मूल स्रोत को वापस प्रिंट करता है।

स्रोत और आउटपुट बस स्वैप की गई लाइनें हैं।

अब जादू आता है।

निम्न कोड में स्रोत और आउटपुट परिणाम को ओवरलैप करने पर:

{])"_~"+S41*'R+@,[{N@S}{SN@}{W=N]_}]=~}_~R
{])"_~"+S41*'R+@,[{N@S}{SN@}{W=N]_}]=~}_~R

जो एक आदर्श रानी है!

उन्हें यहाँ ऑनलाइन प्रयास करें


यह काम किस प्रकार करता है

सभी मुद्रण तर्क पहली पंक्ति में ही हैं जो बाद में बताए गए सभी तीन मामलों को संभालते हैं।

{])"_~"+S41*'R+@,[{N@S}{SN@}{W=N]_}]=~}_~
{                                     }_~   "Copy this code block and execute the copy";
 ]                                          "Wrap everything before it in array";
  )                                         "Pop the last element out of it";
   "_~"+                                    "Append string '_~' to the copied code block";
        S41*                                "Create a string of 41 spaces";
            'R+                             "Append character R to it";
               @,                           "Rotate the array to top and get its length";
                 [{   }{   }{     }]=~      "Get the corresponding element from this"
                                            "array and execute it";

ऊपर अंतिम पंक्ति का सरणी वह सरणी है जिसमें तीनों मामलों के अनुरूप कोड ब्लॉक होते हैं।

मामला एक

{])"_~"+S41*'R+@,[{N@S}{SN@}{W=N]_}]=~}_~ 
                                         R

इस मामले में, शेष स्टैक की लंबाई 0 थी जब ब्लॉक निष्पादित किया गया था, तो इसमें केवल ब्लॉक की प्रतिलिपि ही थी, जो शुरू में ऊपर तीसरे चरण में पॉप आउट हुई थी। इसलिए हम 0पिछले सरणी से सूचकांक लेते हैं और इसे निष्पादित करते हैं:

 {N@S}          "Note that at this point, the stack is something like:"
                "[[<code block that was copied> '_ '~ ] <41 spaces and R string>]";
  N             "Add newline to stack";
   @            "Rotate the code block to top of stack";
    S           "Put a trailing space which negates the original R";

इस मामले में, दूसरी पंक्ति एक सेशन नहीं है जहां तक ​​आउटपुट को प्रिंट करने का संबंध है।

केस 2

                                         R
{])"_~"+S41*'R+@,[{N@S}{SN@}{W=N]_}]=~}_~ 

इस स्थिति में, स्टैक में पहले से ही एक खाली स्ट्रिंग होती है, इसलिए जब कॉपी किए गए कोड ब्लॉक को निष्पादित किया गया था, तो इसमें 2 तत्व थे - एक खाली स्ट्रिंग और कोड ब्लॉक ही। इसलिए हम 1पिछले सरणी से सूचकांक लेते हैं और इसे निष्पादित करते हैं:

{SN@}            "Note at this point, the stack is same as in case 1";
 SN              "Push space and newline to stack";
   @             "Rotate last three elements to bring the 41 spaces and R string to top";

केस 3

{])"_~"+S41*'R+@,[{N@S}{SN@}{W=N]_}]=~}_~R
{])"_~"+S41*'R+@,[{N@S}{SN@}{W=N]_}]=~}_~R

इस मामले में, स्टैक में 6 तत्व हैं। इसलिए आखिरी कोड ब्लॉक करने के बाद, शेष सरणी लंबाई 5. हम सूचकांक 5को सरणी से बाहर निकालते हैं और इसे निष्पादित करते हैं। (ध्यान दें कि 3तत्वों की एक सरणी में , सूचकांक 5सूचकांक है 5%3 = 2)

{W=N]_}          "Note at this point, the stack is same as in case 1";
 W=              "Take the last character out of the 41 spaces and R string, i.e. R";
   N]            "Add a new line to stack and wrap the stack in an array";
     _           "Copy the array to get back the source of Case 3 itself";

27

पायथन, 97x2 + 2 = 196

शुरू करने के लिए एक महान समाधान नहीं है, लेकिन कम से कम यह काम करता है (मुझे लगता है)।

c='o=1-%d;print("%%97s\\n%%97s"%%("#","c=%%r;exec(c%%%%%%d)\\40"%%(c,o),"#")[o:][:2])';exec(c%1) 
                                                                                                #

आउटपुट:

                                                                                                #
c='o=1-%d;print("%%97s\\n%%97s"%%("#","c=%%r;exec(c%%%%%%d)\\40"%%(c,o),"#")[o:][:2])';exec(c%0) 

8
एक असली भाषा का उपयोग करने के लिए अब तक केवल एक ही सबमिशन के लिए +1
विन्नीएनक्लॉस

यह बोनस से बहुत दूर प्रतीत नहीं होता है।
mbomb007

23

सीजाम, ( 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.";


क्या यह Y/2संयुक्त कुनबे में नहीं होना चाहिए ?
श्नाडर

"और शुद्ध संयोग के माध्यम से" नाह;)
टिमटेक

@Timtech मेरा संपादन देखें। शुद्ध संयोग एक समझ नहीं था। ^ ^
मार्टिन एंडर

10

CJam, 42 37 33 x 2 = 66

{`As_W%er"_~"+S 33*F'Lt1{\}*N\}_~
               L                 

जो प्रिंट करता है

               L                 
{`As_W%er"_~"+S 33*F'Lt0{\}*N\}_~

(लाइनों की अदला-बदली की जाती है, और एक में 1बदल जाता है 0।)

इसका परीक्षण यहां करें।

यह काम किस प्रकार करता है

सबसे पहले, आपको बुनियादी सीजेम क्वीन को समझना चाहिए:

{"_~"}_~

ब्रेसिज़ केवल एक फ़ंक्शन की तरह कोड के एक ब्लॉक को परिभाषित करते हैं, जिसे तुरंत निष्पादित नहीं किया जाता है। यदि कोई अनएक्सपेक्टेड ब्लॉक स्टैक पर रहता है, तो यह सोर्स कोड (ब्रेसेस सहित) प्रिंट होता है। _ब्लॉक को डुप्लिकेट करता है, और ~दूसरी कॉपी निष्पादित करता है। ब्लॉक ही स्ट्रिंग युक्त पुश करता है _~। तो यह कोड, स्टैक को निम्न अवस्था में छोड़ देता है:

Stack: [{"_~"} "_~"]

ब्लॉक और स्ट्रिंग को प्रोग्राम के अंत में बैक-टू-बैक प्रिंट किया जाता है, जो इसे एक क्वीन बनाता है।

इसका सौंदर्य यह है कि हम ब्लॉक में जो चाहें कर सकते हैं, और यह एक कुनैन बनी हुई है, क्योंकि कोड का प्रत्येक टुकड़ा स्वचालित रूप से ब्लॉक सामग्री में मुद्रित किया जाएगा। हम ब्लॉक को संशोधित कर सकते हैं, इसे स्ट्रिंग प्रतिनिधित्व के साथ प्राप्त कर सकते हैं `(जो ब्रेसिज़ के साथ ब्लॉक का एक स्ट्रिंग है)।

अब इस समाधान को देखें। ध्यान दें कि आपसी क्वीन के किसी भी भाग में क्वीन जैसा ब्लॉक होता है _~, और ए LLकोई रिक्त स्ट्रिंग ढेर है, जो उत्पादन के लिए योगदान नहीं करता पर धक्का। तो यहाँ है कि ब्लॉक क्या करता है:

`                             "Convert block to its string representation.";
 As                           "Push 10 and convert to string.";
   _W%                        "Duplicate and reverse, to get another string 01.";
      er                      "Swap 0s and 1s in the block string.";
        "_~"+                 "Append _~.";
             S 33*            "Push a string with 33 spaces.";
                  F'Lt        "Set the character at index 15 to L.";
                      1{ }*   "Repeat this block once.";
                        \     "Swap the code string and the space string.";
                           N\ "Push a newline and move it between the two lines.";

तो यह क्वीन भाग करेगा, लेकिन 0 के लिए 1 का आदान-प्रदान करेगा, और यह एक और लाइन के साथ एक प्रीपेंड करेगा L, जहां ऊपर दिए गए कोड में एक स्थान है। पकड़ यह है कि उन दो लाइनों का क्रम अंदर स्वैपिंग द्वारा निर्धारित किया जाता है { }*। और चूँकि आपसी क्वीन के बाहरी भाग की 0जगह इसके सामने होती है 1, यह कभी भी इस स्वैप को अंजाम नहीं देता है, और इसलिए फिर से मूल आदेश का उत्पादन करता है।


5

सीजाम, 27 × 2 = 54

{ ` " _ ~ " + N - ) 2 * ' '
 > @ t s G B + / N * } _ ~ 

आउटपुट:

 { ` " _ ~ " + N - ) 2 * ' 
' > @ t s G B + / N * } _ ~

'A'B>वर्ण A और B की तुलना ' '\n >1 करता है क्योंकि 32> 10 और ' \n' >रिटर्न 0 है क्योंकि दोनों रिक्त स्थान समान हैं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.