स्व-उत्प्रेरण कार्यक्रम


16

सीधे शब्दों में कहें, तो आपका लक्ष्य एक पूर्ण कार्यक्रम बनाना है जो अपने स्वयं के स्रोत कोड को संशोधित करता है जब तक कि स्रोत का प्रत्येक चरित्र इसके द्वारा शुरू किए गए से अलग नहीं होता है।

कृपया अपनी पोस्ट में शुरुआती स्रोत के साथ-साथ अंतिम स्रोत भी शामिल करें, साथ ही विवरण भी। उदाहरण के लिए (और) आपका कार्यक्रम क्या करता है, जिस भाषा का आपने उपयोग किया है, वह आपकी रणनीति, आदि का वर्णन करें।

नियम

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

  • यदि आपकी भाषा अपनी फ़ाइल को संशोधित कर सकती है और एक नई संकलक प्रक्रिया को क्रियान्वित कर सकती है, लेकिन अपने स्वयं के (वर्तमान में चल रहे) स्रोत कोड को संशोधित नहीं कर सकती है, तो आप राउंडेड + + 20% बाइट्स पेनल्टी के बजाय ऐसा प्रोग्राम लिख सकते हैं। वास्तविक स्व-संशोधित भाषाओं का एक फायदा होना चाहिए।

संपादित करें : यदि आपका कार्यक्रम त्रुटियों के साथ रुकता है, तो कृपया इसे इस तरह निर्दिष्ट करें (और शायद कहें कि त्रुटियाँ क्या हैं।)


7
क्या मैं सही ढंग से समझता हूं कि कार्यक्रम को अपने स्वयं के स्रोत को संशोधित करना चाहिए, जबकि यह चल रहा है, इस तरह से संभावित रूप से इसके व्यवहार को प्रभावित करता है? यह अधिकांश गैर-गूढ़ भाषाओं को नियंत्रित करेगा। या इसे स्रोत को संशोधित करने और उस पर एक नया दुभाषिया / संकलक प्रक्रिया शुरू करने की अनुमति है?
जर्बर्ग

@Zgarb यह वास्तव में अपने स्वयं के, वर्तमान में चल रहे स्रोत कोड को संशोधित करना चाहिए। हां, यह नियम अधिकांश भाषाओं पर लागू होता है।
mbomb007

8
@ mbomb007 यह बुरा है।
mınxomaτ

1
@ mbomb007 यह कहता है कि आप कहीं भी चुनौती नहीं देते हैं कि उसे संशोधित स्रोत कोड चलाना होगा।
mınxomaτ

1
इसके अलावा, नहीं, यह इस चुनौती को तुच्छ नहीं बनाता है, यह अभी भी अच्छा होगा। आपने इसके साथ बहुत सी भाषाओं को खारिज कर दिया।
mınxomaτ

जवाबों:


19

/// , 1 बाइट

/

कार्यक्रम एक /(पैटर्न-प्रतिस्थापन समूह की शुरुआत) पाता है , और प्रतिस्थापन बनाने की तैयारी में इसे हटा देता है। फिर यह ईओएफ तक पहुंचता है, इसलिए यह ऊपर और ऊपर जाता है।


1 बाइट के साथ सबसे पुराना उत्तर है, इसलिए यह विजेता है।
mbomb007

22

भूलभुलैया , 2 बाइट्स

>@

>घूमता स्रोत इतना है कि यह हो जाता है

@>

अनुदेश सूचक अब एक मृत अंत में है और हिट करने के लिए चारों ओर मुड़ता है @जो कार्यक्रम को समाप्त करता है।

बेशक, <@यह भी काम करेगा।


12

पायथन 2, 225 बाइट्स

import sys
from ctypes import*
c=sys._getframe().f_code.co_code
i=c_int
p=POINTER
class S(Structure):_fields_=zip("r"*9+"v",(i,c_void_p,i,c_char_p,i,p(i),i,c_long,i,c_char*len(c)))
cast(id(c),p(S)).contents.v=`len([])`*len(c)

अंतिम स्रोत कोड एक स्ट्रिंग है "0" जिसकी लंबाई मूल संकलित कोड ऑब्जेक्ट में बाइट्स की संख्या के बराबर है।

