Pythonランダムチェーンクイン

このhabratopikeで与えられた日本のチェーンのポリグロットクインに感銘を受けて、私は以前にクインプログラムに出会ったことがあるので、それらをより詳しく知ることにしました。 簡単なグーグル検索と、トピックに関するwiki /ブログ/サイトの短い読みの後、私の手はとかされ、私は馬を書きたかった。 Quineは、いくつかのバージョンでも書かれていますが、これでは十分ではないように思われました。 後で私はダブルクインさえ書きました (pythonコードはプロローグコードを生成し、プロローグコードは元のpythonコードです)。



しかし、疑問が生じました。 任意の順序のクイン(つまり、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 原理の何らかの説明はここに提示されます



All Articles