এনট্রপিক কুইন!


12

আপনার কাজটি একটি প্রোগ্রাম বা ফাংশন লিখতে হয় যা:

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

    প্রথম মৃত্যুদন্ডের পর আপনার প্রোগ্রাম হবে না অগত্যা আর একটি quine হতে; আউটপুট পরিবর্তন হয়ে যাবে (এবং প্রোগ্রামটি নিজেও পরিবর্তন করতে মুক্ত) free

উদাহরণস্বরূপ, যদি আপনার রাইনটি ছিল ABCD, বারবার এটি চালানো মুদ্রণ করতে পারে:

ABCD
A!CD
j!CD
j!CjD

বিশেষ উল্লেখ

  • একটি চরিত্র পরিবর্তন হয়:

    • একটি এলোমেলো চরিত্রের সন্নিবেশ,
    • একটি এলোমেলো অক্ষর মুছে ফেলা, বা
    • একটি নতুন এলোমেলো চরিত্রের সাথে একটি অক্ষরের প্রতিস্থাপন। মনে রাখবেন যে নতুন চরিত্রটি তার পরিবর্তিত স্থানের মতোই হওয়ার অনুমতি দেওয়া হয়েছে, এক্ষেত্রে কোনও পরিবর্তন আনা হবে না।

    অবশ্যই, একটি খালি স্ট্রিং থেকে একটি অক্ষর মুছে ফেলা বা প্রতিস্থাপন বৈধ পরিবর্তন নয়।

  • এটি ট্যাগ হওয়া হওয়া সত্ত্বেও , আপনার উত্স কোডটি পড়ার বিরুদ্ধে বিধিগুলি প্রযোজ্য নয়।

আপনি যে কোনও অক্ষর সেটটি ব্যবহার করতে পারেন যতক্ষণ না এতে আপনার উত্স কোডে ব্যবহৃত অক্ষরগুলি অন্তর্ভুক্ত থাকে।


1
প্রতিটি চরিত্র কোন চরিত্রকে বোঝায়?
ডেনিস

2
এটি কত ঘন ঘন কাজ করে? স্পষ্টতই এটি নির্বিচারে প্রায়শই বা অন্যথায় মূল প্রোগ্রামের চেয়ে বেশি বা দীর্ঘতর প্রতিটি সম্ভাব্য প্রোগ্রাম চ্যালেঞ্জের সমাধান হতে হবে can't
মার্টিন ইন্ডার

1
চরিত্রটি কোথাও যুক্ত করা যাবে, বা ঠিক শেষে?
কনর ও'ব্রায়েন

1
@ কনরও ব্রায়ান যে কোনও জায়গায়।
ফলটি Esolanging

1
এটির কতটি পুনরাবৃত্তি কাজ করতে পারে?
dylnan

উত্তর:


7

পাইথন 3 , 288 270 224 212 195 196 194 180 178 168 বাইট

f=__file__
m=open(f).read()
x=m	
print(end=x)
h=hash
k=h(f)
n=k%2
a=h(m)%-~len(x)
x=x[:a]+(not(k%3)*x)*chr(k%127)+x[a+n:]
open(f,'w').write(m.replace("\t",";x=%r\t"%x))

এটি অনলাইন চেষ্টা করুন!

প্রথম পুনরাবৃত্তিতে ফাইল উত্স কোড মুদ্রণের পরে, আমরা এম পরিবর্তে নতুন উত্স কোডে এক্স সেট করতে একটি অতিরিক্ত লাইন যুক্ত করব।

ব্যাখ্যা:

f=__file__    #Open and read the source code
m=open(f).read()

x=m       #Set x to the source code for the first iteration
x="..."
...
x="..."   #Set x to the latest iteration
          #On the last iteration there's a tab character to mark progress
print(end=x)    #Print the previous iteration's text

#Modify the text
h=hash
k=h(f)            #Generate a random number to use
n=k%2             #Whether the character will be inserted or changed/deleted
a=h(m)%-~len(x) #The index of the change
                         #Add 1 to the range to append new characters, and to avoid mod by 0 in the case of an empty string
x=x[:a]+(not(k%3)*x)*chr(k%127)+x[a+n:]    #Make the change

open(f,'w').write(m.replace("\t",";x=%r\t"%x))   #Modify the source code, adding the new iteration of the source code

