त्रुटि का पता लगाने वाले स्व-मरम्मत कार्यक्रम


14

आपका कार्य एक ऐसा प्रोग्राम बनाना है जहां यदि कोई एक वर्ण हटा दिया जाता है, तो यह पता लगाएगा कि कौन सा वर्ण हटा दिया गया था और फिर हटाए गए वर्ण को अपनी स्रोत फ़ाइल में पुनः सम्मिलित करें।

उदाहरण के लिए, यदि आपका प्रोग्राम है RadiationHardenedऔर इसे संशोधित किया गया है RadiaionHardened, तो आपके प्रोग्राम को आउटपुट करना होगा कि 5 वीं बाइट (0-अनुक्रमित) को संशोधित किया गया था और फिर RadiationHardenedनिष्पादन के तुरंत बाद प्रोग्राम स्रोत होना चाहिए ।

नोट्स और नियम

  • आप मान सकते हैं कि निष्पादन से पहले स्रोत कोड में वास्तव में एक वर्ण हटा दिया गया था। अनमोल कार्यक्रम के लिए व्यवहार अपरिभाषित है।
  • आप मान सकते हैं कि परिवर्तित बाइट को हटा दिया जाएगा, ट्रांसपोज़्ड नहीं, डाला जाएगा या प्रतिस्थापित किया जाएगा।
  • एक ही चरित्र के एक से अधिक रन के मामले में, आप रन के पहले या अंतिम इंडेक्स की रिपोर्ट कर सकते हैं, लेकिन उसके अनुरूप हो, जिसका आप उपयोग करते हैं। उदाहरण के लिए baaadहटाया जा रहा है baad1 या 3 (शून्य अनुक्रमित) की सूचना दे सकता है, लेकिन पूरे कार्यक्रम में समान होना चाहिए।
  • आपको संपूर्ण स्रोत को अपनी फ़ाइल में लिखने की आवश्यकता नहीं है। आपको केवल हटाए गए बाइट को फिर से सम्मिलित करना होगा।
  • विकिरण-कठोर quines के लिए विशिष्ट नियमों के विपरीत, प्रोग्राम के अपने स्रोत कोड को पढ़ने से परिवर्तित बाइट का पता लगाना उचित खेल है।
  • आप किसी भी उचित प्रारूप के माध्यम से परिवर्तित बाइट इंडेक्स को आउटपुट कर सकते हैं। यह 0-अनुक्रमित या 1-अनुक्रमित या किसी अन्य संकेतन के अनुरूप हो। आप एक टेम्पलेट स्ट्रिंग के भीतर भी एक नंबर आउटपुट कर सकते हैं।

यह इसलिए सबसे छोटा कार्यक्रम जीतता है।

सौभाग्य!

EDIT1: प्रतिस्थापन से विलोपन की आवश्यकता को बदल दिया

EDIT2: डुप्लिकेट के रन के लिए जोड़ा गया नियम


4
यह मनमाना विलोपन संभालने की तुलना में बहुत कठिन है । अधिकांश गैर-एसोलैंग स्पष्ट रूप से बाहर हैं ( किसी भी प्रोग्राम को लिखना असंभव है जो किसी भी एक-बाइट संशोधन के तहत वाक्यविन्यास मान्य है )। यहां तक ​​कि Fungeoids को ज्यादातर विफल कर दिया जाता है (वे कुछ भी नहीं कर सकते हैं अगर 0 बाइट को छोड़ दिया गया प्रोग्राम कमांड में बदल जाए )। मैंने सोचा कि शायद दो में से एक आईपी कुछ विखंडन की तरह बच सकता है लेकिन इसकी *कमान सभी आईपी को मार देती है। कार्डिनल या तो ऐसा नहीं कर सकते, क्योंकि @
लिन

इसे उस स्थान में बदल दिया जा सकता है code-challengeजहां प्रत्येक प्रोग्राम को बाइट्स की एक सूची घोषित करने की अनुमति होती है जो विकिरण से सुरक्षित होती हैं (लेकिन - इससे अधिक नहीं - कुल आकार का 50%)। एक साधारण स्कोरिंग प्रणाली प्रत्येक विकिरण-संरक्षित बाइट को 10 बाइट्स या कुछ इस तरह से गिन सकती है।
अरनौलड

