স্ব-বিভাজন কর্মসূচি


16

সহজ কথায় বলতে গেলে আপনার লক্ষ্য হ'ল একটি সম্পূর্ণ প্রোগ্রাম তৈরি করা যা উত্সের প্রতিটি চরিত্র যেমন শুরু হয়েছিল তার থেকে আলাদা না হওয়া পর্যন্ত তার নিজস্ব উত্স কোডকে পরিবর্তন করে।

আপনার পোস্টে প্রারম্ভিক উত্সের পাশাপাশি শেষের উত্স পাশাপাশি একটি বিবরণ অন্তর্ভুক্ত করুন। যেমন আপনার প্রোগ্রামটি (অন্য) কী করে, আপনি যে ভাষাটি ব্যবহার করেছেন, আপনার কৌশল ইত্যাদি বর্ণনা করুন

বিধি

  • পরিবর্তনটি সম্পূর্ণ হওয়ার পরে আপনার প্রোগ্রামটি অবশ্যই থামবে।
  • এটি অবশ্যই এটির নিজস্ব, বর্তমানে চলমান উত্স কোডটি সংশোধন করতে হবে (অগত্যা যে ফাইলটি আপনি দোভাষীকে দিয়েছিলেন, এটি তার নির্দেশাবলীর সংশোধন করে না), কোনও নতুন প্রোগ্রাম মুদ্রণ বা কোনও নতুন ফাইল লিখবেন না।
  • স্ট্যান্ডার্ড লুফোলগুলি অনুমোদিত নয়।
  • সংক্ষিপ্ততম প্রোগ্রামের জয়।

  • যদি আপনার ভাষা তার নিজস্ব ফাইলটি সংশোধন করতে এবং একটি নতুন সংকলক প্রক্রিয়া সম্পাদন করতে পারে তবে তার নিজস্ব (বর্তমানে চলমান) উত্স কোডটি সংশোধন করতে না পারে তবে আপনি 20+ বাইট জরিমানার পরিবর্তে এমন একটি প্রোগ্রাম লিখতে পারেন, বৃত্তাকারটি। বাস্তব স্ব-সংশোধনকারী ভাষাগুলির একটি সুবিধা থাকা উচিত।

সম্পাদনা : যদি আপনার প্রোগ্রামটি ত্রুটিগুলির সাথে থেমে থাকে তবে দয়া করে এটি নির্দিষ্ট করুন (এবং সম্ভবত ত্রুটিগুলি কী তা বলুন))


7
আমি কী সঠিকভাবে বুঝতে পারি যে প্রোগ্রামটি চলাকালীন তার নিজস্ব উত্সটি এমনভাবে পরিবর্তন করা উচিত যা সম্ভাব্যভাবে তার আচরণকে প্রভাবিত করে? এটি বেশিরভাগ অ-গোপনীয় ভাষাকে বাতিল করে দেবে। অথবা এটি উত্সটি সংশোধন করার এবং এটির উপর একটি নতুন দোভাষী / সংকলক প্রক্রিয়া চালু করার অনুমতি রয়েছে?
Zgarb

@ জগারব এটি অবশ্যই তার নিজস্ব, বর্তমানে চলমান উত্স কোডটি পরিবর্তন করতে হবে। হ্যাঁ, এটি বেশিরভাগ ভাষাকেই নিয়ম করে দেয়।
mbomb007

8
@ mbomb007 এটি খারাপ।
mınxomaτ

1
@ mbomb007 এটি এর পরিবর্তিত উত্স কোডটি চালাতে হবে বলে আপনার চ্যালেঞ্জের কোথাও নেই।
mınxomaτ

1
এছাড়াও, না এটি এই চ্যালেঞ্জকে তুচ্ছ করে তোলে না, এটি এখনও ভালভাবেই বিস্তৃত হবে। আপনি এটি দিয়ে খুব বেশি ভাষা প্রত্যাখ্যান করেছেন।
mınxomaτ

উত্তর:


19

/// , 1 বাইট

/

প্রোগ্রামটি একটি /(একটি প্যাটার্ন-রিপ্লেসমেন্ট গ্রুপের শুরু) সন্ধান করে এবং প্রতিস্থাপনটি করার প্রস্তুতিতে এটি সরিয়ে দেয়। তারপরে এটি ইওএফ পৌঁছে যায়, তাই এটি ছেড়ে দেয় এবং থামে।


