Quine ブログ シリーズの前回の冒険では、独自の Quine とイントロンを記述する方法を検討しました。今日は、QuineRelay とは何か、そして Intron を活用して QuineRelay を作成する方法を見ていきます。
それぞれが異なる言語で書かれた一連のプログラムを想像してみてください。このサークル内の各プログラムには、シーケンス内の次のプログラムのソース コードを出力するという 1 つの目的があります。最後のプログラムは、最初のプログラムのソース コードを出力してループを閉じます。
本質的に、QuineRelay は、次のような n 個の異なる言語で作成された n 個のプログラムのセットです。
概念をよりよく理解するために、いくつかの例を見てみましょう。
この 2 次 QuineRelay は、Python プログラムを出力し、その後元の JavaScript プログラムを出力する JavaScript プログラムを備えています。それは自己複製のダイナミックなデュオです。
JavaScript → Python ⥀
JavaScript: オンラインで試してみましょう!
console.log((q=_=>`print(${JSON.stringify(`console.log((q=${q []})())`)})`)())
Python: オンラインで試してみましょう!
print("console.log((q=_=>`print(${JSON.stringify(`console.log((q=${q []})())`)})`)())")
3 次 QuineRelay を使用すると、事態はさらに面白くなります。これは Haskell プログラムで始まり、Python プログラムが出力され、Python プログラムが Ruby プログラムを出力し、最後に Ruby プログラムは元の Haskell プログラムにループバックします。
Haskell → Python2 → Ruby ⥀
Haskell: オンラインで試してみましょう!
q a b c=putStrLn $ b [toEnum 10,'q','('] show b [','] show c [','] show a [')'] main=q "q a b c=putStrLn $ b [toEnum 10,'q','('] show b [','] show c [','] show a [')']" "def q(a,b,c):print b chr(10) 'q(' repr(b) ',' repr(c) ',' repr(a) ')'" "def e(x) return 34.chr x 34.chr end;def q(a,b,c) print b 10.chr 'main=q ' e(b) ' ' e(c) ' ' e(a) ' ' 10.chr end"
Python2: オンラインで試してみましょう!
def q(a,b,c):print b chr(10) 'q(' repr(b) ',' repr(c) ',' repr(a) ')' q("def q(a,b,c):print b chr(10) 'q(' repr(b) ',' repr(c) ',' repr(a) ')'","def e(x) return 34.chr x 34.chr end;def q(a,b,c) print b 10.chr 'main=q ' e(b) ' ' e(c) ' ' e(a) ' ' 10.chr end","q a b c=putStrLn $ b [toEnum 10,'q','('] show b [','] show c [','] show a [')']")
ルビー: オンラインで試してみましょう!
def e(x) return 34.chr x 34.chr end;def q(a,b,c) print b 10.chr 'main=q ' e(b) ' ' e(c) ' ' e(a) ' ' 10.chr end q("def e(x) return 34.chr x 34.chr end;def q(a,b,c) print b 10.chr 'main=q ' e(b) ' ' e(c) ' ' e(a) ' ' 10.chr end","q a b c=putStrLn $ b [toEnum 10,'q','('] show b [','] show c [','] show a [')']","def q(a,b,c):print b chr(10) 'q(' repr(b) ',' repr(c) ',' repr(a) ')'")
これは 4 次 QuineRelay です: Ruby → Java → C# → Python ⥀
GitHub
文化を越えて、共通の象徴性がいくつかあります。そのうちの 1 つはウロボロスで、エジプト、ギリシャ、ローマ、ヒンズー教、シベリア、北欧、アフリカ、南米の神話に言及しています。ウロボロスは、自らの尾を食い尽くす蛇や龍を描いた古代のシンボルで、創造と破壊の永遠のサイクルを表しています。
北欧神話では、ヨルムンガンドはロキと巨人娘アングルボザの中間子である巨大な蛇です。オーディンはヨルムンガンドをミズガルズ (人間の領域) を取り囲む海に投げ込み、そこで蛇は非常に巨大になり、世界を取り囲み、自らの尾を掴みました。ミッドガルド(地球)を取り囲んでいるため、世界蛇・ウロボロスと呼ばれています。ヨルムンガンドが尻尾を放つのは、ラグナロク (世界最後の戦い) の始まりの兆候の 1 つです。
Quine リレーは、この象徴性を非常にうまく体現しています。サイクル内の各プログラムが次のプログラムを生み出し、最終的に生まれ変わるだけであるため、ウロボロス プログラムと呼ばれています。
席に座ってください。こちらは128次のウロボロス・クワインリレーです。はい、そのとおりです。 128 !!!
Ruby → Rust → Scala → ... (他 120) ... → Python → R → Ratfor → rc → REXX ⥀
GitHub
これだけでは十分ではないかのように、イースターエッグが含まれています。ズームアウトした元の Ruby コードにはウロボロスのドラゴンが含まれています!
前に書いた Python イントロンを開始して、それを 2 次 QuineRelay に変えてみましょう。
Python イントロン: オンラインで試してみましょう!
intron = 'wubbalubbadubdub' data = "print('intron =', repr(intron)); print('data =', repr(data)); print(data)" print('intron =', repr(intron)); print('data =', repr(data)); print(data)
イントロンの魔法を使用して、異なる言語の兄弟 Quine の コード 部分をイントロンに簡単に挿入できるようになりました。次の形式のプログラムを作成します:
Python:
intron = "code part of sibling" data = "code part of self" print('intron =', repr(intron)); print('data =', repr(data)); print(data)
なので、各変数は別の Quine の データ として機能するだけです。 data と intron の名前をそれぞれ d1 と d2 に変更しましょう。
Python:
d1 = "code part of self" d2 = "code part of sibling" print('d1 =', repr(d1)); print('d2 =', repr(d2)); print(d1)
d2 はイントロンとして機能しますが、上記のプログラムは依然として self のコード部分を出力しようとしました。次のソースを出力させるには、最後に print(d1) の代わりに print(d2) を付けましょう。
Python:
d1 = "code part of self" d2 = "code part of sibling" print('d1 =', repr(d1)); print('d2 =', repr(d2)); print(d2)
d1 の内容が 3 行目の単なるコピーであることはすでにわかっています。しかし、d2 の内容はまだありません。
たとえば、JavaScript を使用して QuineRelay を作成したいとします。同様のイントロンを JS で書いてみましょう。
JavaScript:
d1 = "code part of sibling" d2 = "code part of self" console.log(`d1 = ${JSON.stringify(d1)}`); console.log(`d2 = ${JSON.stringify(d2)}`); console.log(d1);
さて、上記の JS イントロンの 3 行目は、必要な兄弟プログラムの コード です!
お互いの コード を相手のイントロンとして貼り付けます。
注記。引用符の不一致を避けるために、js に d1 '' を追加する必要があります
Python: オンラインで試してみましょう!
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: オンラインで試してみましょう!
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 '');
それでは。れっきとした2次QuineRelayです! JavaScript プログラムを出力する Python プログラム。サイクル内で元の Python プログラムを出力します。
QuineRelay の作成は、創造的なコーディングの演習であり、さまざまな言語で文字列がどのように表現され操作されるかを理解するための演習です。これには、さまざまなプログラムのイントロンを織り交ぜることが含まれます。各プログラムには、隣のプログラムを複製するコードが含まれています。
n 次リレーの核心は、n 個のプログラミング言語間で引用符をエスケープする n 個の賢い方法を組み合わせたゲームです。
MultiQuine に関する次の投稿をお楽しみに!
出典と参考文献:
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3