Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
【解説付き】自作のEsolangでQuineに挑戦してみた
Search
ten986
July 15, 2022
Programming
230
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
【解説付き】自作のEsolangでQuineに挑戦してみた
部内の発表資料
自作のEsolang「emojifunge」でQuineに挑戦したので発表。
解説付き。
ten986
July 15, 2022
More Decks by ten986
See All by ten986
ペアレビューは同期的でなくてもよくないですか?
ten986
2
170
ANGEL Dojo 最終発表資料
ten986
0
1.1k
自作のEsolangでQuineを書いてみた
ten986
0
330
Other Decks in Programming
See All in Programming
一人だけ、Kiroが静止する日
hideg
0
140
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1k
AWSに止められる覚悟してますか?
morizo_1984
2
490
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
200
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
770
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
130
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
730
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
190
wkhtmltopdfの次どうするか問題2026
willnet
2
1.8k
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
4.4k
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
510
Androidだけじゃない、DroidKaigiで広がった私の技術スタック
akkeylab
0
100
Featured
See All Featured
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
390
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
A better future with KSS
kneath
240
18k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
440
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
RailsConf 2023
tenderlove
30
1.6k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
530
Mobile First: as difficult as doing things right
swwweet
225
10k
Transcript
自作のesolangで Quineに挑戦してみた 5/30 @ten986
前提知識: esolangとは • esolang: 難解プログラミング言語 • 基本的に、実用性を目指さないジョーク言語 • 見た目にユニークなもの、難しさを極めたもの、 ゴルフに特化したもの、などさまざま
• 例: Brainfuck による Hello, world!
前提知識: Quineとは • Quine: ソースコードと出力が一致するコード • Ruby による Quine が有名
• これはソースコードと出力が一致する ◦ eval s="puts'eval s='+s.inspect"
背景: paiza_run が壊れた話 • https://togetter.com/li/1098185 • #paiza_run ruby:[rubyのコード] というツイートをす ると、@paiza_run
が出力をツイートする • [rubyのコード]が、#paiza_run ruby:[rubyのコード] を 出力するコードである場合、無限ループする • という事件を最近知った
背景: 例会講座通知が届く • そんな中、例会講座botから 指名を受ける • ひとまず締切を決めたら 動くだろうから、5/30に入れる • ネタはどうしたもんか・・・
• → esolang で Quine をやればよいのでは!!??
背景: esolang の Quine について • 調査してみる • KMCの人は強いから聞いたら 情報くれるやろ(丸投げ)
• mametter 氏によるスライドを 教えてもらう • やべ〜w
背景: なら自作のesolangで • esolang による Quine には前例があった • そういえば以前にesolangを作ったことがあった •
自作esolangでQuineに挑戦してみよう!!! • そして今に至る......
自作esolang「emojifunge」 • emojiを二次元に配置し、 ポインタがその上を動く スタック指向言語 • スタックのネストなど、スタック機能が強力 • 命令セットがユニーク •
emojiの出力機能も備える • https://github.com/ten986/emojifunge-lang
emojifungeでQuineを作ろう! • 早速ですが、emojifungeでQuineが組めました! • 次のスライドにコードを載せました! • コードの全貌を見てみましょう!
📜
📜 ・・・🤔
emojifungeにはQuine命令があった • emojifunge には Quine をする命令があった • これ1文字書けば、なんとプログラムと出力が一致す る!!!!!! •
たった 4byte で Quine が実現!!!!!!
余談: HQ9+ • HQ9+ という言語がある • 4命令しかなく、「Q」で Quine が実現する •
もちろんチューリング完全 ではない
そういうことではない • Quine は実現したが、求めているものではない • 華麗な、奇妙な実装からくるプログラムの奥深さが Quine に求めているもののはず • こんなものでいいのか?
ちゃんと Quine を実装しよう • 📜のようなズルはせずに Quine を実装する • mametter 氏によるスライド
のほか、 angel_p_57氏のWhitespaceのQuineの記事 が 実装の上で参考になりそう(なった)
ちゃんと実装したものがここに • ちゃんとemojifungeでQuineを実装しました • このために今日朝5時まで作業してた(は?) • 次のスライドに載せる他、gist にも上げました • https://gist.github.com/ten986/fbd05be46d9c750b09
09af3be6776550
None
None
おめでとうございます • emojifunge で Quine が実現できました ◦ やったね! • ちゃんと出力も一致している
• ちなみに、1行目は約30,000文字あるっぽい(?)
解説をしていく • 実装できたので、実装解説をします • angel_p_57氏のWhitespaceのQuineの記事 を参考に、「A, B, C」という各部に分けて解説
A B C Aをコピー Aの左を出力 Aの右を出力
概要 • 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のコードを表すことができる
概要 • 処理順としてはこう • A:2行目以降のコードを表すスタック列を載せる • (このスタック列全体を1つのスタックにまとめ、複製する) • B:スタック列に対し、「そのスタック列を載せるようなemojifungeの コード」を出力
◦ つまり、Aの部分が出力される • C:スタック列に対し、「そのスタック列の表すemoji列」を出力 ◦ つまり、2行目以降が出力される
AとBの対応の補足 • Aの先頭は「2行目以降のコードの先頭にある⬇のcodeUnit [11015, 65039] を載せるコード」 • 「11015という数に対して、先頭に 0⃣ を置き、「各桁
➕」と 間に「🔟 ✖」、65039についても同様、長さ2のcodeUnitなので2⃣、 最後に 💌 を置く」と機械的な操作 • この「機械的な操作を表すemoji列」をBでは出力する
Bを組む • Aは、2行目以降の内容が確定した後、 機械的に生成するとよい • すなわち、B以降を組むことになる
Bを組む: 概要 • スタック列がある。codeUnitのスタックか空スタックの列 • スタック列の長さが0なら終了する • スタック列のトップが空スタックなら ◦ 空スタックを載せるコードである「📧」を出力
• スタック列のトップがcodeUnitのスタックならその中に入る ◦ codeUnitのスタックの長さが0ならスタックを抜ける ◦ 数を10進数の各桁に分解する ◦ 先の「機械的な操作」に当てはめてemojiを出力する ◦ スタックを抜ける時、「機械的な操作」の長さ部分を出力
Bを組む • スタック列の長さが0なら 終了する
Bを組む • スタック列のトップが 空スタックなら ◦ 空スタックを載せる コードである「📧」を 出力 • 📧
のcodeUnitを載せて出力 するだけ • 「機械的な操作」にならって いるが、ならう必要はない
Bを組む • スタック列のトップが codeUnitのスタック • 数を10進数の各桁に分解する • うまいことループさせます
Bを組む • 先の「機械的な操作」に 当てはめてemojiを出力する • 11015という数に対して、 先頭に 0⃣ を置き、 「各桁
➕」と間に「🔟 ✖」 • このそれぞれをcodeUnitに 変換してスタック列を積む • 1つのcodeUnitを作るのも 大変なんです
Bを組む • スタックを抜ける時、 「機械的な操作」の 長さ部分を出力 • 長さ2のcodeUnitなので2⃣、 最後に 💌 を置く
• 長さは事前に 📥 という 命令で退避させてある
Cを組む • Bがあんなのでしたが、Cは簡単です • codeUnitのスタックか空スタックの列かで分岐 ◦ 空スタックなら、改行を出力 🔟🔡 ◦ codeUnitのスタックなら、emojiと見なして出力🔣
• 簡単!!!!!!
Aを組む • A以外の部分が組めたら、Aを書く • 2行目以降を入力に、「機械的な操作」を出力する コードを別途書く • 30,000文字くらい出力される、手作業は厳禁
完成! • というわけで Quine が完成しました • 大変でしたね
今後の展望 • やはりWebインタプリタが欲しい ◦ Quine をせっかく作ったが、手軽に実行できない • emojifungeの謎命令でシュッとした Quine が書きたい
◦ あまりモチベはないが、ヤバいことはできそう