Python で Quine した 2016 年の年賀状を掘り出した

こいつに関する記事です。右下から View Raw したほうが綺麗に見えます。

概要

たまに 2016 年の年賀状についての話が出るのですが、当時のページを全てふっとばしてしまっています。
書いたものの中で (アクティブでないのに) 未だに話に上がるのはコレくらいですし、なんとか掘り出して来たので記事にします。

動作

環境

Python2.7 で動きます。3.x だと動きません。
2016 年だしまだ許されると信じたい。
(ぱっと引っかかるのは print 文なのですが、多分 exec とかの関係もあって動かなかったような記憶もあります。調べたい方は頑張ってください)

仕様

一番上の 2016 と見えているものを実行すると Happy と見えているものが、それを実行すると New と見えているものが、それを実行すると Year と見えているものが、それを実行すると 2016 と見えているものが……というふうに出力されます。
(ランダムな文字を埋め込んでいる都合上、全く同じものが出力されるわけではありません。)

仕組み

Quine を Python で作るとこうなるハズ。
というものを使用しています。

Quine

自分のソースコードを出力するプログラムのことです。
今回は、自身とほぼ同じ、次にどの形に整えたスクリプトを出力するかの情報のみが違うスクリプトを吐いています。

今回はスクリプトを文字列とし、それを exec する方法で実現しました。

本体の用意

スクリプト本体は以下のように作っています。

  • スクリプト本体を文字列にしてしまう。
    • このスクリプトは、自身を改変して print するものになっている。
    • 自身の文字列は変数名で持ってくる。
      • つまり exec される中身から、exec に使う文字列の名前をそのまま呼ぶ。
      • マルチステージプログラミングとかそういうのでは無いので呼べちゃう。怖いね。
  • スペースと改行を別の文字に置き換える。

Quine の実現

Quine を以下のように実現します

  • スクリプト本体のスペースと改行を置き換えで復元する。
  • exec。

解説

今回のスクリプトを整形、コメントを付けました。

2019/03/12