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

自作のEsolangでQuineを書いてみた

ten986
July 15, 2022

 自作のEsolangでQuineを書いてみた

7/15 LT 発表資料
自作のEsolang「emojifunge」でQuineを書いたことの発表です。

ten986

July 15, 2022
Tweet

More Decks by ten986

Other Decks in Programming

Transcript

  1. 自作のEsolangで
    Quineを書いてみた
    7/15 LT @ten986

    View Slide

  2. 自己紹介
    ● 太田 佳
    ● 株式会社ゆめみ 2022年4月新卒入社
    ○ フロントエンドエンジニア
    ● Twitter: @ten986
    ○ 「てん」「てんきゅー」と呼ばれる
    ● 京都在住でフルリモートワーク
    ● 趣味: 音ゲー、ペンシルパズル、
    ボードゲーム

    View Slide

  3. みなさん

    View Slide

  4. 役に立つコード
    ばかり
    書いていませんか?

    View Slide

  5. 役に立たないコードの
    世界をお伝えします

    View Slide

  6. プログラミング言語とは
    ● プログラミング言語:
    プログラムを記述する人工言語
    ● 目的等により様々な種類がある
    ○ C, Python, JavaScript, Rust…
    ● 基本的には読みやすい
    ○ 画像は C# の例

    View Slide

  7. Esolang とは
    ● Esolang: 難解プログラミング言語
    ● 基本的に、実用性を目指さないジョーク言語
    ● 見た目にユニークなもの、難しさを極めたもの、
    画像がコードになるもの、などさまざまな種類

    View Slide

  8. Esolang の例: Brainf**k
    ● Brainf**k: おそらく一番有名なEsolang
    ● 「><+-.,[]」の8つの記号のみで記述する
    ● チューリング完全なので、様々な計算が可能
    ○ このあと登場する言語は全てチューリング完全

    View Slide

  9. Esolang の例: Piet
    ● Piet: 画像で記述する言語
    ● ポインタは、左上から始め、縦横に動く
    ○ 行き止まりになると実行終了
    ● 「移動前」「移動後」の色の差分が「命令」となる

    View Slide

  10. Esolang の例: Whitespace
    ● Whitespace : 空白文字で記述する
    ● 「スペース」「タブ」「改行」
    により記述する
    ● 目視不能

    View Slide

  11. Quine とは
    ● Quine: ソースコードと出力が
    一致するコード
    ● Ruby による Quine が有名
    ● 以下はソースコードと出力が一致
    ○ eval s="puts'eval s='+s.inspect”

    View Slide

  12. Esolang での Quine について
    ● Esolang で Quine を書いた先駆者がいる
    ● https://www.slideshare.net/mametter/quine-10290517
    ○ mametter氏による資料
    ○ Ruby による様々なQuine、Piet など Esolang の Quine
    ● https://qiita.com/angel_p_57/items/f954d30a637566b74a6d
    ○ angel_p_57氏による資料
    ○ Whitespace の Quine

    View Slide

  13. 自作のEsolangで
    Quineを書いてみた
    7/15 LT @ten986

    View Slide

  14. 自作Esolang「emojifunge」
    ● emojiを二次元に配置し、
    ポインタがその上を動く
    スタック指向言語
    ● スタックのネストなど、スタック機能が強力
    ● 命令セットがユニーク
    ● emojiの出力機能も備える
    ● https://github.com/ten986/emojifunge-lang

    View Slide

  15. emojifunge の命令の例(まじめ)

    View Slide

  16. emojifunge の命令の例(ふまじめ)

    View Slide

  17. emojifungeでQuineを作ろう!
    ● 早速ですが、emojifungeでQuineが組めました!
    ● 次のスライドにコードを載せました!
    ● コードの全貌を見てみましょう!
    ● (PietなどのQuineで苦労していた通り大変そう!)

    View Slide

  18. 📜

    View Slide

  19. 📜
    ・・・🤔

    View Slide

  20. emojifungeにはQuine命令があった
    ● emojifunge には Quine をする
    命令があった
    ● これ1文字書けば、なんと
    プログラムと出力が一致する!!
    ● たった 4byte で Quine が実現!!

    View Slide

  21. そういうことではない
    ● Quine は実現したが、求めているものではない
    ● 華麗な、奇妙な実装からくるプログラムの奥深さが
    Quine に求めているもののはず
    ● こんなものでいいのか?

    View Slide

  22. ちゃんと実装したものがここに
    ● 📜のようなズルはせずに Quine を実装する
    ● https://emojifunge-site.vercel.app/
    ○ 「QUINE」->「実行」から体験できます!
    ○ 実行に3秒くらいかかります
    ● https://gist.github.com/ten986/fbd05be46d9c750b09
    09af3be6776550 ここにコードがあります

    View Slide

  23. View Slide

  24. View Slide

  25. おめでとうございます
    ● emojifunge で Quine が実現できました
    ○ やったね!
    ● ちゃんと出力も一致している
    ● ちなみに、1行目は約30,000文字あるっぽい(?)

    View Slide

  26. 概要の説明
    ● 実装できたので、実装解説をします
    ○ 詳細の解説までは割愛

    View Slide

  27. A
    B
    C
    Aをコピー
    Aの左を出力
    Aの右を出力

    View Slide

  28. 概要
    ● 前提: スタック列と、emojifungeのコードが1対1対応が可能
    ● A:2行目以降のコードを表すスタック列を載せる
    ● (このスタック列全体を1つのスタックにまとめ、複製する)
    ● B:スタック列に対し、「そのスタック列を載せるようなemojifungeの
    コード」を出力
    ○ つまり、Aの部分が出力される
    ● C:スタック列に対し、「そのスタック列の表すemoji列」を出力
    ○ つまり、2行目以降が出力される

    View Slide

  29. おわり
    ● Esolang(難解プログラミング言語)は様々ある
    ○ 自作することもできる
    ● Quine という娯楽的プログラムがある
    ● 自作の Esolang で Quine を書いてみた
    ● 実用的でないコードの追求は楽しいよ
    ○ なんの評価も求められないからね

    View Slide