(लेकिन यह कुछ तुच्छ और बहुत दिलचस्प जवाब नहीं दे सकता है।)
अरनॉल्ड

1
@JoKing, जब तक यह सुसंगत है, तब तक लापता होने की रिपोर्टिंग ठीक है।
बीफ़स्टर 16

2
"आपको फ़ाइल को एक निश्चित नाम दिया जाना चाहिए और एक विशिष्ट निर्देशिका से चलाया जा सकता है" - सावधान रहें, किसी को बस आवश्यकता हो सकती है कि फ़ाइल नाम सही प्रोग्राम हो ...
ASCII-only

जवाबों:


9

Befunge-98 (FBBI) , 344 296 248 बाइट्स

20020xxnngg33%%!!2200gg''00--3300gg33%%!!4400gg55%%!!22kk++55##rr55kk::00gg\\11pp00gg\\11++11pp22++00::pp00gg\\11++00gg--!!zz!!22**++00::gg00gg8844**--!!55++jj..''gg::00rr00::gg\\--..''220011''0011::''002211''223311''00441144kkppgg11001100::99oo@@

इसे ऑनलाइन आज़माएं!

सत्यापन!

Befunge-98 पहली गूढ़ भाषा है जिसे मैं जान सकता था कि दोनों 2D थे और फ़ाइल आउटपुट थे। यह एक पूर्ण समाधान (एक अनुगामी न्यूलाइन के साथ) एक टैब चरित्र के रूप में नामित फ़ाइल में संग्रहीत है। यह 0-अनुक्रमित के रूप में आउटपुट करता है, और वर्णों के एक समूह में पहला इंडेक्स आउटपुट करता है (हालांकि केवल कभी जोड़े हैं)।

कुछ गोल्फ बनाए जाने हैं, विशेष रूप से कोड में 15 नो-ऑप्स हैं, अब केवल एक ही ऑप! मैं इसे 200 बाइट्स तक या उससे कम करने के लक्ष्य के साथ, इसे छोटा बनाने पर काम करूंगा।


अरे वाह! मुझे नहीं लगता था कि यह संभव था
90

3

Unefunge-98 (PyFunge) , 118 बाइट्स

22xx00##rr33kk::gg\\11--pp22++00ppgg\\11++gg--!!zz!!22**--00gg::gg8844**--!!22++jj##''rr++..gg''2200pp0011--00::99oo@@

इसे ऑनलाइन आज़माएं!

सत्यापन!

अपने Befunge-98 उत्तर को गोल्फ करते हुए, मैंने महसूस किया कि मैं कुछ बाइट्स को Unefunge पर पोर्ट करके बचा सकता हूं, क्योंकि मुझे केवल दो के बजाय एक आयाम के बारे में चिंता करनी होगी। इसने बहुत सारे संभावित शॉर्टकट और गोल्फ भी खोले, जिसने नए समाधान को बहुत छोटा बना दिया ।

स्पष्टीकरण (डी-डुप्लिकेटेड):

2x        Set the delta of the movement to 2
          This means the pointer moves 2 cells every step
          This will also initialise a counter as 2 (unless a 2 has been removed)
  0       Create the cell counter  (This will be stored at cell 0)
   #r     Enter the loop
     3k:                 Create 3 more copies of the counter
        g                Get the cell at the counter's position
         \1-p            Put it in the cell before that position
             2+0p        Add 2 to the counter and put it in cell 0
                 g       Get the cell at the counter's position
                  \1+g   Get the next cell
                      -!z!2*      If they are identical, push two, else 0
                            --    Subtract it from the total counter
                              0g:g84*-!   If the next character is a space
                                       2+j  r   Exit loop
                                         j#'    Else jump back to the start

Once the loop is over
+      Add the negative counter to the total counter
 .     And print
   '20p          Replace the 2 in cell 0 that was overwritten
             o   Write to a file named
            9    Tab
       01-       The cells from -1 to
  g              The total number of cells
              @  And exit the program
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.