エントロピークイン!


12

あなたの仕事は、次のようなプログラムまたは関数を書くことです。

  • 初めて実行するとき、ソースコードを出力します。
  • 後続の実行では、以前に出力されたものを出力する必要がありますが、1つのランダムな文字変更(以下で定義)が必要です。一様にランダムな変更である必要はありませんが、起こりうるすべての変更はゼロではない可能性があります。

    最初の実行後は、あなたのプログラムはなりません必ずしももうQUINEなります。出力は変更されます(プログラムも自由に変更できます)。

たとえば、あなたのクインがの場合ABCD、繰り返し実行すると次のように出力されます:

ABCD
A!CD
j!CD
j!CjD

仕様書

  • 文字の変更は次のいずれかです。

    • ランダムな文字の挿入、
    • ランダムな文字の削除、または
    • 文字を新しいランダムな文字に置き換えること。新しい文字は、それが置き換える文字と同じであることが許可されていることに注意してください。その場合、変更は行われません。

    もちろん、空の文字列から文字を削除または置換することは有効な変更ではありません。

  • これはとタグ付けされていますが、ソースコードの読み取りに対するルールは適用されません。

ソースコードで使用されている文字が含まれている限り、任意の文字セットを使用できます。


1
各キャラクターはどのキャラクターを指しますか?
デニス

2
これはどのくらいの頻度で機能する必要がありますか?明らかに、元のプログラムよりも長かったり長かったりする可能性のあるすべてのプログラムが、任意に頻繁に、またはそうでなければ、チャレンジの解決策である必要はありません。
マーティンエンダー

1
キャラクターはどこにでも追加できますか、それとも最後に追加できますか?
コナーオブライエン

1
@ ConorO'Brienどこでも。
エソランジングフルーツ

1
何回反復する必要がありますか?
ディルナン

回答:


7

Pythonの3288 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))

オンラインでお試しください!

最初の反復でファイルソースコードを印刷した後、mではなく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__最初のステップでも役立つと思います。
Ørjanヨハンセン

4

Pythonの3205の 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

パイソン2779の 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))

オンラインでお試しください! (これはソースを変更しないことに注意してください。それを動作させるにはローカルで実行する必要があります)

変換作業は、ここにあることを示すために、テストプログラム(現在は常に選択するように設定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)`))

コードの1行目と3行目を削除します。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 =挿入、1 =置換、2 =削除)。

  • p -変更が発生するリスト内のランダムな位置。

  • r -リストに挿入または置換する乱数

  • 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文字列の長さになる可能性があるため。また、空の文字列での動作は何ですか?
ジョーキング

@JoKingテストプログラムを追加しました。可能なすべてのキャラクターの変更が発生する可能性があります。挿入、置換、または削除のためにすべての位置を選択できることと、空のリストを処理することを示しています。tio.run/##LYoxDsMgDEVnOAUjCAZgRO0NuIHloUOaRIocy6JDT08dpdt/...
mbomb007

OPに尋ねたが、変更が有効であるとは思わない。質問は言うOf course, deleting or replacing a character from an empty string is not a valid change
ジョーキング

Esolanging Fruitに聞いたところ、変更有効ではないが、空の文字列ではないという。
ジョーキング

1
@JoKing修正する必要があります。
mbomb007

1

Java 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

一般的な説明:

-part:

  • 文字列にsは、フォーマットされていないソースコードが含まれています。
  • %sを使用して、このStringをそれ自体に入力するために使用されますs.format(...)
  • %c%1$cおよびは34、二重引用符のフォーマットに使用されます。
  • %%modulo-をフォーマットするために使用されます%)。
  • s.format(s,34,s) すべてをまとめます。

ここに、基本的なJavaクインプログラムがあります。

チャレンジパート:

  • String s; クラスレベルで変更するソースコードです。
  • int r=s.length();r*=Math.random();は、範囲内のソースコードのランダムインデックスを選択するために使用されます[0, length_of_modified_source_code)
  • char c=127;c*=Math.random();Unicode範囲でランダムなASCII文字(印刷不可能なものを含む)を選択するために使用されます[0, 126]
  • c%30、1、または2のランダムオプションを選択するために使用されます。オプション0は、インデックスの前にランダム文字を追加しますr。オプション1は、インデックスの文字をrランダムな文字に置き換えます。オプション2はindexの文字を削除しますr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.