Quine ブログ シリーズの前回の冒険では、独自の Quine とイントロンを記述する方法を検討しました。今日は、QuineRelay とは何か、そして Intron を活用して QuineRelay を作成する方法を見ていきます。
それぞれが異なる言語で書かれた一連のプログラムを想像してください。このサークル内の各プログラムには、シーケンス内の次のプログラムのソース コードを出力するという 1 つの目的があります。最後のプログラムは、最初のプログラムのソース コードを出力してループを閉じます。
本質的に、QuineRelay は、次のような n 個の異なる言語で作られた n 個のプログラムのセットです:
概念をよりよく理解するためにいくつかの例を見てみましょう。
この 2 次 QuineRelay は、Python プログラムを出力し、元の JavaScript プログラムを出力する JavaScript プログラムを備えています。それは自己複製のダイナミックなデュオです。
JavaScript → Python ⥀
JavaScript: オンラインで試してみましょう!
Python: オンラインで試してみましょう!
3 次 QuineRelay を使用すると、物事はさらに面白くなります。これは Haskell プログラムで始まり、Python プログラムが出力され、Python プログラムが Ruby プログラムを出力し、最後に Ruby プログラムは元の Haskell プログラムにループバックします。
Haskell → Python2 → Ruby ⥀
Haskell: オンラインで試してみましょう!
Python2: オンラインで試してみましょう!
ルビー: オンラインで試してみましょう!
これは 4 次 QuineRelay です: Ruby → Java → C# → Python ⥀
GitHub
文化を超えて、共通の象徴性がいくつかあります。そのうちの 1 つはウロボロスで、エジプト、ギリシャ、ローマ、ヒンズー教、シベリア、北欧、アフリカ、南米の神話に言及しています。ウロボロスは、自分の尾を食い荒らす蛇や龍を描いた古代のシンボルで、創造と破壊の永遠のサイクルを表しています。
北欧神話では、ヨルムンガンドはロキと巨人娘アングルボザの中間子である巨大な蛇です。オーディンはヨルムンガンドをミズガルズ (人間の領域) を取り囲む海に投げ込み、そこで蛇は非常に巨大になり、世界を取り囲み、自らの尾を掴みました。ミッドガルド(地球)を取り囲んでいるため、世界蛇・ウロボロスと呼ばれています。ヨルムンガンドが尻尾を放つのは、ラグナロク(世界最後の戦い)の始まりの兆しの一つです
クワインリレーはこの象徴性を非常にうまく体現しており、サイクル内の各プログラムが次のプログラムを生み出し、最後には生まれ変わるだけであるため、ウロボロス プログラムという愛称が付けられています。
Ruby → Rust → Scala → ... (他 120) ... → Python → R → Ratfor → rc → REXX ⥀
GitHub
これだけでは十分ではないかのように、イースターエッグが含まれています。ズームアウトした元の Ruby コードにはウロボロスのドラゴンが含まれています!
Python Intron: オンラインで試してみましょう!
リーリー
コード 部分をイントロンに簡単に挿入できるようになりました。次の形式のプログラムを作成します:
パイソン:
リーリー
データ として機能するだけです。データとイントロンの名前をそれぞれ d1 と d2 に変更しましょう。
パイソン:
リーリー
パイソン:
リーリー
d1 の内容が 3 行目の単なるコピーであることはすでにわかっています。しかし、d2 の内容はまだありません。
たとえば、JavaScript を使用して QuineRelay を作成したいとします。同様のイントロンをJSで書いてみましょう
JavaScript:
リーリー
さて、上記の JS イントロンの 3 行目は、私たちが望んでいた兄弟プログラムの
です!
お互いのコード
を相手のイントロンとして貼り付けます。
注記。引用符の不一致を避けるために、js に d1 + '' を追加する必要があります
Python: Try it online!
d1 = "print('d1 =', repr(d1)); print('d2 =', repr(d2)); print(d2)" d2 = "console.log(`d1 = ${JSON.stringify(d1)}`); console.log(`d2 = ${JSON.stringify(d2)}`); console.log(d1 + '');" print('d1 =', repr(d1)); print('d2 =', repr(d2)); print(d2)
JavaScript: Try it online!
d1 = "print('d1 =', repr(d1)); print('d2 =', repr(d2)); print(d2)" d2 = "console.log(`d1 = ${JSON.stringify(d1)}`); console.log(`d2 = ${JSON.stringify(d2)}`); console.log(d1 + '');" console.log(`d1 = ${JSON.stringify(d1)}`); console.log(`d2 = ${JSON.stringify(d2)}`); console.log(d1 + '');
There you go. It's a proper 2nd order QuineRelay! A Python program, that prints a JavaScript program, that prints the original Python program back in a cycle.
Creating a QuineRelay is an exercise in creative coding and understanding how different languages represent and manipulate strings. It involves weaving together introns from various programs, each containing the code to replicate its next neighbour.
At its core, an nth-order relay is a game of n clever ways to escape quotes across n programming languages.
Stay tuned for the next post on MultiQuine!
Sources and references:
以上がQuineRelay: クワインの蛇の誕生の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。