しかし、疑問が生じました。 任意の順序のクイン(つまり、Nが開始した後に自分自身に入るクイン)を書くことは可能ですか? 結局のところ、これは完全に可能です。 調査の結果、次のコードが得られました。
# xonix
L=19;B,Q,N,q,n=map(chr,(36,81,78,39,10))
X= 'import sys;sys.stdout.write(%s%s%s.replace(chr(36)+chr(81)+chr(36),chr(39)).replace(chr(36)+chr(81),chr(36)).replace(chr(36)+chr(78)+chr(36),chr(10)).replace(chr(36)+chr(78),chr(36)))'
Y= '# xonix%sL=%s;B,Q,N,q,n=map(chr,(36,81,78,39,10))%sX=%s%s%s%sY=%s%s%s%sE="""%s""";exec E%simport sys;sys.stdout.write(b())'
E= "" "def b(l=L):
if l==L: Ql=q
else: Ql=B+Q*(Ll)+B;Nl=B+N*(Ll)+B
if l>0: return X%(Ql,b(l-1),Ql)
else: return Y%(Nl,str(L),Nl,Ql,X,Ql,Nl,Ql,Y,Ql,Nl,E.replace(n,Nl),Nl)" "" ;exec E
import sys;sys.stdout.write(b())
このコードの特徴は、それをquine_20_0.pyファイルに保存してから実行すると
python quine_20_0.py > quine_20_1.py
python quine_20_1.py > quine_20_2.py
python quine_20_2.py > quine_20_3.py
...
python quine_20_19.py > quine_20_20.py
その後、quine_20_0.pyおよびquine_20_20.pyファイルはバイナリと一致します。 Lを変更すると、任意の長さのサイクルを取得できます。
これがそうであるかどうかを確認したい人のために、私は実際に検証コードを提供することができます:
# file: quine_n_gen.py
N = 20 # quine cycle
Q= '' '# xonix
L=${n};B,Q,N,q,n=map(chr,(36,81,78,39,10))
X=' import sys;sys.stdout.write(%s%s%s.replace(chr(36)+chr(81)+chr(36),chr(39)).replace(chr(36)+chr(81),chr(36)).replace(chr(36)+chr(78)+chr(36),chr(10)).replace(chr(36)+chr(78),chr(36))) '
Y=' # xonix%sL=%s;B,Q,N,q,n=map(chr,(36,81,78,39,10))%sX=%s%s%s%sY=%s%s%s%sE= "" "%s" "" ;exec E%simport sys;sys.stdout.write(b()) '
E="""def b(l=L):
if l==L: Ql=q
else: Ql=B+Q*(Ll)+B;Nl=B+N*(Ll)+B
if l>0: return X%(Ql,b(l-1),Ql)
else: return Y%(Nl,str(L),Nl,Ql,X,Ql,Nl,Ql,Y,Ql,Nl,E.replace(n,Nl),Nl)""";exec E
import sys;sys.stdout.write(b())' '' .replace( '${n}' ,str(N-1))
qName = 'quine_%s_0.py' % N
q = open(qName, 'w' )
q.write(Q)
q.close()
# test
import os
for i in range(N+1):
os.system( 'python quine_%s_%s.py > quine_%s_%s.py' % (N,i,N,i+1))
lastQName = 'quine_%s_%s.py' % (N,N)
print ':)' if open(qName).read()==open(lastQName).read() else ':('
* This source code was highlighted with Source Code Highlighter .
このコードは、クインを作成し、変換を実行します。 成功した場合(先頭と末尾のファイルが一致する場合)、コードは次を出力し
:)
。
興味深い場合は、このクインを作成するためのプロセスとアイデアを(別のトピックとして)話します。
UPD 原理の何らかの説明はここに提示されます 。