Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonでQuine(クワイン)プログラムを書いてみよう

「Quine(クワイン)」とは、入力を一切受け取らずに、自分自身のソースコードを出力する特殊なプログラムのことです。一見すると不思議な自己言及的な仕組みですが、実装にはいくつかの厳格なルールがあります。最も重要な条件は、プログラム内部からソースコードファイルを読み込んではいけないという点です。つまり、純粋にコード自身の論理だけで自分の内容を再現しなければなりません。

サンプルコード

Pythonでは、わずか1行でQuineを実現できます。

a='a=%r;print (a%%a)';print (a%a)

実行結果

a='a=%r;print (a%%a)';print (a%a)

ご覧のとおり、出力された文字列がプログラムのソースコードそのものと完全に一致しています。

このQuineはどのように動いているのか?

この仕組みの鍵となるのは、Pythonの文字列フォーマット機能です。処理の流れを順番に見ていきましょう。

まず、変数 a を定義し、そこに文字列 'a=%r;print (a%%a)' を格納します。この文字列の中の %r はプレースホルダー(置き換え用の記号)であり、後から別の値が埋め込まれる場所を示しています。

次に、print(a % a) を実行することで、変数 a の値そのものを %r の部分に差し込みます。%r は repr() 形式、つまり文字列リテラルとして適切にエスケープ・引用符付きで値を展開してくれるため、元のコードと完全に同じ形が復元されるのです。

このように、「コードの雛形を文字列として持ち、その雛形自身を使って自分自身を再構築する」という自己言及的な構造によって、Quineは成立しています。

ファイル読み込みによる方法との違い

同様の出力は、次のようにソースファイルを直接開いて表示することでも得られます。

print(open(__file__).read())

このコードは確かに自分自身のソースコードを出力しますが、これはQuineのルール違反です。前述のとおり、Quineではプログラム内でファイルを開いてソースコードを取得することが禁止されています。あくまで「コード自身のロジックだけで自分を再現する」ことがQuineの本質であるため、上記のような手法は正しいQuineとは認められません。

  1. 【初心者向け】Pythonのissuperset()メソッドの使い方をわかりやすく解説

    はじめにこの記事では、Pythonのissuperset()メソッドについて、基本的な仕組みから実際のコード例まで詳しく解説します。issuperset()は、セット(集合)に対して使用できるメソッドで、引数として渡されたセットのすべての要素が、呼び出し元のセットに含まれているかどうかを判定します。呼び出し元のセットBが、引数のセットAのすべての要素を含んでいる場合 → True を返すセットAの要素がすべてBに含まれていない場合 → False を返すつまり、「BがAの上位集合(スーパーセット)であるかどうか」を判定するためのメソッドです。基本構文B.issuperset(A)この式は、Bが

  2. Pythonのアンダースコア(_)の使い方を徹底解説!シングルとダブルの違いとは

    Pythonでは、状況に応じてシングルアンダースコア(_)とダブルアンダースコア(__)を使い分けます。一見すると単なる記号に見えますが、それぞれに明確な役割や慣習が存在します。 Pythonでアンダースコアが使われる主なケースは以下のとおりです。 インタプリタで最後に評価した式の値を保持したい場合 特定の値を意図的に無視したい場合 変数名や関数名の宣言において特別な意味を持たせたい場合 数値リテラルの桁区切りとして使いたい場合 国際化(i18n)や地域化(l10n)の関数として使いたい場合 それでは、それぞれのケースについて具体例を見ていきましょう。 インタプリタでの使用 Pythonの