कोड रनिंग कोड ऑब्जेक्ट पाता है sys._getframe().f_code.co_code, और एक संरचना बनाता है जो अजगर स्ट्रिंग वस्तुओं का प्रतिनिधित्व करता है। इसके बाद यह मेमोरी हो जाती है कि कोड वास्तव में लेता है और इसे बदल देता है"0"*len(c)

जब भाग गया, तो प्रोग्राम निम्नलिखित ट्रेसबैक से बाहर निकलता है:

XXX lineno: 7, opcode: 49
Traceback (most recent call last):
  File "main.py", line 7, in <module>
    cast(id(c),p(S)).contents.v=`1+1`*len(c)
SystemError: unknown opcode

इससे पता चलता है कि ओवरराइट सफल रहा और प्रोग्राम की मृत्यु हो गई क्योंकि 0यह वैध ओपकोड नहीं है।

मुझे आश्चर्य है कि यह अजगर में भी संभव है, फ्रेम ऑब्जेक्ट केवल-पढ़े जाते हैं, मैं नए नहीं बना सकता। एकमात्र जटिल चीज जो ऐसा करती है वह एक अपरिवर्तनीय वस्तु (एक स्ट्रिंग) को बदल देती है।


निश्चित नहीं है कि यदि यह उन आवश्यकताओं को पूरा करता है जो हर किसी के चरित्र में भिन्न होनी चाहिए। मूल स्रोत कोड में "1" अभी भी मैंग्ड कोड में "1" होगा ...
डारेल हॉफमैन

वास्तव "1"में, कोड में स्ट्रिंग वास्तव में 'कोड' का हिस्सा नहीं है, यह सिर्फ एक स्थिरांक है जिसे बाइटकोड में संदर्भित किया जाता है। मैं जो वास्तव में बदल रहा हूं वह संकलित अजगर आभासी मशीन ऑपकोड है, न कि स्थिरांक या चर। तो मैं जो बदल रहा हूं वह प्रति स्रोत कोड नहीं है, बस संकलित कोड है। मैं स्रोत कोड को संग्रहीत के रूप में बदल सकता हूं लेकिन यह वास्तव में रनटाइम पर कोड को प्रभावित नहीं करेगा क्योंकि यह पहले से ही संकलित किया गया होगा। यदि आप चाहते हैं, तो मैं इसे 'स्थिरांक के साथ संकलित पायथन 2.7 ऑपकोड' में पोस्ट कर सकता हूं, लेकिन वह आईएमओ होगा।
ब्लू

और भी, मैं संकलित कोड को नहीं देख सकता क्योंकि इसे अंदर देखने के लिए बदलकर, मैं वास्तव में कोड बदल रहा हूं, जिसका अर्थ है कि मैं वास्तव में कोड नहीं देखता हूं। तो वास्तव में, मुझे पता नहीं है कि क्या कोड वास्तव में हर चरित्र को बदल देता है, बस यह कि उनमें से सबसे (?) बदल जाता है
ब्लू

1 संकलित कोड में परिवर्तित नहीं किया जा रहा है समस्या के समाधान के लिए, आप को बदल सकता है "1"के लिए <backtick>1+1<backtick>केवल 2 अधिक बाइट्स के लिए
Mego

ऐसा नहीं है कि मैं देख रहा हूँ (2.7.10 के साथ संकलित)। दुर्भाग्य से, 1+1मेरे सुझाव 2से संकलित संस्करण में बदल जाता है ... संकलक अपने स्वयं के अच्छे के लिए बहुत स्मार्ट है!
Mego

11

बुराई , 1 बाइट

q

बुराई में कई मेमोरी स्टोर होते हैं - एक स्वयं सोर्स कोड होता है और एक वह व्हील होता है जो एक गोलाकार कतार होती है जिसे एक सिंगल जीरो पर आरंभीकृत किया जाता है। qस्रोत कोड और पहिया को स्वैप करता है, इसलिए यह स्रोत को एक अशक्त बाइट के साथ बदल देता है। हालाँकि, केवल लोअर-केस लेटर्स बुराई में वास्तविक ऑपरेटर होते हैं, इसलिए यह चरित्र केवल एक विकल्प नहीं है और कार्यक्रम समाप्त हो जाता है।


6

MSM , 8 बाइट्स

'.qp.;.;

स्रोत कोड को ट्रांसफ़ॉर्म करता है pqpqpqpq

