Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【解説付き】自作のEsolangでQuineに挑戦してみた

Avatar for ten986 ten986
July 15, 2022

 【解説付き】自作のEsolangでQuineに挑戦してみた

部内の発表資料
自作のEsolang「emojifunge」でQuineに挑戦したので発表。
解説付き。

Avatar for ten986

ten986

July 15, 2022
Tweet

More Decks by ten986

Other Decks in Programming

Transcript

  1. 前提知識: Quineとは • Quine: ソースコードと出力が一致するコード • Ruby による Quine が有名

    • これはソースコードと出力が一致する ◦ eval s="puts'eval s='+s.inspect"
  2. 背景: paiza_run が壊れた話 • https://togetter.com/li/1098185 • #paiza_run ruby:[rubyのコード] というツイートをす ると、@paiza_run

    が出力をツイートする • [rubyのコード]が、#paiza_run ruby:[rubyのコード] を 出力するコードである場合、無限ループする • という事件を最近知った
  3. ちゃんと Quine を実装しよう • 📜のようなズルはせずに Quine を実装する • mametter 氏によるスライド

    のほか、 angel_p_57氏のWhitespaceのQuineの記事 が 実装の上で参考になりそう(なった)
  4. 概要 • emojifungeは、codeUnit によるスタックを emoji として扱う ◦ codeUnit: https://jsprimer.net/basic/string-unicode/ ◦

    0⃣ の codeUnit は [48, 65039, 8419] である ◦ emojifunge はスタックのネストができる ◦ [ [48, 65039, 8419], [48, 65039, 8419], [48, 65039, 8419] ] という スタックにより、0⃣0⃣0⃣が表せるはず • emojifunge のコードは、emoji + 改行 で表される ◦ 改行は、長さ0のスタック [] で表すことにする • つまり、スタック列でemojifungeのコードを表すことができる
  5. AとBの対応の補足 • Aの先頭は「2行目以降のコードの先頭にある⬇のcodeUnit [11015, 65039] を載せるコード」 • 「11015という数に対して、先頭に 0⃣ を置き、「各桁

    ➕」と 間に「🔟 ✖」、65039についても同様、長さ2のcodeUnitなので2⃣、 最後に 💌 を置く」と機械的な操作 • この「機械的な操作を表すemoji列」をBでは出力する
  6. Bを組む: 概要 • スタック列がある。codeUnitのスタックか空スタックの列 • スタック列の長さが0なら終了する • スタック列のトップが空スタックなら ◦ 空スタックを載せるコードである「📧」を出力

    • スタック列のトップがcodeUnitのスタックならその中に入る ◦ codeUnitのスタックの長さが0ならスタックを抜ける ◦ 数を10進数の各桁に分解する ◦ 先の「機械的な操作」に当てはめてemojiを出力する ◦ スタックを抜ける時、「機械的な操作」の長さ部分を出力
  7. Bを組む • スタック列のトップが 空スタックなら ◦ 空スタックを載せる コードである「📧」を 出力 • 📧

    のcodeUnitを載せて出力 するだけ • 「機械的な操作」にならって いるが、ならう必要はない
  8. Bを組む • 先の「機械的な操作」に 当てはめてemojiを出力する • 11015という数に対して、 先頭に 0⃣ を置き、 「各桁

    ➕」と間に「🔟 ✖」 • このそれぞれをcodeUnitに 変換してスタック列を積む • 1つのcodeUnitを作るのも 大変なんです