ধরে hashনিই একটি অভিন্ন এলোমেলো সংখ্যা প্রদান করে, একটি নতুন চরিত্র সন্নিবেশ করার প্রায় 1/6 সম্ভাবনা, বিদ্যমান অক্ষরটি পরিবর্তনের 1/6 সম্ভাবনা এবং একটি অক্ষর মুছার 2/6 সম্ভাবনা রয়েছে। আপনি জিজ্ঞাসা বাকি 2/6 সুযোগ কি? কেন, এটি সময়ের 2/6 এ কিছুই করে না!

(এখানে একটি বৈধতা থেকে অভিযোজিত প্রোগ্রাম mbomb007 এর উত্তর এরএটি অনলাইন ব্যবহার করে দেখুন! )


আমি মনে করি f=__file__প্রথম পদক্ষেপেও সহায়তা করবে।
janrjan জোহানসেন

4

পাইথন 3 , 205 195 বাইট

s='print(end=x);h=hash;k=h(x);n=k%2;a=h(s)%-~len(x);x=x[:a]+(not(k%3)*x)*chr(k%127)+x[a+n:];open(__file__,"w").write("s=%r;x=%r;exec(s)"%(s,x))';x='s=%r;x=%r;x=x%%(s,x);exec(s)';x=x%(s,x);exec(s)

এটি অনলাইন চেষ্টা করুন!

এমন কোনও সংস্করণ চেষ্টা করতে চেয়েছিল যা উত্স কোডটি না পড়ে। যেমন আমি ভেবেছিলাম একটি খারাপ নিষ্কাশিত, এবং এটি মাত্র 30 তাই বা পিছনে বাইট সংস্করণ যে করে । এটি কীভাবে কাজ করে তার ব্যাখ্যাটি বেশিরভাগ ক্ষেত্রে অন্য উত্তরের মতো, তবে এটি x আলাদাভাবে সূচনা করে কারণ এটি কেবল উত্স কোডটি পড়তে পারে না।


4

পাইথন 2 , 779 801 বাইট

আপনার উত্সটি পড়ার অনুমতি রয়েছে তা দেখানোর জন্য চ্যালেঞ্জটি সম্পাদনা করা হলেও আমি ইতিমধ্যে এটি ছাড়াই আমার সমাধান তৈরি করেছিলাম। সুতরাং, এটি সম্ভব তা দেখাতে, আমি এটি শেষ করেছি। উত্স ফাইলটি পড়া হয়নি:

s='s=%r;print s%%s\nfrom random import*;L=4;f=open(__file__,"wa"[L>5]);R=randint\nf.write("\\n".join((s%%s).split("\\n")[1:5:2]).replace("4",`map(ord,s%%s)`))\nif L>5:exec\'b=[];h=%%d\\nwhile~-h:b+=[h%%%%1000];h/=1000\\nwhile b:r,p,n=b[-3:];b=b[:-3];L=[L[:p]+L[p+1:],L[:p]+[r]+L[p+n:]][n<2if L else 1]\\nprint"".join(map(chr,L))\'%%1\n\nn=R(0,2);p=R(0,len(L if L>5else s%%s));r=R(0,255);f.write("%%03d"*3%%(n,p,r))';print s%s
from random import*;L=4;f=open(__file__,"wa"[L>5]);R=randint
f.write("\n".join((s%s).split("\n")[1:5:2]).replace("4",`map(ord,s%s)`))
if L>5:exec'b=[];h=%d\nwhile~-h:b+=[h%%1000];h/=1000\nwhile b:r,p,n=b[-3:];b=b[:-3];L=[L[:p]+L[p+1:],L[:p]+[r]+L[p+n:]][n<2if L else 1]\nprint"".join(map(chr,L))'%1

n=R(0,2);p=R(0,len(L if L>5else s%s));r=R(0,255);f.write("%03d"*3%(n,p,r))

এটি অনলাইন চেষ্টা করুন! (দ্রষ্টব্য যে এটি উত্সটি পরিবর্তন করবে না work এটি কাজ করার জন্য আপনাকে এটিকে স্থানীয়ভাবে চালাতে হবে)

রূপান্তরগুলি কাজ করে তা দেখানোর জন্য, এখানে একটি পরীক্ষা প্রোগ্রাম রয়েছে (বর্তমানে সর্বদা 100জন্য চয়ন করার জন্য সেটআপ করা হয়েছে r, এবং এটি প্রতিটি তালিকার সংমিশ্রণের জন্য nএবং pপ্রাথমিক তালিকার জন্য ফলাফল মুদ্রণ করে ))



ব্যাখ্যা:

s='s=%r;print s%%s...';print s%s...