MSM स्ट्रिंग्स की एक सूची पर काम करता है। कमांड को बाईं ओर से लिया जाता है और वे दाईं ओर को एक स्टैक के रूप में मानते हैं। MSM हमेशा अपने स्रोत पर काम करता है।

निष्पादन के निशान:

'.qp.;.;                       upon start the source is implicitly split into a
                               list of single char strings

' . q p . ; . ;                ' takes the next element and pushes it on the stack
    q p . ; . ; .              q is not a command so it's pushed
      p . ; . ; . q            same for p
        . ; . ; . q p          . concats the top and next to top element
          ; . ; . pq           ; duplicates the top element
            . ; . pq pq        concat
              ; . pqpq         dup
                . pqpq pqpq    concat
                  pqpqpqpq     MSM stops when there's only one element left      

6

Malbolge, 1 या 2 बाइट्स।

D

Malbolge भाषा इसे निष्पादित करने के बाद प्रत्येक निर्देश को "एन्क्रिप्ट करता है", इसलिए यह पत्र (Malbolge NOP) एक बन जाएगा !(जो कि एक झपकी भी है), और फिर समाप्त हो जाएगा। किसी कारण के लिए, मैं उपयोग किए जाने वाले मालबॉज दुभाषिया को चलाने के लिए दो बाइट्स की आवश्यकता होती है, DC(दोनों जिनमें से नोड्स हैं) बन रहे हैं !U(दोनों जिनमें से नोड्स भी हैं)

संपादित करें: Malbolge मेमोरी की प्रारंभिक स्थिति कोड के अंतिम दो वर्णों पर निर्भर करती है, इसलिए यह एक वर्ण कार्यक्रमों के लिए अच्छी तरह से परिभाषित नहीं है। (हालांकि यह कोड स्मृति की प्रारंभिक स्थिति की परवाह नहीं करता है)


5

x86 asm - 6 बाइट्स

यह सुनिश्चित नहीं है कि "जब तक कि स्रोत का प्रत्येक चरित्र इससे अलग न हो जाए जैसा कि शुरू हुआ था" प्रत्येक बाइट, प्रत्येक निमोनिक, या आधुनिक संशोधन को संदर्भित करता है। अगर मैं अमान्य हूं तो मैं xor को एक प्रतिनिधि के रूप में बदल सकता हूं, इसलिए प्रत्येक बिट मान बदलता है, लेकिन उम्मीद नहीं कर रहा था कि इन विशेष गोल्फ भाषाओं के लिए कम से कम थोड़ा सा रहने के लिए 6 और बाइट्स बचाएं।

यह सब करता है eip और xoring 5 बाइट्स का लाइव पता प्राप्त करके एक c2 को c3 रिटन में बदलें।

58          | pop eax                        ; store addr of eip in eax
83 70 05 01 | xor dword ptr ds:[eax + 5], 1  ; c2 ^ 1 = c3 = RETN
c2          | retn                           ; leave

5

SMBF , 92 बाइट्स

गोल्फ हो सकता है, और मैं शायद बाद में इस पर और काम करूंगा।

>>+>>+>>+>>+>>+>>+[<-[>+<---]>+++++<<]>>>>>--[>-<++++++]>--->>++>+++++[>------<-]>->>++[<<]<

व्याख्या

कार्यक्रम अपने टेप के अंत में निम्नलिखित कमांड उत्पन्न करता है ताकि खुद को मिटा सकें, इसलिए इसे टेप पर निम्नलिखित मान उत्पन्न करना होगा:

[[-]<]          ASCII: 91 91 45 93 60 93

अस्थायी मूल्यों के लिए उपयोग करने के बीच 91nulls (दिखाए गए _) के साथ, एस का एक गुच्छा बनाएं ।

>>+>>+>>+>>+>>+>>+[<-[>+<---]>+++++<<]

code__91_91_91_91_91_91_
   ^

मतभेदों द्वारा मूल्यों को समायोजित करें

>>>>>--[>-<++++++]>---  Sub 46
>>++                    Add 2
>+++++[>------<-]>-     Sub 31
>>++                    Add 2
[<<]<                   Shift left to the code
code__[_[_-_]_<_]_      Zero out the code
   ^

निष्पादन के बाद टेप सभी शून्य होगा, उत्पन्न कोड के अपवाद के साथ [_[_-_]_<_]

ध्यान दें:

इस कार्यक्रम ने मुझे एहसास दिलाया कि एसएमबीएफ के लिए मेरे पायथन इंटरप्रेटर में बग या दो हैं, और मुझे अभी तक कोई पता नहीं चला है। यह अब तय हो गया है।


4

Emacs Lisp 22 बाइट्स

(defun a()(defun a()))

REPL से चलाएं:

ELISP> (defun a()(defun a()))
a
ELISP> (symbol-function 'a)
(lambda nil
  (defun a nil))

ELISP> (a)
a
ELISP> (symbol-function 'a)
(lambda nil nil)

फंक्शन अब मूल्यांकन करता है nil

वैकल्पिक रूप से (स्वयं को हटाएं) 30 बाइट्स

(defun a()(fmakunbound 'a)(a))

मूल्यांकन और त्रुटियों के रूप में void-function। चलने से पहले फ़ंक्शन मौजूद था।


4

Redcode , 7 बाइट्स, 1 निर्देश (सिर्फ एक उदाहरण। प्रतिस्पर्धा नहीं)

यह एक तुच्छ उदाहरण है।

अगली मेमोरी लोकेशन को अपने ऊपर ले जाता है, फिर रुक जाता है (क्योंकि पूरी मेमोरी को इनिशियलाइज़ किया जाता है DAT 0 0, जो प्रोग्राम को निष्पादित होने पर रोक देता है।)

MOV 1 0

2
आप इसे बाइट्स के बजाय निर्देशों के रूप में क्यों गिन रहे हैं?
मार्टिन एंडर

क्योंकि मुझे नहीं पता कि यह कितने बाइट्स है। मुझे लगता है कि यह स्मृति आकार, या कार्यान्वयन पर निर्भर है? ...
mbomb007

4
यदि आप नहीं जानते कि यह कैसे लागू किया गया है, तो मैं ASCII वर्णों की गणना करूँगा।
lirtosiast

1
विकिपीडिया पृष्ठ से: प्रत्येक Redcode अनुदेश एक मेमोरी स्लॉट पर कब्जा कर लेता है और निष्पादित करने के लिए ठीक एक चक्र लेता है। ... स्मृति को एक निर्देश की इकाइयों में संबोधित किया जाता है।
mbomb007

3
सभी कोड-गोल्फ पोस्ट बाइट्स में बनाए गए हैं। चूंकि कोई रेडकोड ​​मशीन कोड नहीं है, इसलिए हमें "असेंबली सोर्स" में वर्णों का उपयोग करना चाहिए, न कि यह कि यह किससे मिलता है।
lirtosiast

3

पॉवरशेल 65 बाइट्स

function a{si -pat:function:a -va:([scriptblock]::create($null))}

एक फ़ंक्शन को परिभाषित करें जो स्वयं को शून्य करने के लिए फिर से लिखता है।

एक बार इसका मूल्यांकन करें और यह खुद को समाप्त कर देता है।

वैकल्पिक रूप से (मेमोरी से स्वयं को हटाता है) 36 बाइट्स

function a{remove-item function:a;a}

इसे कॉल करना पहले इसे हटा देता है फिर पुनरावर्ती मूल्यांकन करने का प्रयास करता है। एक अज्ञात कमांड के रूप में बाहर निकलना।


3

MIXAL, 6 बाइट्स (2 टैब की गिनती)

    STZ    0

कार्यक्रम स्मृति स्थान 0 पर शुरू होता है और फिर स्मृति स्थान 0 पर लिखता है, इस प्रकार स्वयं को मिटा देता है। मशीन अपने आप रुक जाती है।

यह डोनाल्ड नुथ के काल्पनिक MIX कंप्यूटर के लिए असेंबली भाषा है, जिसे GNU MIX डेवलपमेंट किट ( https://www.gnu.org/software/mdk/ ) का उपयोग करके इकट्ठा और चलाया जा सकता है ।


3

> <> , 40 34 30 बाइट्स

0&00a6*0&1+:&060"c"l=?!.~~r >p

यहाँ यह कोशिश करो!

स्पष्टीकरण:

0&          Adds 0 to the registry
00a6*       Adds "0,0,<" to the stack; coords followed by a character
------------loop start (for clarity)
0           0 added to stack
&1+:&       Registry retrieved, increased by 1, duplicated, one put back in registry
0           ASCII character 0 added to stack (just a 0 but will be converted to that character when inserted in the code)
60          6 and 0 added to stack
"c"         The number 99 added to stack (length of code + 1 * 3)
l=?         Code length added to stack, checks if it is equal to 111

!.          If false, pointer jumps back to character (9,0) (loop start position)
~~r >p      If true, removes the 0 and 9, reverses stack, then loops the p command setting
all the characters to a "<" character and the 2nd character to a " "

मूल रूप से यह स्टैक में 3 वर्ण खंडों का एक गुच्छा रखता है जैसे: (ypos, xpos, ASCII वर्ण) जो अंत में उलट जाता है इसलिए अंतिम 'p' कमांड पढ़ता है (वर्ण, xpos, ypos) और उस स्थिति को सेट करता है उस चरित्र का कोड। पहला वर्ण मैन्युअल रूप से '<' के रूप में सेट किया गया है, ताकि कोड कमांड को लूप करने के लिए अंत में '> p <' हो। फिर हर दूसरे वर्ण को '' अक्षर के रूप में लिखा जाता है, जिसमें p वर्ण भी शामिल है। '' वास्तव में "ASCII CHAR 0" है जो NOP नहीं है और पढ़ने पर एक त्रुटि देगा।

इसके अलावा 'पी' कमांड से पहले एक विषम (?) वर्णों की संख्या होनी चाहिए अन्यथा यह अंतिम समय में वापस लूप हो जाएगा और ओवरराइट हो जाएगा।


2

बैच, 11 बाइट्स

@echo>%0&&*

स्रोत कोड को संशोधित करता है ECHO is on.

@           - don't echo the command.
 echo       - print ECHO is on.
     >%0    - write to own file.
        &&* - execute * command after the above is done, * doesn't exist so program halts.

@वहाँ इतने आदेश प्रतिध्वनित नहीं है, लेकिन ज्यादातर तो दो echoरों लाइन अप नहीं है।


को @हटाया जा सकता है, क्योंकि ECHO(अपरकेस)! = echo(लोअरकेस)
अपरिपक्व

@ppperry दो को पंक्तिबद्ध echoनहीं किया जा सकता।
ericw31415

लेकिन वे अलग-अलग मामले हैं।
पपड़ी


0

(फाइलसिस्टम) Befunge 98, 46 बाइट्स

ff*:1100'aof0'ai
               21f0'ai@

ध्यान दें कि यह प्रोग्राम नाम की फ़ाइल बनाता है और उसमें हेरफेर करता है a। यह काम किस प्रकार करता है:

  1. कोड aसंपूर्ण कोड (प्रत्येक आयाम में 256 वर्णों को छोड़कर) नामक एक फ़ाइल बनाता है, जो एक स्थान को ऊपर की ओर और दो को बाईं ओर स्थानांतरित करता है।
  2. यह प्रोग्राम तब नामित फ़ाइल पढ़ता है a एक लाइन के रूप में , संपूर्ण सामग्री की जगह ले लेता हैa
  3. दूसरी पंक्ति, जिसे आईपी के सामने कॉपी किया गया है, निष्पादित किया जाता है
  4. जो aदूसरी पंक्ति में फ़ाइल को पढ़ता है उसे दाईं ओर दो स्थानों पर स्थानांतरित कर दिया गया है।

एक साइड इफेक्ट के रूप में, अंतिम स्रोत कोड भी मान्य नहीं है Befunge! (क्योंकि इसमें एकल पंक्ति में डेटा के रूप में नई सुर्खियाँ हैं)


0

पायथन 2, 238 बाइट्स + 20% = 285.6

# coding: utf-8
import codecs
with codecs.open(__file__,'r') as f:
    t = f.read()
n="utf-8" if t.startswith("# coding: ascii") else "ascii"
with codecs.open(__file__,'w', encoding=n) as f:
    f.write(t[0]+" coding: "+n+t[t.find("\n"):])

असल में, इस बीच अजगर स्रोत की वर्तमान फ़ाइल इनकोडिंग टॉगल asciiऔर utf-8, इस प्रकार अनिवार्य रूप से स्रोत के हर चरित्र को बदलने!


कुछ अतिरिक्त स्थान हैं जिन्हें हटाया जा सकता है। ) as-> )as, ) else-> )else, "utf-8"if, 'w',encoding
mbomb007
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.