HN 日本語サマリー

← 一覧へ戻る
プログラミング

Quineの書き方

How to Write a Quine (czterycztery.pl)

12 pointsby mci2 コメント

要約

この記事は、プログラムが自身のソースコードを再帰なしに表示する「Quine」の作成方法について解説しています。まず、自身のコピーを作成する架空の機械の比喩を用いてQuineの仕組みを直感的に説明し、次にPythonでの簡単なQuineの実装例を示しながら、その構造と動作原理を詳細に解説しています。

全文翻訳

main quineの書き方 これは、Quine(https://en.wikipedia.org/wiki/Quine_%28computing%29)の書き方についてのテキストです。Quineとは、再帰なしに自身のソースコードを出力するプログラムのことです。読者はすでにQuineに触れたことがあり、おそらく自分で書こうとしたこともあり、なぜそれが難しく興味深いのかを理解していると仮定します。このテキストは2つの部分から構成されます。最初の部分では、比喩を用いてそれがどのように機能するかを説明し、2番目の部分では、Quineの書き方を詳細に説明します。 Quineの仕組み 次に、自身のコピーを作成できる機械をどのように構築できるかを説明します。もちろん、最も簡単な方法は、機械が自分自身を見て、どのように構築されているかを確認し、同一のものを作成することです。しかし、再帰なしに自身のコピーを作成できる機械を構築できるでしょうか? まず、計画さえあれば何でも作成できる機械を構築します。そのような機械は、計画が挿入されるまでは真の機械ではないと言う人もいるかもしれませんが、それは問題ではありません。カヤックの計画を挿入するだけでカヤックを作る機械が得られ、手押し車の計画を挿入すれば手押し車を作る機械が得られるなど、とにかく素晴らしいのです。 では、自身の計画を挿入して、自身のコピーを作る機械を得ることができるでしょうか?一つ問題があります。計画ホルダーが描かれている計画には何が描かれるのでしょうか?ホルダーは空になるのでしょうか?もしそうなら、この計画に基づいて作られた機械は何も作れなくなります(親機械は子孫機械を作れますが、それはできないため、親の完全なコピーとは言えません)。あるいは、計画はまさにこの機械の計画を描くのでしょうか?それは良いですが、計画の中の計画で、ホルダーが描かれている部分には何を描くべきでしょうか?残念ながら、2つの可能性があります。1つは、計画のいずれかのホルダーが空になり、機械が完全なコピーを作成できなくなるか、あるいはこの計画を描き終えることが決してないかのどちらかです。 ここで一度立ち止まることをお勧めします。すべてを快適に感じるまで想像してください。計画が挿入されれば何でも作れる機械を想像してください。デスク(車、フライパン、ヘッドフォン、電話)の計画を挿入してボタンを押すと、それが作られるのを想像してください。次に、この機械の計画を描き、その計画を計画ホルダーに挿入し、機械をオンにすることを想像してください。親機械が子機械を生成します。子機械をオンにすると、何が起こるでしょうか? 別の思考実験をしましょう。この機械の計画を描きますが、今回は計画ホルダーにデスクの計画を入れます。次に機械をオンにし、子機械がポップアウトします。子機械をオンにすると、何が起こるでしょうか? そして、別の思考実験をしましょう。この機械の計画を描きますが、今回は計画ホルダーに空の計画ホルダーを持つこの機械の計画を描きます。次に機械をオンにし、子機械がポップアウトします。子機械をオンにすると...あなたの心の中で何が見えますか? しかし、この機械を少し異なる方法で動作するように変更できます。計画に描かれているものを作成し、次に計画をコピーし、作成されたアイテムの「ここ」とマークされた場所を見つけて、そこにコピーを挿入します。そして計画には、空のホルダー「ここ」を持つこの機械の正確な計画を描きます。そして、機械をオンにしたときに何が起こるかを見てください。計画なしでコピーを作成し、計画をコピーし、ホルダーに挿入します。そしてこの方法で、それは正確なコピーを作成しました。 もしこの時点で、計画のコピーを作成することが一種の再帰であるため、私が不正をしているように感じるなら、もし、どの操作が禁止された再帰であり、どれが計画のコピーのようなものではないかを明確に定義しなかったことに腹を立てているなら、その考えは脇に置いてください。この機械に関するこの話は、独立したパズルではありません。それは完璧に意味をなす必要さえありません。それは、私がすぐに書くQuineがどのように構築されているか、そしてそれがどのように機能するかをよりよく理解するのに役立つだけです。このような機械との比較は、Quine(私がすぐに書くもの)を理解するのに大いに役立ったので、この話を皆さんと共有します。 機械にとって些細なことですが、私が実際にQuineを書くときには重要になる一つの詳細に注意を払いましょう。この機械は、機械を生成した後、ボタンを押した人にすぐにそれを渡すことはできません。計画のコピーを挿入するために、しばらく保持する必要があります。 この機械の仕組みの要約 そして今、この機械の仕組みの要約です。誰かがボタンを押します。機械は計画に基づいて起動します。計画に基づいて何でも作成できる機械を生成します。計画のコピーを作成します。この計画のコピーを、作成した機械に挿入します。計画を備えた機械を、ボタンを押した人に渡します。 ここで一度立ち止まることをお勧めします。すべてを快適に感じるまで想像してください。それを正確に、段階的に、適切に、視覚的に想像してください。この機械がどのように機能するか、子機械をどのように生成するか、計画をどのようにコピーするか、子機械にコピーをどのように挿入するか、子機械をどのように起動するか、子機械が何をするか、そして孫機械をどのように起動するか...そしてそのように。 Quineの書き方 簡単なPythonでのQuine そして今、私はQuineを書きます。つまり、自分自身を表示するプログラムです(再帰なしに)。まず、Quineの書き方を示すためにPythonで簡単なQuineを書き、次にPythonや他の言語でいくつかのバリエーションを書いて、どのような問題が発生する可能性があり、どのように解決するかを示します。 まず、プログラムが自分自身を表示することは、プログラムが表示するプログラムの特別なケースであることに注意してください。したがって、何かを表示するプログラムを書くことから始めます。Pythonでは、最も簡単な方法は次のとおりです。 print() これは何でも表示できるプログラムです。括弧の中にその「何でも」を挿入するだけです。何も挿入しない限り、このプログラムは役に立ちません(計画のない機械のように)。しかし、例えば、この括弧の中に「Poland」という単語を挿入すると、「Poland」という単語を表示するプログラムが得られます。 print('Poland') 次に、プログラムが自分自身を表示することは、プログラムが自分自身を表示するプログラムを表示することに注意してください。そしてこれは、プログラムが何かを表示するプログラムを表示するプログラムを表示することの特別なケースです。そこで、何かを表示するプログラムを表示するプログラムを書くことにしましょう。Pythonでは、最も簡単な方法は次のとおりです。 print('print()') これは、括弧の中に「何でも」を挿入するだけで、何でも表示できるプログラムを作成するプログラムです。これは、計画があれば何でも作成できる機械を生成する機械のようなものです。これらの括弧に何も挿入しない限り、このプログラムは役に立ちません(計画を備えていない機械を生成する機械のように)。しかし、例えば、この括弧の中に「Poland」という単語を挿入すると、「Poland」という単語を表示するプログラムを表示するプログラムが表示されます。 print('print("Poland")') これを最初の部分で書いた機械と比較してみましょう。print()プログラムは、計画があれば何でも作れる機械のようなものです。print()という表記は、この機械の計画のようなものです。print('print()')プログラムは、計画があれば何でも作れる機械のようなもので、その計画ホルダーには、計画があれば何でも作れる機械の計画があり、その計画ホルダーは空です。そしてprint('print("Poland")')プログラムは、計画があれば何でも作れる機械のようなもので、その計画ホルダーには、計画があれば何でも作れる機械の計画があり、その計画ホルダーには「Poland」という単語の計画があります。 これはソースコードを印刷するプログラムではありませんが、自分に似たプログラムのソースを印刷するプログラムであるため、かなり近づいています。 次に、最初の部分の機械で行った操作と同様の操作を実行する必要があります。子機械の計画で、ここで計画ホルダーに書いたことを覚えていますか?Wel