প্রথম লাইনটি আপনার ক্লাসিক কুইন, তবে এর পরে কী হবে তার জন্য অ্যাকাউন্ট করতে অনেক বেশি সময় লাগবে।

from random import*;L=4;f=open(__file__,"wa"[L>5]);R=randint

র্যান্ডম পূর্ণসংখ্যার জন্য আমদানি করুন। Lউত্স কোডের অর্ডিনালের তালিকায় পরিণত হবে, তবে প্রাথমিকভাবে এটি একটি পূর্ণসংখ্যা যা উত্সের অন্য কোথাও ব্যবহৃত হয় না স্ট্রিং প্রতিস্থাপনের জন্য অনুমতি দেয়। নতুন উত্স লিখতে ফাইলটি খুলুন। পরে চালানো হয়, এটি পরিবর্তে সংযোজনে খুলবে।

f.write("\n".join((s%s).split("\n")[1:5:2]).replace("4",`map(ord,s%s)`))

কোডের প্রথম এবং তৃতীয় লাইনগুলি সরান। 4অধ্যক্ষগুলির তালিকা সহ উপরেরটি প্রতিস্থাপন করুন ।

if L>5:exec'b=[];h=%d\nwhile~-h:b+=[h%%1000];h/=1000\nwhile b:r,p,n=b[-3:];b=b[:-3];L=[L[:p]+L[p+1:],L[:p]+[r]+L[p+n:]][n<2if L else 1]\nprint"".join(map(chr,L))'%1

n=R(0,2);p=R(0,len(L if L>5else s%s));r=R(0,255);f.write("%03d"*3%(n,p,r))

টুকরো:

  • if L>5:- প্রথম নির্বাহের সময় এই লাইনটি এড়িয়ে যায়। পরে, Lএকটি তালিকা হবে, এবং এই চলবে। আমি execশেষটি ব্যাখ্যা করব , কারণ এটি প্রথমবার চালানো হয়নি।

  • n- একটি এলোমেলো সংখ্যা 0-2। এটি নির্ধারণ করে যে কোন পরিবর্তনটি ঘটে (0 = sertোকান, 1 = প্রতিস্থাপন করুন, 2 = মুছুন)।

  • p - তালিকার একটি এলোমেলো অবস্থান যা পরিবর্তনটি ঘটবে।

  • r - তালিকায় orোকানো বা প্রতিস্থাপনের জন্য একটি এলোমেলো নম্বর

  • f.write("%03d"*3%(n,p,r))- উত্স ফাইলটির শেষে 3 টি র্যান্ডম সংযুক্ত করুন। প্রতিটি রান, এটি একটি পূর্ণসংখ্যার সাথে যুক্ত হবে যা ঘটেছে এমন প্রাথমিক উত্সের সমস্ত পরিবর্তনকে এনকোড করে।

  • exec'b=[];h=%d...'%1...- এলোমেলো নম্বর পান ( %1পরে রান করার পরে পাওয়া যাবে ), তালিকায় পরিবর্তনগুলি প্রয়োগ করুন এবং মুদ্রণ করুন।

  • while~-h:b+=[h%%1000];h/=1000- শীর্ষস্থানীয়দের জন্য অ্যাকাউন্টিং, এ পর্যন্ত তৈরি র্যান্ডমগুলির একটি তালিকা তৈরি করুন 1যা নেতৃস্থানীয় শূন্যগুলির সাথে সমস্যাগুলি প্রতিরোধ করে।

  • while b:r,p,n=b[-3:];b=b[:-3] - এই পুনরাবৃত্তির জন্য র্যান্ডমগুলি বরাদ্দ করুন।

  • L=[L[:p]+L[p+1:],L[:p]+[r]+L[p+n:]][n<2if L else 1] - (0 = সন্নিবেশ, 1 = প্রতিস্থাপন, 2 = মুছুন)

  • print"".join(map(chr,L)) - পরিবর্তিত উত্স মুদ্রণ করুন।


এটি কি কখনও কখনও স্ট্রিংয়ের শেষে থেকে অস্তিত্বহীন চরিত্রটিকে মুছে দেয়? যেহেতু pস্ট্রিং দৈর্ঘ্য হতে পারে। এছাড়াও, খালি স্ট্রিংয়ের সাথে আচরণটি কী?
জো কিং

@ জোকিং আমি একটি পরীক্ষা প্রোগ্রাম যুক্ত করেছি। প্রতিটি সম্ভাব্য চরিত্র পরিবর্তন ঘটতে পারে। এটি কেবল দেখায় যে প্রতিটি অবস্থান সন্নিবেশ, প্রতিস্থাপন বা মোছার জন্য নির্বাচিত হতে পারে এবং এটি একটি খালি তালিকা পরিচালনা করে। tio.run/##LYoxDsMgDEVnOAUjCAZgRO0NuIHloUOaRIocy6JDT08dpdt/…
mbomb007

