Upload
Download free for 30 days
Login
Submit Search
実用Brainf*ckプログラミング入門編
6 likes
8,611 views
京大 マイコンクラブ
実用Brainf*ckプログラミング入門編 prime@KMC
Read more
1 of 24
Download now
Downloaded 20 times
1
2
3
4
Most read
5
6
7
8
Most read
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Most read
More Related Content
PDF
実用Brainf*ckプログラミング
京大 マイコンクラブ
PPTX
AtCoder Beginner Contest 002 解説
AtCoder Inc.
PPTX
AtCoder Beginner Contest 012 解説
AtCoder Inc.
PDF
競技プログラミング頻出アルゴリズム攻略
K Moneto
PDF
AtCoder Regular Contest 031 解説
AtCoder Inc.
PDF
AtCoder Beginner Contest 008 解説
AtCoder Inc.
PPTX
AtCoder Regular Contest 029 解説
AtCoder Inc.
PDF
プログラミングコンテストでのデータ構造
Takuya Akiba
実用Brainf*ckプログラミング
京大 マイコンクラブ
AtCoder Beginner Contest 002 解説
AtCoder Inc.
AtCoder Beginner Contest 012 解説
AtCoder Inc.
競技プログラミング頻出アルゴリズム攻略
K Moneto
AtCoder Regular Contest 031 解説
AtCoder Inc.
AtCoder Beginner Contest 008 解説
AtCoder Inc.
AtCoder Regular Contest 029 解説
AtCoder Inc.
プログラミングコンテストでのデータ構造
Takuya Akiba
What's hot
(20)
PDF
ダブリング
satanic
PDF
幾何コンテスト2013
Naoto Mizuno
PDF
Binary indexed tree
HCPC: 北海道大学競技プログラミングサークル
PDF
最大流 (max flow)
HCPC: 北海道大学競技プログラミングサークル
PDF
競プロは社会の役に立たない+ベンチャー企業の話 (NPCA夏合宿OB講演).pdf
catupper
PDF
AtCoder Regular Contest 028 解説
AtCoder Inc.
PDF
図と実装で理解する『木構造入門』
Proktmr
PDF
AtCoder Beginner Contest 026 解説
AtCoder Inc.
PDF
abc032
AtCoder Inc.
PDF
brainfuckを吐く自作言語bf-reusable
roodni
PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Takuya Akiba
PDF
最小カットを使って「燃やす埋める問題」を解く
shindannin
PDF
Rolling hash
HCPC: 北海道大学競技プログラミングサークル
PDF
AtCoder Beginner Contest 007 解説
AtCoder Inc.
PDF
AtCoder Regular Contest 040 解説
AtCoder Inc.
PDF
AtCoder Beginner Contest 006 解説
AtCoder Inc.
PPTX
AtCoder Beginner Contest 034 解説
AtCoder Inc.
PDF
AtCoder Beginner Contest 029 解説
AtCoder Inc.
PDF
プログラミングコンテストでの動的計画法
Takuya Akiba
PDF
Re永続データ構造が分からない人のためのスライド
Masaki Hara
ダブリング
satanic
幾何コンテスト2013
Naoto Mizuno
Binary indexed tree
HCPC: 北海道大学競技プログラミングサークル
最大流 (max flow)
HCPC: 北海道大学競技プログラミングサークル
競プロは社会の役に立たない+ベンチャー企業の話 (NPCA夏合宿OB講演).pdf
catupper
AtCoder Regular Contest 028 解説
AtCoder Inc.
図と実装で理解する『木構造入門』
Proktmr
AtCoder Beginner Contest 026 解説
AtCoder Inc.
abc032
AtCoder Inc.
brainfuckを吐く自作言語bf-reusable
roodni
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Takuya Akiba
最小カットを使って「燃やす埋める問題」を解く
shindannin
Rolling hash
HCPC: 北海道大学競技プログラミングサークル
AtCoder Beginner Contest 007 解説
AtCoder Inc.
AtCoder Regular Contest 040 解説
AtCoder Inc.
AtCoder Beginner Contest 006 解説
AtCoder Inc.
AtCoder Beginner Contest 034 解説
AtCoder Inc.
AtCoder Beginner Contest 029 解説
AtCoder Inc.
プログラミングコンテストでの動的計画法
Takuya Akiba
Re永続データ構造が分からない人のためのスライド
Masaki Hara
Ad
Viewers also liked
(18)
PDF
BFmeta
京大 マイコンクラブ
PDF
明日使えないすごいビット演算
京大 マイコンクラブ
PDF
プログラムを高速化する話
京大 マイコンクラブ
PDF
PietでLISP処理系を書くのは難しい
Hideaki Nagamine
PDF
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
Ryo Sakamoto
PDF
C#でゲームを作る2016 第8回
京大 マイコンクラブ
PDF
MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた
Katsuhiro Endo
KEY
Functional Pearl + Brainfuck
Eita Sugimoto
PDF
brainfuckであそぼう #lldiver LT資料
Michihito Shigemura
PDF
Brainfuck interpreter 分析新竹碼農0307
Xatierlike Lee
PDF
Learn you a Brainfuck for great good!
Antoine Leblanc
PDF
Rubyで作る奇妙なプログラミング言語
toyoshi
PDF
「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川
kirin_nico
PDF
CUI3D
京大 マイコンクラブ
ODP
ライフゲームでプログラミング
Shinya Miyazaki
PDF
文字コード基礎論A
京大 マイコンクラブ
PDF
CTF for ビギナーズ ネットワーク講習資料
SECCON Beginners
PDF
AtCoder Beginner Contest 020 解説
AtCoder Inc.
BFmeta
京大 マイコンクラブ
明日使えないすごいビット演算
京大 マイコンクラブ
プログラムを高速化する話
京大 マイコンクラブ
PietでLISP処理系を書くのは難しい
Hideaki Nagamine
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
Ryo Sakamoto
C#でゲームを作る2016 第8回
京大 マイコンクラブ
MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた
Katsuhiro Endo
Functional Pearl + Brainfuck
Eita Sugimoto
brainfuckであそぼう #lldiver LT資料
Michihito Shigemura
Brainfuck interpreter 分析新竹碼農0307
Xatierlike Lee
Learn you a Brainfuck for great good!
Antoine Leblanc
Rubyで作る奇妙なプログラミング言語
toyoshi
「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川
kirin_nico
CUI3D
京大 マイコンクラブ
ライフゲームでプログラミング
Shinya Miyazaki
文字コード基礎論A
京大 マイコンクラブ
CTF for ビギナーズ ネットワーク講習資料
SECCON Beginners
AtCoder Beginner Contest 020 解説
AtCoder Inc.
Ad
Similar to 実用Brainf*ckプログラミング入門編
(20)
PDF
2011年10月21日
nukaemon
PPTX
ゲーム組み込み用スクリプト言語を作ってみた
MASA_T_O
PDF
Lingua::EN::Fathom
Tetsuya Tatsumi
PPTX
楽しいプログラミング
明洋 庄司
PPTX
Devel ptkdb - perlをグラフィカルにデバッグする
Masaaki Takasago
PDF
C#勉強会
hakugakucafe
PPT
第1回SE勉強会(080302)
柴田 篤志
PDF
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
parrotstudio
PPTX
C#とILとネイティブと
信之 岩永
PDF
KOGEI & KAIT Funnel WS
Shigeru Kobayashi
PDF
Robot Language and a Tail Recursive Interpreter
たけおか しょうぞう
PDF
Learning Phrase Representations using RNN Encoder-Decoder for Statistical Mac...
Yuta Kikuchi
PDF
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
PDF
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
PDF
密着!わたしのコンソールアプリ開発環境
Fumihito Yokoyama
PDF
C・C++用のコードカバレッジツールを自作してみた話
simotin13 Miyazaki
PDF
Pyconjp2014_implementations
masahitojp
PPTX
Visual Studio Code でプログラムをデバッグしよう!
m ishizaki
PDF
普段使用しているAIサービスとGitHub Copilot のベターな使い方について
keiyama7
PDF
【学習メモ#4th】12ステップで作る組込みOS自作入門
sandai
2011年10月21日
nukaemon
ゲーム組み込み用スクリプト言語を作ってみた
MASA_T_O
Lingua::EN::Fathom
Tetsuya Tatsumi
楽しいプログラミング
明洋 庄司
Devel ptkdb - perlをグラフィカルにデバッグする
Masaaki Takasago
C#勉強会
hakugakucafe
第1回SE勉強会(080302)
柴田 篤志
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
parrotstudio
C#とILとネイティブと
信之 岩永
KOGEI & KAIT Funnel WS
Shigeru Kobayashi
Robot Language and a Tail Recursive Interpreter
たけおか しょうぞう
Learning Phrase Representations using RNN Encoder-Decoder for Statistical Mac...
Yuta Kikuchi
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
密着!わたしのコンソールアプリ開発環境
Fumihito Yokoyama
C・C++用のコードカバレッジツールを自作してみた話
simotin13 Miyazaki
Pyconjp2014_implementations
masahitojp
Visual Studio Code でプログラムをデバッグしよう!
m ishizaki
普段使用しているAIサービスとGitHub Copilot のベターな使い方について
keiyama7
【学習メモ#4th】12ステップで作る組込みOS自作入門
sandai
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
Altseed
京大 マイコンクラブ
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流 テストプレイ観察術
京大 マイコンクラブ
暗号技術入門 秘密の国のアリス 総集編
京大 マイコンクラブ
Altseed
京大 マイコンクラブ
C#でゲームを作る2016 第7回
京大 マイコンクラブ
実用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.
おわり
Download