7/15 LT 発表資料 自作のEsolang「emojifunge」でQuineを書いたことの発表です。
自作のEsolangでQuineを書いてみた7/15 LT @ten986
View Slide
自己紹介● 太田 佳● 株式会社ゆめみ 2022年4月新卒入社○ フロントエンドエンジニア● Twitter: @ten986○ 「てん」「てんきゅー」と呼ばれる● 京都在住でフルリモートワーク● 趣味: 音ゲー、ペンシルパズル、ボードゲーム
みなさん
役に立つコードばかり書いていませんか?
役に立たないコードの世界をお伝えします
プログラミング言語とは● プログラミング言語:プログラムを記述する人工言語● 目的等により様々な種類がある○ C, Python, JavaScript, Rust…● 基本的には読みやすい○ 画像は C# の例
Esolang とは● Esolang: 難解プログラミング言語● 基本的に、実用性を目指さないジョーク言語● 見た目にユニークなもの、難しさを極めたもの、画像がコードになるもの、などさまざまな種類
Esolang の例: Brainf**k● Brainf**k: おそらく一番有名なEsolang● 「><+-.,[]」の8つの記号のみで記述する● チューリング完全なので、様々な計算が可能○ このあと登場する言語は全てチューリング完全
Esolang の例: Piet● Piet: 画像で記述する言語● ポインタは、左上から始め、縦横に動く○ 行き止まりになると実行終了● 「移動前」「移動後」の色の差分が「命令」となる
Esolang の例: Whitespace● Whitespace : 空白文字で記述する● 「スペース」「タブ」「改行」により記述する● 目視不能
Quine とは● Quine: ソースコードと出力が一致するコード● Ruby による Quine が有名● 以下はソースコードと出力が一致○ eval s="puts'eval s='+s.inspect”
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
自作Esolang「emojifunge」● emojiを二次元に配置し、ポインタがその上を動くスタック指向言語● スタックのネストなど、スタック機能が強力● 命令セットがユニーク● emojiの出力機能も備える● https://github.com/ten986/emojifunge-lang
emojifunge の命令の例(まじめ)
emojifunge の命令の例(ふまじめ)
emojifungeでQuineを作ろう!● 早速ですが、emojifungeでQuineが組めました!● 次のスライドにコードを載せました!● コードの全貌を見てみましょう!● (PietなどのQuineで苦労していた通り大変そう!)
📜
📜・・・🤔
emojifungeにはQuine命令があった● emojifunge には Quine をする命令があった● これ1文字書けば、なんとプログラムと出力が一致する!!● たった 4byte で Quine が実現!!
そういうことではない● Quine は実現したが、求めているものではない● 華麗な、奇妙な実装からくるプログラムの奥深さがQuine に求めているもののはず● こんなものでいいのか?
ちゃんと実装したものがここに● 📜のようなズルはせずに Quine を実装する● https://emojifunge-site.vercel.app/○ 「QUINE」->「実行」から体験できます!○ 実行に3秒くらいかかります● https://gist.github.com/ten986/fbd05be46d9c750b0909af3be6776550 ここにコードがあります
おめでとうございます● emojifunge で Quine が実現できました○ やったね!● ちゃんと出力も一致している● ちなみに、1行目は約30,000文字あるっぽい(?)
概要の説明● 実装できたので、実装解説をします○ 詳細の解説までは割愛
ABCAをコピーAの左を出力Aの右を出力
概要● 前提: スタック列と、emojifungeのコードが1対1対応が可能● A:2行目以降のコードを表すスタック列を載せる● (このスタック列全体を1つのスタックにまとめ、複製する)● B:スタック列に対し、「そのスタック列を載せるようなemojifungeのコード」を出力○ つまり、Aの部分が出力される● C:スタック列に対し、「そのスタック列の表すemoji列」を出力○ つまり、2行目以降が出力される
おわり● Esolang(難解プログラミング言語)は様々ある○ 自作することもできる● Quine という娯楽的プログラムがある● 自作の Esolang で Quine を書いてみた● 実用的でないコードの追求は楽しいよ○ なんの評価も求められないからね