এটি 1 বাইট সহ প্রথম দিকের উত্তর, তাই এটি বিজয়ী।
mbomb007

22

গোলকধাঁধা , 2 বাইট

>@

>Rotates উৎস যাতে এটি হয়ে

@>

নির্দেশ পয়েন্টারটি এখন একটি শেষ প্রান্তে রয়েছে এবং এটিতে আঘাত করতে ঘুরিয়ে দেয় @ প্রোগ্রামটি বন্ধ করে দেয়।

অবশ্যই, <@কাজ করবে।


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"কোডের স্ট্রিংটি আসলে 'কোড' এর অংশ নয়, এটি কেবল একটি ধ্রুবক যা বাইটোকোডে উল্লেখ করা হয়েছে। আমি আসলে যা পরিবর্তন করছি তা হল সংকীর্ণ পাইথন ভার্চুয়াল মেশিন অপকডগুলি, ধ্রুবক বা ভেরিয়েবলগুলি নয়। সুতরাং আমি যা পরিবর্তন করছি তা প্রতি কোডের উত্স কোড নয়, কেবল সংকলিত কোড। আমি সঞ্চিত হিসাবে উত্স কোডটি পরিবর্তন করতে পারতাম তবে রানটাইমে কোডটি আসলে প্রভাবিত করতে পারে না কারণ এটি ইতিমধ্যে সংকলিত হত। আপনি যদি চাইতেন তবে আমি এটি একটি 'পাইপথন পাইথন ২.7 অপকডের সাথে ধ্রুবকগুলির সাথে পোস্ট করতে পারি' তবে এটি নির্বোধ আইএমও হবে।
নীল

এবং এছাড়াও, আমি সংকলিত কোডটি দেখতে পাচ্ছি না কারণ ভিতরে এটি দেখার জন্য এটি পরিবর্তন করে আমি আসলে কোডটি পরিবর্তন করছি, মানে আমি কোডটি আসলে দেখি না। সুতরাং সত্যিই, কোডটি আসলে প্রতিটি চরিত্রের পরিবর্তে আমার কোনও ধারণা নেই, কেবল এটির মধ্যে সবচেয়ে বেশি (?) পরিবর্তন হয়
ব্লু

সংকলিত কোডে 1টির পরিবর্তন করা হচ্ছে না এর ইস্যুটি পেতে আপনি আরও 2 বাইটের জন্য পরিবর্তন করতে "1"পারেন<backtick>1+1<backtick>
মেগো

আমি দেখতে পাচ্ছি না (2.7.10 দিয়ে সংকলিত)। দুর্ভাগ্যক্রমে, 1+1আমার পরামর্শটি 2সংকলিত সংস্করণে রূপান্তরিত হয় ... সংকলকটি তার নিজস্ব ভালোর জন্য খুব স্মার্ট!
মেগো

11

অশুভ , 1 বাইট

q

অশুভের বেশ কয়েকটি মেমরি স্টোর রয়েছে - একটি হ'ল উত্স কোড নিজেই এবং একটি হুইল যা একটি বৃত্তাকার সারি যা একক শূন্যে শুরু হয়। qউত্স কোড এবং চক্রটি অদলবদল করে, তাই এটি উত্সকে নাল-বাইট দ্বারা প্রতিস্থাপন করে। তবে কেবলমাত্র নিম্ন-অক্ষরের অক্ষরগুলিই হ'ল দুষ্টু প্রকৃতির অপারেটর, সুতরাং সেই চরিত্রটি কেবল একটি অনিচ্ছাই এবং প্রোগ্রামটি সমাপ্ত হয়।


6

এমএসএম , 8 বাইট

'.qp.;.;

উত্স কোডটিতে রূপান্তর করে pqpqpqpq

এমএসএম স্ট্রিংয়ের তালিকায় কাজ করে। কমান্ডগুলি বাম থেকে নেওয়া হয় এবং তারা ডান দিকটিকে স্ট্যাক হিসাবে বিবেচনা করে। এমএসএম সর্বদা এটির নিজস্ব উত্সে কাজ করে।

এক্সিকিউশন ট্রেস:

