2024-12-11: DAY 11 - Pickle (Quine AC 2024)
DAY 11
Pythonのシリアライズフォーマットとして有名なPickleですが、中身はバイトコードインタープリタになっています。
なぜかモジュールの関数を呼び出したりできるので、わりと好き勝手できます。
なのでQuineを書いてみました。
適当なRubyスクリプトで生成してます。
$ python3 -mpickletools quine.pkl
0: \x80 PROTO 3
2: c GLOBAL 'os write'
12: J BININT 1
17: c GLOBAL 'builtins getattr'
35: c GLOBAL 'builtins bytes'
51: X BINUNICODE '__mod__'
63: \x86 TUPLE2
64: R REDUCE
65: C SHORT_BINBYTES b'\x80\x03cos\nwrite\nJ\x01\x00\x00\x00cbuiltins\ngetattr\ncbuiltins\nbytes\nX\x07\x00\x00\x00__mod__\x86RCK%s2\x86R\x86R.'
142: 2 DUP
143: \x86 TUPLE2
144: R REDUCE
145: \x86 TUPLE2
146: R REDUCE
147: . STOP
highest protocol among opcodes = 3
$ python3 -mpickle quine.pkl | diff quine.pkl -
VMの命令列を見ると何となく分かるかもしれませんが、bytes.__mod__
でQuine相当の文字列を作ったあとに os.write
で標準出力に書き込んでいます。
ちなみに python -mpickle
で出力したときに同じになるように末尾に出力した長さの数値を付け加えています。