4
Most read
8
Most read
24
Most read
実用Brainf*ckプログラミング
入門編
KMC1回生 prime(twitter:@_primenumber)
はじめに:Brainf*ckとは
● 命令記号は+-><[].,の8種類だけ!
● 1993年にできた、できるだけコンパイラが小さくなるよう
なプログラミング言語
● 難解になるべくして生まれたわけではない
● 実際、命令記号は読みやすいように選ばれている
● 処理系が作りやすいので、しばしばプログラミングの練習
問題としてBrainf*ckインタプリタの作成をさせたり、派
生言語が作られたりする
言語仕様
● はじめに0で初期化された十分な長さの配列が与えられる
● C言語で言うポインタを操作して動作。最初は0番地
● +/- ポインタの指す値を1増やす/減らす
● >/< ポインタをインクリメント/デクリメントする
● [ ポインタの指す値が非0なら対応する]の直後にジャンプ
● ] ポインタの指す値が0なら対応する[の直後にジャンプ
● . ポインタの指す値を文字として出力する
● , 入力から1バイト読み、ポインタの指す値に代入する
● これら8種類の文字以外については動作は未定義だが、
多くの処理系では無視する
Brainf*ckでできること
● これだけの命令記号で(無限長の配列なら)チューリング
完全
– 他のプログラミング言語でできることなら(理論上)な
んでもできる
● でも実際に実装するのはほぼ無理でしょ?
Brainf*ckでできること
● これだけの命令記号で(無限長の配列なら)チューリング
完全
– 他のプログラミング言語でできることなら(理論上)な
んでもできる
● でも実際に実装するのはほぼ無理でしょ?
→実はある程度のパターンを覚えれば、
わりと実装できる!!!
今日やること
● 入門編なので少しだけ
● 値のクリア・代入、足し算/引き算、値のコピー、掛け
算、スタック
● 最後にこれらを使って実際に動くプログラムを作ります
● 説明の中で省略記号を使います
– ポインタが最初に指している場所を[0]と書き、[n]
でそこからn番地進んだ場所を表す
値のクリア・代入
● 値をクリアしたり代入するとき
● 値のクリア:[0]の値を0にする
● [-]
● 動作:[0]の値が0になるまで1減らす
● 値の代入:[0]の値を5にする
● [-]+++++
● 動作:[0]の値をクリアして5を足す
足し算・引き算
● かなり使う
● 足し算:[0]の値を[1]に足す([0]の値は消える)
[>+<-]
● 動作:「[1]の値を1増やし、[0]の値を1減らす」を[0]が
0になるまで繰り返す
● [1]の値が0なら値の移動になる
● 引き算:[0]の値を[1]から引く
[>-<-]
値のコピー
● 足し算や引き算をするとどちらかの値が消えてしまう
● Brainf*ckではほとんど非破壊的な動作はできない
● →値のコピーが必要
● 値のコピー:[0]の値を[1]にコピー([2]を一時変数とし
て使う)
[>+>+<<-]>>[<<+>>-]
● [0]の値を[1]と[2]に書き込む([0]の値は消える)
● [2]の値を[0]に書き込む([2]の値は消える)
掛け算
● 足し算と値のコピーを繰り返す
● 掛け算:[0]と[1]の積を[2]に書き込む([3]を使う)
[<[>>+>+<<<-]>>>[<<<+>>>-]<<-]
● [0]の値を[2]と[3]に足し、[3]の値を[0]に書き込む
● [1]の値を1減らす
● これを[1]の値が0になるまで繰り返す
● 定数の掛け算は簡単にできる
● 定数の掛け算:[0]の5倍を[1]に入れる
[>+++++<-]
スタック
● そもそもBrainf*ckはデータメモリがそのままスタック
に使える
● スタックに積む
(値を書き込む)>
● スタックから値を取り出す
<(値を使う)
● サンプル:
まずスタックに3つ値を積む
スタックから2つ取り出し積を計算して値を積む
再帰
● 関数の中でその関数自身を呼び出すこと
● うまく使うとプログラムが簡単に書ける
● 実は再帰はスタックを使って書ける!
再帰
● 関数の中でその関数自身を呼び出すこと
● うまく使うとプログラムが簡単に書ける
● 実は再帰はスタックを使って書ける!
● →Brainf*ckはスタックが書ける!!
再帰
● 関数の中でその関数自身を呼び出すこと
● うまく使うとプログラムが簡単に書ける
● 実は再帰はスタックを使って書ける!
● →Brainf*ckはスタックが書ける!!
● →Brainf*ckでは再帰が書ける!!!!
再帰
● 関数の中でその関数自身を呼び出すこと
● うまく使うとプログラムが簡単に書ける
● 実は再帰はスタックを使って書ける!
● →Brainf*ckはスタックが書ける!!
● →Brainf*ckでは再帰が書ける!!!!
● サンプル用意するのがめんどくさい&最後に再帰のプログ
ラムを書くのでサンプルは省きます
ハノイの塔
以下のルールに従ってすべての円盤を右端の杭に移動さ
せられれば完成。
● 3本の杭と、中央に穴の開いた大きさの異なる複数の円盤
から構成される。
● 最初はすべての円盤が左端の杭に小さいものが上になる
ように順に積み重ねられている。
● 円盤を一回に一枚ずつどれかの杭に移動させることがで
きるが、小さな円盤の上に大きな円盤を乗せることはで
きない。
From Wikipedia
ハノイの塔
● ハノイの塔は再帰的な方法で最短で解けることが知られ
ている
● 解法
– 何らかの方法でn-1枚の円盤を左端の杭から中央の杭
に移動させる
– 一番大きな円盤を左端の杭から右端の杭に移動させる
– 何らかの方法でn-1枚の円盤を中央の杭から右端の杭
に移動させる
● これをBrainf*ckで実装しよう!
● 動かすべき円盤とどこからどこに動かすかを出力する
Brainf*ckでハノイの塔
● 擬似コードで書くと
– Hanoi(n,a,b) //n枚の円盤を左端からa番目の杭からb
番目の杭に移動させる
Hanoi(n-1,a,c)
Move(n,a,b)
Hanoi(n-1,c,b)
● cは{1,2,3}のうちaでもbでもない数
● Move(k,a,b)はk枚目の円盤を左端からa番目の杭からb番
目の杭に移動させる
Brainf*ckでハノイの塔
● 「{1,2,3}のうちaでもbでもない数」は、6-a-bで求めら
れる
● 再帰の中でMoveという別の関数を呼ぶのに相当する処理
するのは割と難しい
– Hanoiに引数をひとつ増やしてHanoi(n,s,a,b)とし
て、s=1ならHanoi,s=0ならMoveということにする
● したがって、スタックで実装するときに積むデータの組
はn,s,a,bの四つ組
● スタックに4個ずつ積んだり取り出したりすることで実装
できる
Brainf*ckでハノイの塔
1.最初にスタックに(n,s,a,b)=(n,1,1,3)を積む
2.スタックの一番上の値を読み、s=0なら6に飛ぶ
3.スタックから取り出した値が(n,1,a,b)だったとすると
それを消してスタックに(n-1,1,a,6-a-b),(n,0,a,b),
(n-1,1,6-a-b,b)を積む
4.スタックの一番上の値を読み、(1,*,*,*)でないなら3に
戻る
5.スタックの一番上の値を読み、sを1から0にする
6.スタックから取り出した値を出力する。たとえば
(3,0,1,3)だったらC 1 3を出力する
7.スタックの一番上の値が(0,*,*,*)でないなら2に戻る
実際のコード(4枚Ver.)
>>>>++++>+>+>++
+<<<[>[<-[[>>>>+>>>>+>>>>+<<<<<<<<<<<<-]>[>>>>+>>
>>+>>>>+<<<<<<<<<<<<-]>[>>>>+>>>>+>>>>+<<<<<<<<<<
<<-]>[>>>>+>>>>+>>>>+<<<<<<<<<<<<-]<+++++
+>>+>->>>>>>>[<<<<<<<<<<<<+>>>>>>>>>>>>-]>[<<<<<<
<<<<<<+>>>>>>>>>>>>-]>[<<<<<<<<<<<<->>>>>>>>>>>>-
]>[<<<<<<<<<<<<+<->>>>>>>>>>>>>-]<<<<<[>>+>+<<<-]
>[>+<-]++++++>[<->-]>[<<<+>>>-]<<<<<-]+>-]+++++++
+[>++++++>++++++<<<++++++++>-]>>>>++++[<+++++++
+>-]<<<<<.[-]>>>>.<<.[-]>>.[-]<.[-]++++++++++.
[-]<<<<<<<]
(454bytes)
まとめ
● 一見Brainf*ckで実装するのが難しそうなものでも要素
要素に分解していくとそこまで大変ではない(こともあ
る)
● 今回は入門編でしたがそのうち初級編/中級編/上級編
もやりたいと思います
● 初級編は数値の比較、割り算の商と余り、配列を考えて
います
おまけ
● 最近Brainf*ckでメタプログラミングできる拡張bfmeta
を作りました
● データメモリとプログラムメモリが同一になっていて、
プログラム実行中にそのプログラム自身を書き換えられ
るという仕組み
● それに従い、終了条件をプログラムカウンタの指す値
が0になったら、に変更
● よくある記号を増やしたりただ置き換えたりするクソみ
たいなBrainf*ck拡張と違って、同じ記号でプログラミ
ングするのに、はるかに強力な言語になる
● メタプログラミングあんまりやってないのでどんなこと
をやると楽しいか教えてください
おわり

More Related Content

PDF
実用Brainf*ckプログラミング
PPTX
AtCoder Beginner Contest 002 解説
PPTX
AtCoder Beginner Contest 012 解説
PDF
競技プログラミング頻出アルゴリズム攻略
PDF
AtCoder Regular Contest 031 解説
PDF
AtCoder Beginner Contest 008 解説
PPTX
AtCoder Regular Contest 029 解説
PDF
プログラミングコンテストでのデータ構造
実用Brainf*ckプログラミング
AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 012 解説
競技プログラミング頻出アルゴリズム攻略
AtCoder Regular Contest 031 解説
AtCoder Beginner Contest 008 解説
AtCoder Regular Contest 029 解説
プログラミングコンテストでのデータ構造

What's hot (20)

PDF
ダブリング
PDF
幾何コンテスト2013
PDF
競プロは社会の役に立たない+ベンチャー企業の話 (NPCA夏合宿OB講演).pdf
PDF
AtCoder Regular Contest 028 解説
PDF
図と実装で理解する『木構造入門』
PDF
AtCoder Beginner Contest 026 解説
PDF
abc032
PDF
brainfuckを吐く自作言語bf-reusable
PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
PDF
最小カットを使って「燃やす埋める問題」を解く
PDF
AtCoder Beginner Contest 007 解説
PDF
AtCoder Regular Contest 040 解説
PDF
AtCoder Beginner Contest 006 解説
PPTX
AtCoder Beginner Contest 034 解説
PDF
AtCoder Beginner Contest 029 解説
PDF
プログラミングコンテストでの動的計画法
PDF
Re永続データ構造が分からない人のためのスライド
ダブリング
幾何コンテスト2013
競プロは社会の役に立たない+ベンチャー企業の話 (NPCA夏合宿OB講演).pdf
AtCoder Regular Contest 028 解説
図と実装で理解する『木構造入門』
AtCoder Beginner Contest 026 解説
abc032
brainfuckを吐く自作言語bf-reusable
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
最小カットを使って「燃やす埋める問題」を解く
AtCoder Beginner Contest 007 解説
AtCoder Regular Contest 040 解説
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 029 解説
プログラミングコンテストでの動的計画法
Re永続データ構造が分からない人のためのスライド
Ad

Viewers also liked (18)

PDF
明日使えないすごいビット演算
PDF
プログラムを高速化する話
PDF
PietでLISP処理系を書くのは難しい
PDF
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
PDF
C#でゲームを作る2016 第8回
PDF
MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた
KEY
Functional Pearl + Brainfuck
PDF
brainfuckであそぼう #lldiver LT資料
PDF
Brainfuck interpreter 分析新竹碼農0307
PDF
Learn you a Brainfuck for great good!
PDF
Rubyで作る奇妙なプログラミング言語
PDF
「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川
ODP
ライフゲームでプログラミング
PDF
文字コード基礎論A
PDF
CTF for ビギナーズ ネットワーク講習資料
PDF
AtCoder Beginner Contest 020 解説
明日使えないすごいビット演算
プログラムを高速化する話
PietでLISP処理系を書くのは難しい
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
C#でゲームを作る2016 第8回
MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた
Functional Pearl + Brainfuck
brainfuckであそぼう #lldiver LT資料
Brainfuck interpreter 分析新竹碼農0307
Learn you a Brainfuck for great good!
Rubyで作る奇妙なプログラミング言語
「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川
ライフゲームでプログラミング
文字コード基礎論A
CTF for ビギナーズ ネットワーク講習資料
AtCoder Beginner Contest 020 解説
Ad

Similar to 実用Brainf*ckプログラミング入門編 (20)

PDF
2011年10月21日
PPTX
ゲーム組み込み用スクリプト言語を作ってみた
PDF
Lingua::EN::Fathom
PPTX
楽しいプログラミング
PPTX
Devel ptkdb - perlをグラフィカルにデバッグする
PDF
C#勉強会
PPT
第1回SE勉強会(080302)
PDF
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
PPTX
C#とILとネイティブと
PDF
KOGEI & KAIT Funnel WS
PDF
Robot Language and a Tail Recursive Interpreter
PDF
Learning Phrase Representations using RNN Encoder-Decoder for Statistical Mac...
PDF
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
PDF
競技プログラミングにおけるコードの書き方とその利便性
PDF
密着!わたしのコンソールアプリ開発環境
PDF
C・C++用のコードカバレッジツールを自作してみた話
PDF
Pyconjp2014_implementations
PPTX
Visual Studio Code でプログラムをデバッグしよう!
PDF
普段使用しているAIサービスとGitHub Copilot のベターな使い方について
PDF
【学習メモ#4th】12ステップで作る組込みOS自作入門
2011年10月21日
ゲーム組み込み用スクリプト言語を作ってみた
Lingua::EN::Fathom
楽しいプログラミング
Devel ptkdb - perlをグラフィカルにデバッグする
C#勉強会
第1回SE勉強会(080302)
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
C#とILとネイティブと
KOGEI & KAIT Funnel WS
Robot Language and a Tail Recursive Interpreter
Learning Phrase Representations using RNN Encoder-Decoder for Statistical Mac...
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
競技プログラミングにおけるコードの書き方とその利便性
密着!わたしのコンソールアプリ開発環境
C・C++用のコードカバレッジツールを自作してみた話
Pyconjp2014_implementations
Visual Studio Code でプログラムをデバッグしよう!
普段使用しているAIサービスとGitHub Copilot のベターな使い方について
【学習メモ#4th】12ステップで作る組込みOS自作入門

More from 京大 マイコンクラブ (20)

PDF
テキストファイルを読む💪 第1回
PDF
かわいくなろうとしたら語彙力が下がった話
PDF
Common Lisp入門
PDF
多倍長整数の乗算と高速フーリエ変換
PDF
つくってあそぼ ラムダ計算インタプリタ
PDF
Geometry with Unity
PDF
セミコロンレスc++
PDF
エンジニアと健康
PPTX
女の子になれなかった人のために
PDF
Pietで競プロしよう
ODP
もし太陽のコアがIntelCoreだったら
PDF
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
PDF
ドット絵でプログラミング!難解言語『Piet』勉強会
PDF
No SSH (@nojima; KMC関東例会)
PDF
DTM練習会2017第1.5回 「伴奏の付け方」
PPTX
hideya流 テストプレイ観察術
PDF
暗号技術入門 秘密の国のアリス 総集編
PDF
C#でゲームを作る2016 第7回
テキストファイルを読む💪 第1回
かわいくなろうとしたら語彙力が下がった話
Common Lisp入門
多倍長整数の乗算と高速フーリエ変換
つくってあそぼ ラムダ計算インタプリタ
Geometry with Unity
セミコロンレスc++
エンジニアと健康
女の子になれなかった人のために
Pietで競プロしよう
もし太陽のコアがIntelCoreだったら
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
プログラムを高速化する話Ⅱ 〜GPGPU編〜
ドット絵でプログラミング!難解言語『Piet』勉強会
No SSH (@nojima; KMC関東例会)
DTM練習会2017第1.5回 「伴奏の付け方」
hideya流 テストプレイ観察術
暗号技術入門 秘密の国のアリス 総集編
C#でゲームを作る2016 第7回

実用Brainf*ckプログラミング入門編