'.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

মালবোলজ, 1 বা 2 বাইট

D

ম্যালবলেজ ভাষা প্রতিটি নির্দেশ কার্যকর করার পরে "এনক্রিপ্ট করে", সুতরাং এই চিঠিটি (মালবোলজ এনওপি) একটি হয়ে উঠবে !(যা একটি নওও), এবং তারপরে সমাপ্ত হবে। কোনও কারণে, আমি যে মলবোলজ দোভাষী ব্যবহার করি তার জন্য চালানোর জন্য দুটি বাইট প্রয়োজন, DC(উভয়ই নোপ হয়) হয়ে যায় !U(উভয়ই নোপ হয়)

সম্পাদনা করুন: ম্যালবোলজ মেমরির প্রাথমিক অবস্থা কোডের শেষ দুটি অক্ষরের উপর নির্ভর করে, তাই এটি একটি অক্ষর প্রোগ্রামের জন্য ভালভাবে সংজ্ঞায়িত হয় না। (যদিও এই কোডটি স্মৃতির প্রাথমিক অবস্থার বিষয়ে চিন্তা করে না)


5

x86 asm - 6 বাইট

নিশ্চিত না যে "যতক্ষণ না উত্সের প্রতিটি চরিত্রটি শুরু হয়েছিল তার থেকে আলাদা" প্রতিটি বাইট, প্রতিটি নিমোনিক বা সাধারণ পরিবর্তনকে বোঝায়। আমি যদি অবৈধ হয় তবে আমি জোরকে একটি রেপ জোরে পরিবর্তন করতে পারি তাই প্রতিটি বিট মান পরিবর্তন করে তবে এই বিশেষ গল্ফ ভাষার তুলনায় কমপক্ষে কিছুটা তুলনীয় থাকার জন্য আরও 6 বাইট সংরক্ষণ করার জন্য এটি না করার আশা করছিলাম।

এই সমস্ত কিছুই হ'ল সিপিকে সি -3 রেটে পরিবর্তন করে আইপের লাইভ ঠিকানা পেয়ে এবং সামনে 5 বাইট জোর করে।

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 বাইট

গল্ফ করা যেতে পারে এবং আমি সম্ভবত পরে আরও কাজ করব work

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

ব্যাখ্যা

প্রোগ্রামটি নিজের মুছে ফেলার জন্য তার টেপের শেষে নিম্নলিখিত কমান্ডগুলি উত্পন্ন করে, তাই টেপটিতে এটি নিম্নলিখিত মানগুলি তৈরি করতে হবে:

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

অস্থায়ী মানের জন্য ব্যবহার করার জন্য 91নাল (যেমন দেখানো হয়েছে _) দিয়ে একটি গোছা তৈরি করুন ।

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

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

ইমাস লিস্প 22 বাইট

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

রিপল থেকে চালান:

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

রেডকোড , 7 বাইট, 1 টি নির্দেশনা (কেবল একটি উদাহরণ। প্রতিযোগিতা নয়)

এটি একটি তুচ্ছ উদাহরণ।

পরবর্তী মেমরির অবস্থানটি নিজের দিকে সরায়, তারপরে থামবে (কারণ পুরো স্মৃতিটি আরম্ভ করা হয়েছে DAT 0 0, যা সঞ্চালনের সময় প্রোগ্রামটি থামিয়ে দেয়))

MOV 1 0

2
আপনি এটিকে বাইটের পরিবর্তে নির্দেশনা হিসাবে গণনা করছেন কেন?
মার্টিন ইন্ডার 19

কারণ আমি জানি না এটি কতটি বাইট। আমি মনে করি এটি মেমরির আকার বা বাস্তবায়নের উপর নির্ভরশীল? ...
mbomb007

4
আমি এটি ASCII অক্ষর দ্বারা গণনা করব যদি আপনি না জানেন যে এটি কীভাবে কার্যকর হয়।
lirtosiast

1
উইকিপিডিয়া পৃষ্ঠা থেকে: প্রতিটি রেডকোড নির্দেশনা ঠিক একটি মেমরি স্লট দখল করে এবং কার্যকর করতে ঠিক একটি চক্র নেয়। ... স্মৃতিটি একটি নির্দেশের ইউনিটে সম্বোধন করা হয়।
mbomb007

