Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Brainf*ckで15パズル
Search
HN410
May 06, 2022
Programming
1.6k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Brainf*ckで15パズル
以下でも説明しています.
https://hn410.github.io/
HN410
May 06, 2022
More Decks by HN410
See All by HN410
Lex, YACC講習会
hn410
0
2.1k
Android入門
hn410
0
2k
計算量理論
hn410
0
2.4k
Deeplearning from almost scratch
hn410
0
2.2k
Produire
hn410
0
3.4k
Other Decks in Programming
See All in Programming
OSINT for SRE: 学術論文とポストモーテムから探る システム障害の共通パターン / SRE NEXT 2026
tomoyk
1
3.6k
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
390
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.4k
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
170
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
570
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
120
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
230
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
260
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
140
act2-costs.pdf
sumedhbala
0
110
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.4k
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
150
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
Building the Perfect Custom Keyboard
takai
2
810
Believing is Seeing
oripsolob
1
170
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
63
55k
Evolving SEO for Evolving Search Engines
ryanjones
0
240
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
[SF Ruby Conf 2025] Rails X
palkan
2
1.2k
How to build a perfect <img>
jonoalderson
1
5.8k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
240
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
410
Transcript
BRAINF_CKで15パズル 19 HN
BRAIN F_CK の始め方 • コンパイラを落としたり作ったりしてもいいですが、インタープリタを使うのが個人的には 楽です。 • 「brain fuck インタープリタ」などと検索すると有志の作ったものがいろいろ出てきます。
• 以下、自分が用いているもの。(すべて有志の作ったものなので抵抗ある方は注意を) ・ウェブブラウザ上で動くインタプリタ(ステップ実行もでき、ちょっとしたテストには便 利) ※今回紹介するパズルのコードはまともに動かないので注意 http://www.usamimi.info/~ide/programe/brainfuck/index.html ・フリーソフト(windows用) http://www.4mhz.de/bfdev.html ページ中ほどのbfdev-1-4-7.zipをダウンロードして解凍してください。
BRAINF_CKとは…? • 難解 プログラミング言語の一つ。 • 命令が8つしかなく、非常に簡潔に構成されている。
サンプルコード • Hello world! のコード print(“Hello world!”) +++++++++[>++++++++>+++++++++++>+++>+<<<<- ]>.>++.+++++++..+++.>+++++.<<+++++++++++++++.>.+++.--- ---.--------.>+.>+.
BRAINF_CKの長所 • 命令が8つしかない→初心者にも覚えやすい • チューリング完全 • コンパイラが軽い • 文字の可読性が高くなるように考えられている •
派生言語が沢山ある • AtCoderでも使える
ATCODERで使ってみた • 問題文 X,A は 0 以上 9 以下の整数です。 X
が A 未満の時 0、A 以上の時 10 を出力してください。 • 制約 0≤X,A≤9 入力は全て整数である • 入力 X A >,>,[-],>++++++++[<------<------>>-] <<[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ ]]]]]]]]]]]]]]]]]]]] <[<] >> >+<[>-<[-]]>[+++++[>++++++++<-]>+.<] +++++++[>>+++++++<<-]>>-.
ATCODERで使ってみた
BRAINF_CKの全命令 • > ポインタをインクリメントする。ポインタをptrとすると、C言語の「ptr++;」に相当する。 • < ポインタをデクリメントする。C言語の「ptr--;」に相当。 • + ポインタが指す値をインクリメントする。C言語の「(*ptr)++;」に相当。
• - ポインタが指す値をデクリメントする。C言語の「(*ptr)--;」に相当。 • . ポインタが指す値を出力に書き出す。C言語の「putchar(*ptr);」に相当。 • , 入力から1バイト読み込んで、ポインタが指す先に代入する。C言語の「*ptr=getchar();」に相 当。 • [ ポインタが指す値が0なら、対応する ] の直後にジャンプする。C言語の「while(*ptr){」に相当。 • ] ポインタが指す値が0でないなら、対応する [ (の直後)にジャンプする。C言語の「}」に相当。 • それ以外はコメントとして無視される。 …Wikipediaより
BRAINF_CKの仕組み 1 2 3 4 0 0 0 0 +->>+<,.[>]+
テクニック集 • 掛け算…メモリを一つ余分に用いる (例)@の出力 方法1 ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++. 方法2 ++++++++[>++++++++<-]>.
テクニック集 • 値のコピー?(もとの場所の値は0になるので) [>+>+<<-] • メモリの値が0のところまでジャンプ [<] or [>] •
If x [[-] if の中身] • If x=0: >+<[>-<[-]]>[- if の中身 ] • https://esolangs.org/wiki/Brainfuck_algorithms などを参照するのも良いかも
(個人的)ポイント集 • コメントを多用(処理の概要、ポインタの現在位置) • コードの可読性を重視 • 使われているメモリの管理 • 判定時などに値がリセットされるかどうかの確認 •
オーバーフローに注意(1メモリにつき1バイト) →それを利用する手も…? • コードをとにかく工夫する
15パズルをやってみましょう • ドライブ内のファイル 「15パズル.txt」…これをコピーしてインタプリタに貼ることでプレイできます。 「15パズル日本語コメ付き.txt」 …上のものに日本語の注釈が入っているものです。 コード自体は同じですが、これをインタプリタに貼ると文字化けを起こします。 「15パズル安定版.txt」 …上2つはオーバーフローを用いていますが、エラーを起こすインタプリタもある かもしれないと思い、用いないverを作りました。ちょっと無駄が増えます。
15パズルをやってみましょう • 仕様 A~Oで1~15の数を、「~」が空白部分を表しています。シャッフル機能やクリア 判定はありません。 • 操作方法 「w」…空白を上に動かす 「a」…空白を左に動かす 「s」…空白を下に動かす
「d」…空白を右に動かす
15パズルのコード • +>+>+>+>++++[>++++<- ]+>[>++++>++++>++++>++++>+>>++++>++++>++++>++++>+>>++++>++++>++++>+++ +>+>>++++>++++>++++>>+<<<<<<<<<<<<<<<<<<<<<<<- ]+>+++>++++>+++++>++++++>------ >+>+++++++>++++++++>+++++++++>++++++++++>------ >+>+++++++++++>++++++++++++>+++++++++++++>++++++++++++++>------ >+>+++++++++++++++>++++++++++++++++>+++++++++++++++++>>------ >+>+>+>+>+>+[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<--.++>--.++>--.++>--.++>.>>--.++>--
.++>--.++>--.++>.>>--.++>--.++>--.++>--.++>.>>--.++>--.++>--.++>--.++>.>>>>>>,[- >+>>+>>+>>+<<<<<<<]>>++++++++++++[-<-------->]<->+<[>-<[-]]>[>>+++++[<+++++>- ]>>+++++[<+++++>-]>>+++++[<+++++>-]<<<<<<<<<<[<]<-[[>+<-]>+<]+>[<-]>>>[>]>>- ]>>++++++++++[-<---------->]<>+<[>-<[-]]>[>>+++++[<+++++>-]>>+++++[<+++++>- ]<<<<<<<<<[<]>----------[[<+>-]<++++++++++>]++++++++++<[>----------]>>[>]>>>>- ]>>+++++++++++[-<---------->]<----->+<[>-<[-]]>[>+++++<<<<<<<<[<]>>>>>>- [[<<<<<<+>>>>>>-]<<<<<<+>>>>>>]+<<<<<<[>>>>>>-]>[>]>>>>>>-]>>+++++++++++[- <---------->]<--------->+<[>-<[-]]>[<<<<<<<<<[<]<<<<<<-[[>>>>>>+<<<<<<- ]>>>>>>+<<<<<<]+>>>>>>[<<<<<<-]>[>]>>>>>>>>-]<<<<<<<<+]
コードの説明 • 大まかな構造 1.初期設定 2.出力 3.入力とパズルの移動 4.2へループ
メモリの主な利用状況 • 1~34 …パズルのマスに対応 • 35 …キーの入力値を一時的に格納 • 36~43 …入力値の判定など
初期設定(パズルのマス) • パズルの4*4マスを6*6マスに拡張し、 中の4*4の正方形の部分をパズルのマス目 に対応させる。 • パズルのマス目にはパズルの番号+66 (ASCIIでA~Oの文字コード値+2に対応)、 右端には10(改行コード)、空白は0(参 照しやすい)、その他は1(1を引いて0に
すればif判定しやすい)を代入する。 →現在地±1、6が上下左右に対応し、かつ、 端にあるかどうかの判定も楽にできる。
初期設定 +>+>+>+>++++[>++++<-]+> [>++++>++++>++++>++++>+> >++++>++++>++++>++++>+> >++++>++++>++++>++++>+> >++++>++++>++++>>+ <<<<<<<<<<<<<<<<<<<<<<<-]+ >+++>++++>+++++>++++++ >------>+>+++++++>++++++++>+++++++++>++++++++++ >------>+>+++++++++++>++++++++++++>+++++++++++++>++++++++++++++
>------>+>+++++++++++++++>++++++++++++++++>+++++++++++++++++ >>------>+>+>+>+>+>
出力 • メモリのうち、パズルのマスに対応する部分と改行コードを出力する。 • このとき、パズルのマスに対応する部分は値を一旦ー2してから出力する。 →空白の部分を出力するため。(このとき、アンダーフローが起きて値は126になり、 チルダが出力される。) • アンダーフローを防ぐなら、パズルのマスには1~15を初期設定で入力しておき、出 力の際のみ毎回64を足すという方法もあるが…
出力 <<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<< パズルのマスの先頭まで移動 --.++>--.++>--.++>--.++>.>> --.++>--.++>--.++>--.++>.>> --.++>--.++>--.++>--.++>.>> それぞれ一旦2を引いて出力し、また2を足して戻す。 --.++>--.++>--.++>--.++>.>> 改行コードの部分はそのまま出力
>>>> メモリ35まで移動して判定へ
入力と判定 • 入力はa(文字コード97)、d(文字コード100)、s(文字コード115)、w(文字コー ド119)のみ想定。それ以外の入力には、何の操作もしない。 1.入力値を4つのメモリにコピー 2.文字コードの若い順に処理する。入力値(をコピーした値)から97を引き、0だったら左移 動の可能性。 3.空白の左が欄外かどうか判定。1を引いて0になるかどうか調べればよい。0でないなら左の 値を現在空白のところにコピー。 4.これをd、s、wで繰り返す。
入力と判定(Aの部分だけ抜粋) +[-,[->+>>+>>+>>+<<<<<<<] 入力値を4つのメモリに切り取りコピー >>++++++++++++[-<-------->]<- ↑のうち一つから97を引く >+<[>-<[-]]>[ それが0ならインデント内実行 …☆ >>+++++[<+++++>-] >>+++++[<+++++>-]
>>+++++[<+++++>-] ↑でコピーした残りの3つ値に十分大きな値をいれてオーバーフロー防止 <<<<<<<<<<[<] 0(パズルの空白)まで飛ぶ <-[ 左の値が0じゃない(=欄外じゃない)ならインデント内実行 …※ [>+<-]>+<] パズルを移動 +>[<-]>>>[>] ※のときに左が欄外だった時、1だった値が0になっているので戻し、メモリ35まで飛ぶ >>-] ☆のときのifの残骸処理
入力と判定部分の注意 ・dが押されたときの判定。値の右が欄外の時、そこのメモリの値は1でなく10なので、そこ も変わる。 >>++++++++++[-<---------->]< >+<[>-<[-]]>[ >>+++++[<+++++>-] >>+++++[<+++++>-] <<<<<<<<<[<] >----------[ [<+>-]<++++++++++>]
++++++++++<[>----------]>>[>] >>>>-]