আমি ওপিকে জিজ্ঞাসা করেও কোনও পরিবর্তন বৈধ বলে মনে করি না। প্রশ্নটি বলেOf course, deleting or replacing a character from an empty string is not a valid change
জো কিং

আমি Esolanging ফলের জিজ্ঞাসা করেছি, এবং তারা বলে যে, পরিবর্তন হয় বৈধ, কিন্তু একটি খালি স্ট্রিং জন্য নয়।
জো কিং

1
@ জোকিং ঠিক করা উচিত।
mbomb007

1

জাভা 10, 370 বাইট

String s;v->{if(s==null){s="String s;v->{if(s==null){s=%c%s%1$c;s=s.format(s,34,s);}else{int r=s.length();r*=Math.random();char c=127;c*=Math.random();s=s.substring(0,r)+(c%%3<2?c:%1$c%1$c)+s.substring(r+(c%%3>0?1:0));}}";s=s.format(s,34,s);}else{int r=s.length();r*=Math.random();char c=127;c*=Math.random();s=s.substring(0,r)+(c%3<2?c:"")+s.substring(r+(c%3>0?1:0));}}

এটি অনলাইনে চেষ্টা করুন।

ব্যাখ্যা:

String s;               // Class-level String variable to store the modifying source code
v->{                    // Method without parameter nor return-type
  if(s==null){          //  If this is the first execution of this function:
    s="String s;v->{if(s==null){s=%c%s%1$c;s=s.format(s,34,s);}else{int r=s.length();r*=Math.random();char c=127;c*=Math.random();s=s.substring(0,r)+(c%%3<2?c:%1$c%1$c)+s.substring(r+(c%%3>0?1:0));}}";
                        //   Set `s` to the unformatted source-code
    s=s.format(s,34,s);}//   And then to the formatted source-code
else{                   //  For any following executions of this function:
  int r=s.length();r*=Math.random();
                        //   Random index in range [0, length_of_modified_source_code)
  char c=127;c*=Math.random();
                        //   Random ASCII character in unicode range [0, 127)
  s=                    //   Replace the current String `s` with:
    s.substring(0,r)    //    The first [0, `r`) characters of the modified source code `s`
    +(c%3<2?            //    If the random option is 0 or 1:
           c:"")        //     Append the random character
        +s.substring(r  //    Append the rest of the modified source code `s`, but:
          +(c%3>0?      //     If the random option is 1 or 2:
             1:0));}}   //      Skip the first character of this second part

সাধারণ ব্যাখ্যা:

:

  • স্ট্রিংটিতে sঅপঠিত উত্স কোড রয়েছে।
  • %sএই স্ট্রিংটি নিজের সাথে ইনপুট করতে ব্যবহৃত হয় s.format(...)
  • %c, %1$cএবং 34এগুলি ডাবল-কোট ফর্ম্যাট করতে ব্যবহৃত হয়।
  • ( %%Modulo- ফর্ম্যাট করতে ব্যবহৃত হয় %)।
  • s.format(s,34,s) সব একসাথে রাখে।

এখানে একটি বেসিক জাভা কুইন প্রোগ্রাম।

চ্যালেঞ্জ অংশ:

  • String s; উত্স কোডটি আমরা শ্রেণি-স্তরে সংশোধন করব।
  • int r=s.length();r*=Math.random();সীমাতে উত্স কোডের একটি এলোমেলো সূচী নির্বাচন করতে ব্যবহৃত হয় [0, length_of_modified_source_code)
  • char c=127;c*=Math.random();ইউনিকোড পরিসরে একটি এলোমেলো ASCII অক্ষর (আনপ্রিন্টেবল সহ) নির্বাচন করতে ব্যবহৃত হয় [0, 126]
  • c%30, 1 বা 2 এর দুটি একটি র্যান্ডম বিকল্প নির্বাচন করতে ব্যবহৃত হয় 0 বিকল্পটি সূচকের আগে এলোমেলো অক্ষর যুক্ত করবে r; বিকল্প 1 সূচিপত্রের rঅক্ষরটি এলোমেলো অক্ষরের সাথে প্রতিস্থাপন করবে ; এবং বিকল্প 2 সূচীতে অক্ষরটি সরিয়ে ফেলবে r
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.