SlideShare a Scribd company logo
Submit Search
Upload
Login
Signup
実用Brainf*ckプログラミング入門編
Report
京大 マイコンクラブ
Follow
Jul. 21, 2013
•
0 likes
•
8,415 views
1
of
24
実用Brainf*ckプログラミング入門編
Jul. 21, 2013
•
0 likes
•
8,415 views
Download Now
Download to read offline
Report
実用Brainf*ckプログラミング入門編 prime@KMC
京大 マイコンクラブ
Follow
Recommended
実用Brainf*ckプログラミング
京大 マイコンクラブ
17.1K views
•
145 slides
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Takuya Akiba
57.1K views
•
51 slides
ウェーブレット木の世界
Preferred Networks
55K views
•
67 slides
プログラミングコンテストでのデータ構造
Takuya Akiba
104.1K views
•
73 slides
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
18.1K views
•
29 slides
Pietのエディタを作った話
京大 マイコンクラブ
15.4K views
•
78 slides
More Related Content
What's hot
勉強か?趣味か?人生か?―プログラミングコンテストとは
Takuya Akiba
71.5K views
•
69 slides
Union find(素集合データ構造)
AtCoder Inc.
165.2K views
•
18 slides
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
10.7K views
•
45 slides
プログラムを高速化する話
京大 マイコンクラブ
241.3K views
•
120 slides
直交領域探索
okuraofvegetable
12.1K views
•
57 slides
フラグを愛でる
MITSUNARI Shigeo
7.7K views
•
24 slides
What's hot
(20)
勉強か?趣味か?人生か?―プログラミングコンテストとは
Takuya Akiba
•
71.5K views
Union find(素集合データ構造)
AtCoder Inc.
•
165.2K views
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
•
10.7K views
プログラムを高速化する話
京大 マイコンクラブ
•
241.3K views
直交領域探索
okuraofvegetable
•
12.1K views
フラグを愛でる
MITSUNARI Shigeo
•
7.7K views
Amortize analysis of Deque with 2 Stack
Ken Ogura
•
4.7K views
様々な全域木問題
tmaehara
•
37.4K views
高速な倍精度指数関数expの実装
MITSUNARI Shigeo
•
14.9K views
双対性
Yoichi Iwata
•
25.4K views
第21回アルゴリズム勉強会
Yuuki Ono
•
4.6K views
Rustで楽しむ競技プログラミング
yoshrc
•
3K views
Rolling hash
HCPC: 北海道大学競技プログラミングサークル
•
9.1K views
色々なダイクストラ高速化
yosupo
•
24.8K views
最大流 (max flow)
HCPC: 北海道大学競技プログラミングサークル
•
12.6K views
Pietで競プロしよう
京大 マイコンクラブ
•
4.5K views
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
•
6.4K views
AtCoder Regular Contest 030 解説
AtCoder Inc.
•
9.8K views
Convex Hull Trick
HCPC: 北海道大学競技プログラミングサークル
•
3.2K views
平面グラフと交通ネットワークのアルゴリズム
Takuya Akiba
•
26K views
Viewers also liked
BFmeta
京大 マイコンクラブ
2.6K views
•
10 slides
PietでLISP処理系を書くのは難しい
Hideaki Nagamine
3.8K views
•
121 slides
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
Ryo Sakamoto
8.8K views
•
45 slides
C#でゲームを作る2016 第8回
京大 マイコンクラブ
2.1K views
•
28 slides
MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた
Katsuhiro Endo
1.5K views
•
39 slides
Functional Pearl + Brainfuck
Eita Sugimoto
908 views
•
42 slides
Viewers also liked
(16)
BFmeta
京大 マイコンクラブ
•
2.6K views
PietでLISP処理系を書くのは難しい
Hideaki Nagamine
•
3.8K views
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
Ryo Sakamoto
•
8.8K views
C#でゲームを作る2016 第8回
京大 マイコンクラブ
•
2.1K views
MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた
Katsuhiro Endo
•
1.5K views
Functional Pearl + Brainfuck
Eita Sugimoto
•
908 views
brainfuckであそぼう #lldiver LT資料
Michihito Shigemura
•
1.4K views
Brainfuck interpreter 分析新竹碼農0307
Xatierlike Lee
•
901 views
Learn you a Brainfuck for great good!
Antoine Leblanc
•
1.7K views
Rubyで作る奇妙なプログラミング言語
toyoshi
•
2.8K views
「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川
kirin_nico
•
2.6K views
CUI3D
京大 マイコンクラブ
•
1.5K views
ライフゲームでプログラミング
Shinya Miyazaki
•
12.1K views
文字コード基礎論A
京大 マイコンクラブ
•
2K views
CTF for ビギナーズ ネットワーク講習資料
SECCON Beginners
•
43.9K views
AtCoder Beginner Contest 020 解説
AtCoder Inc.
•
11.9K views
Similar to 実用Brainf*ckプログラミング入門編
2011年10月21日
nukaemon
308 views
•
32 slides
ゲーム組み込み用スクリプト言語を作ってみた
MASA_T_O
4.3K views
•
20 slides
Lingua::EN::Fathom
Tetsuya Tatsumi
536 views
•
12 slides
楽しいプログラミング
明洋 庄司
1K views
•
24 slides
Devel ptkdb - perlをグラフィカルにデバッグする
Masaaki Takasago
1.3K views
•
9 slides
C#勉強会
hakugakucafe
1.6K views
•
26 slides
Similar to 実用Brainf*ckプログラミング入門編
(20)
2011年10月21日
nukaemon
•
308 views
ゲーム組み込み用スクリプト言語を作ってみた
MASA_T_O
•
4.3K views
Lingua::EN::Fathom
Tetsuya Tatsumi
•
536 views
楽しいプログラミング
明洋 庄司
•
1K views
Devel ptkdb - perlをグラフィカルにデバッグする
Masaaki Takasago
•
1.3K views
C#勉強会
hakugakucafe
•
1.6K views
第1回SE勉強会(080302)
柴田 篤志
•
373 views
複数のプログラム言語を学ぶ
potimarimo
•
544 views
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
parrotstudio
•
1.4K views
C#とILとネイティブと
信之 岩永
•
26.1K views
KOGEI & KAIT Funnel WS
Shigeru Kobayashi
•
442 views
Robot Language and a Tail Recursive Interpreter
たけおか しょうぞう
•
2.7K views
Learning Phrase Representations using RNN Encoder-Decoder for Statistical Mac...
Yuta Kikuchi
•
10.9K views
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
•
67K views
密着!わたしのコンソールアプリ開発環境
Fumihito Yokoyama
•
3.6K views
C・C++用のコードカバレッジツールを自作してみた話
simotin13 Miyazaki
•
464 views
Pyconjp2014_implementations
masahitojp
•
4.7K views
Visual Studio Code でプログラムをデバッグしよう!
m ishizaki
•
1.5K views
【学習メモ#4th】12ステップで作る組込みOS自作入門
sandai
•
2.9K views
DockerHubを活用してAnsibleのPlaybookを自動ビルドする
Koji Shiraishi
•
1.9K views
More from 京大 マイコンクラブ
Common Lisp入門
京大 マイコンクラブ
1.9K views
•
267 slides
多倍長整数の乗算と高速フーリエ変換
京大 マイコンクラブ
3.2K views
•
32 slides
つくってあそぼ ラムダ計算インタプリタ
京大 マイコンクラブ
6.2K views
•
52 slides
Geometry with Unity
京大 マイコンクラブ
4.8K views
•
43 slides
セミコロンレスc++
京大 マイコンクラブ
5.8K views
•
17 slides
エンジニアと健康
京大 マイコンクラブ
6.1K views
•
57 slides
More from 京大 マイコンクラブ
(20)
Common Lisp入門
京大 マイコンクラブ
•
1.9K views
多倍長整数の乗算と高速フーリエ変換
京大 マイコンクラブ
•
3.2K views
つくってあそぼ ラムダ計算インタプリタ
京大 マイコンクラブ
•
6.2K views
Geometry with Unity
京大 マイコンクラブ
•
4.8K views
セミコロンレスc++
京大 マイコンクラブ
•
5.8K views
エンジニアと健康
京大 マイコンクラブ
•
6.1K views
女の子になれなかった人のために
京大 マイコンクラブ
•
15.7K views
もし太陽のコアがIntelCoreだったら
京大 マイコンクラブ
•
6K views
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
•
22.6K views
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
•
67.2K views
ドット絵でプログラミング!難解言語『Piet』勉強会
京大 マイコンクラブ
•
7.8K views
No SSH (@nojima; KMC関東例会)
京大 マイコンクラブ
•
2K views
DTM練習会2017第1.5回 「伴奏の付け方」
京大 マイコンクラブ
•
1.8K views
hideya流 テストプレイ観察術
京大 マイコンクラブ
•
2.4K views
暗号技術入門 秘密の国のアリス 総集編
京大 マイコンクラブ
•
8.2K views
Altseed
京大 マイコンクラブ
•
3.4K views
C#でゲームを作る2016 第7回
京大 マイコンクラブ
•
1.5K views
C#でゲームを作る2016 第5回
京大 マイコンクラブ
•
1.6K views
C#でゲームを作る2016 第3回
京大 マイコンクラブ
•
1.2K views
C#でゲームを作る2016 第1回
京大 マイコンクラブ
•
1.5K views
実用Brainf*ckプログラミング入門編
1.
実用Brainf*ckプログラミング 入門編 KMC1回生 prime(twitter:@_primenumber)
2.
はじめに:Brainf*ckとは ● 命令記号は+-><[].,の8種類だけ! ● 1993年にできた、できるだけコンパイラが小さくなるよう なプログラミング言語 ●
難解になるべくして生まれたわけではない ● 実際、命令記号は読みやすいように選ばれている ● 処理系が作りやすいので、しばしばプログラミングの練習 問題としてBrainf*ckインタプリタの作成をさせたり、派 生言語が作られたりする
3.
言語仕様 ● はじめに0で初期化された十分な長さの配列が与えられる ● C言語で言うポインタを操作して動作。最初は0番地 ●
+/- ポインタの指す値を1増やす/減らす ● >/< ポインタをインクリメント/デクリメントする ● [ ポインタの指す値が非0なら対応する]の直後にジャンプ ● ] ポインタの指す値が0なら対応する[の直後にジャンプ ● . ポインタの指す値を文字として出力する ● , 入力から1バイト読み、ポインタの指す値に代入する ● これら8種類の文字以外については動作は未定義だが、 多くの処理系では無視する
4.
Brainf*ckでできること ● これだけの命令記号で(無限長の配列なら)チューリング 完全 – 他のプログラミング言語でできることなら(理論上)な んでもできる ●
でも実際に実装するのはほぼ無理でしょ?
5.
Brainf*ckでできること ● これだけの命令記号で(無限長の配列なら)チューリング 完全 – 他のプログラミング言語でできることなら(理論上)な んでもできる ●
でも実際に実装するのはほぼ無理でしょ? →実はある程度のパターンを覚えれば、 わりと実装できる!!!
6.
今日やること ● 入門編なので少しだけ ● 値のクリア・代入、足し算/引き算、値のコピー、掛け 算、スタック ●
最後にこれらを使って実際に動くプログラムを作ります ● 説明の中で省略記号を使います – ポインタが最初に指している場所を[0]と書き、[n] でそこからn番地進んだ場所を表す
7.
値のクリア・代入 ● 値をクリアしたり代入するとき ● 値のクリア:[0]の値を0にする ●
[-] ● 動作:[0]の値が0になるまで1減らす ● 値の代入:[0]の値を5にする ● [-]+++++ ● 動作:[0]の値をクリアして5を足す
8.
足し算・引き算 ● かなり使う ● 足し算:[0]の値を[1]に足す([0]の値は消える) [>+<-] ●
動作:「[1]の値を1増やし、[0]の値を1減らす」を[0]が 0になるまで繰り返す ● [1]の値が0なら値の移動になる ● 引き算:[0]の値を[1]から引く [>-<-]
9.
値のコピー ● 足し算や引き算をするとどちらかの値が消えてしまう ● Brainf*ckではほとんど非破壊的な動作はできない ●
→値のコピーが必要 ● 値のコピー:[0]の値を[1]にコピー([2]を一時変数とし て使う) [>+>+<<-]>>[<<+>>-] ● [0]の値を[1]と[2]に書き込む([0]の値は消える) ● [2]の値を[0]に書き込む([2]の値は消える)
10.
掛け算 ● 足し算と値のコピーを繰り返す ● 掛け算:[0]と[1]の積を[2]に書き込む([3]を使う) [<[>>+>+<<<-]>>>[<<<+>>>-]<<-] ●
[0]の値を[2]と[3]に足し、[3]の値を[0]に書き込む ● [1]の値を1減らす ● これを[1]の値が0になるまで繰り返す ● 定数の掛け算は簡単にできる ● 定数の掛け算:[0]の5倍を[1]に入れる [>+++++<-]
11.
スタック ● そもそもBrainf*ckはデータメモリがそのままスタック に使える ● スタックに積む (値を書き込む)> ●
スタックから値を取り出す <(値を使う) ● サンプル: まずスタックに3つ値を積む スタックから2つ取り出し積を計算して値を積む
12.
再帰 ● 関数の中でその関数自身を呼び出すこと ● うまく使うとプログラムが簡単に書ける ●
実は再帰はスタックを使って書ける!
13.
再帰 ● 関数の中でその関数自身を呼び出すこと ● うまく使うとプログラムが簡単に書ける ●
実は再帰はスタックを使って書ける! ● →Brainf*ckはスタックが書ける!!
14.
再帰 ● 関数の中でその関数自身を呼び出すこと ● うまく使うとプログラムが簡単に書ける ●
実は再帰はスタックを使って書ける! ● →Brainf*ckはスタックが書ける!! ● →Brainf*ckでは再帰が書ける!!!!
15.
再帰 ● 関数の中でその関数自身を呼び出すこと ● うまく使うとプログラムが簡単に書ける ●
実は再帰はスタックを使って書ける! ● →Brainf*ckはスタックが書ける!! ● →Brainf*ckでは再帰が書ける!!!! ● サンプル用意するのがめんどくさい&最後に再帰のプログ ラムを書くのでサンプルは省きます
16.
ハノイの塔 以下のルールに従ってすべての円盤を右端の杭に移動さ せられれば完成。 ● 3本の杭と、中央に穴の開いた大きさの異なる複数の円盤 から構成される。 ● 最初はすべての円盤が左端の杭に小さいものが上になる ように順に積み重ねられている。 ●
円盤を一回に一枚ずつどれかの杭に移動させることがで きるが、小さな円盤の上に大きな円盤を乗せることはで きない。 From Wikipedia
17.
ハノイの塔 ● ハノイの塔は再帰的な方法で最短で解けることが知られ ている ● 解法 –
何らかの方法でn-1枚の円盤を左端の杭から中央の杭 に移動させる – 一番大きな円盤を左端の杭から右端の杭に移動させる – 何らかの方法でn-1枚の円盤を中央の杭から右端の杭 に移動させる ● これをBrainf*ckで実装しよう! ● 動かすべき円盤とどこからどこに動かすかを出力する
18.
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番 目の杭に移動させる
19.
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個ずつ積んだり取り出したりすることで実装 できる
20.
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に戻る
21.
実際のコード(4枚Ver.) >>>>++++>+>+>++ +<<<[>[<-[[>>>>+>>>>+>>>>+<<<<<<<<<<<<-]>[>>>>+>> >>+>>>>+<<<<<<<<<<<<-]>[>>>>+>>>>+>>>>+<<<<<<<<<< <<-]>[>>>>+>>>>+>>>>+<<<<<<<<<<<<-]<+++++ +>>+>->>>>>>>[<<<<<<<<<<<<+>>>>>>>>>>>>-]>[<<<<<< <<<<<<+>>>>>>>>>>>>-]>[<<<<<<<<<<<<->>>>>>>>>>>>- ]>[<<<<<<<<<<<<+<->>>>>>>>>>>>>-]<<<<<[>>+>+<<<-] >[>+<-]++++++>[<->-]>[<<<+>>>-]<<<<<-]+>-]+++++++ +[>++++++>++++++<<<++++++++>-]>>>>++++[<+++++++ +>-]<<<<<.[-]>>>>.<<.[-]>>.[-]<.[-]++++++++++. [-]<<<<<<<] (454bytes)
22.
まとめ ● 一見Brainf*ckで実装するのが難しそうなものでも要素 要素に分解していくとそこまで大変ではない(こともあ る) ● 今回は入門編でしたがそのうち初級編/中級編/上級編 もやりたいと思います ●
初級編は数値の比較、割り算の商と余り、配列を考えて います
23.
おまけ ● 最近Brainf*ckでメタプログラミングできる拡張bfmeta を作りました ● データメモリとプログラムメモリが同一になっていて、 プログラム実行中にそのプログラム自身を書き換えられ るという仕組み ●
それに従い、終了条件をプログラムカウンタの指す値 が0になったら、に変更 ● よくある記号を増やしたりただ置き換えたりするクソみ たいなBrainf*ck拡張と違って、同じ記号でプログラミ ングするのに、はるかに強力な言語になる ● メタプログラミングあんまりやってないのでどんなこと をやると楽しいか教えてください
24.
おわり