3
সমস্ত কোড-গল্ফ পোস্ট বাইটে স্কোর হয়। যেহেতু কোনও রেডকোড মেশিন কোড নেই, তাই আমাদের অবশ্যই "সমাবেশ উত্স" এর অক্ষরগুলি ব্যবহার করতে হবে, এটি কী একত্রিত হয় তা নয়।
lirtosiast

3

পাওয়ারশেল 65 বাইট

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

এমন একটি ফাংশন সংজ্ঞায়িত করুন যা নিজেকে নালায় পুনরায় লিখে দেয়।

এটি একবার মূল্যায়ন করুন এবং এটি নিজেই মুছে ফেলা হয়।

পর্যায়ক্রমে (মেমরি থেকে নিজেকে মুছে ফেলে) 36 বাইট

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

প্রথমে কল করা এটি সরিয়ে দেয় এবং পুনরাবৃত্তির সাথে মূল্যায়নের চেষ্টা করে। অজানা কমান্ড হিসাবে ত্রুটি।


3

মিক্সাল, 6 বাইট (2 টি ট্যাব গণনা করা হচ্ছে)

    STZ    0

প্রোগ্রামটি মেমোরি অবস্থান 0 থেকে শুরু হয় এবং তারপরে 0 মেমরি লোকেশনে 0 লিখেন, এভাবে নিজেই মুছে যায়। যন্ত্রটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়।

এটি ডোনাল্ড নুথের হাইপোথিটিকাল এমআইএক্স কম্পিউটারের জন্য অ্যাসেম্বলি ভাষা যা 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 চরিত্র) যা শেষে বিপরীত হয় তাই চূড়ান্ত 'পি' কমান্ডটি পড়ে (অক্ষর, xpos, ypos) এবং সেই অবস্থানটি সেট করে অক্ষর কোড। প্রথম অক্ষরটি ম্যানুয়ালি '<' হিসাবে সেট করা হয়েছে, যাতে কমান্ড লুপ করার জন্য কোডটি শেষের দিকে '> পি <' হয়ে যায়। তারপরে প্রতিটি অন্যান্য অক্ষর পি অক্ষর সহ একটি '' হিসাবে ওভাররাইট করা হয়। '' আসলে "ASCII CHAR 0" যা কোনও এনওপি নয় এবং পড়লে ত্রুটি দেয়।

এছাড়াও 'পি' কমান্ডের আগে একটি অদ্ভুত (?) সংখ্যার অক্ষর থাকতে হবে অন্যথায় এটি শেষ বারে ফিরে এসে ওভাররাইট করা হবে না ten


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(ছোট হাতের)
pppery

@ পিপ্পেরি এই দু'জন echoলাইন আপ করতে পারবেন না।
ericw31415

তবে সেগুলি আলাদা কেস।
পিপ্পারি


0

(ফাইল সিস্টেম) বেফঞ্জ 98, 46 বাইট

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

নোট করুন যে এই প্রোগ্রামটি একটি ফাইল তৈরি করে এবং পরিচালনা করে a। কিভাবে এটা কাজ করে:

  1. কোডটি একটি ফাইল তৈরি করে aযাতে পুরো কোডটি থাকে (প্রতিটি মাত্রায় 256 টি অক্ষরের বাইরে) একটি স্থানকে উপরের দিকে এবং দুটি বামে স্থানান্তরিত করে।
  2. এই প্রোগ্রামটি তখন aসম্পূর্ণ পংক্তির সামগ্রীর সাথে পুরো লাইনটি প্রতিস্থাপন করে একটি লাইন হিসাবে যুক্ত ফাইলটি পড়েa ফাইলের ।
  3. দ্বিতীয় লাইন, যা আইপি এর সামনে অনুলিপি করা হয়েছিল তা কার্যকর করা হয়
  4. যা aদ্বিতীয় লাইনে ফাইলটি ডানদিকে দুটি স্থান স্থানান্তরিত করে reads

পার্শ্ব প্রতিক্রিয়া হিসাবে, শেষ উত্সের কোডটি বৈধ বেফঞ্জও নয়! (কারণ এতে একক লাইনে ডেটা হিসাবে নিউলাইন রয়েছে)


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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.