mickey24_bot de Brainf*ck

なんと,mickey24_botBrainf*ckインタプリタ機能を搭載しました.

http://twitter.com/mickey24_bot


こんな風にBrainf*ckのコードで話しかけると,

こんな風に実行結果をreplyで通知してくれます.

Hello, world!

Brainf*ckってなんなの

Brainf*ckは難解プログラミング言語のひとつです.十分なサイズのByte型配列のメモリとそれを指すポインタptrを使い,チューリングマシンのような処理を行うことができます.命令の記述方法が独特でソースコードを見ても一見何の処理を行っているのか分からないため,難解プログラミング言語と呼ばれています.詳細はWikipediaの記事を参照してください.
http://ja.wikipedia.org/wiki/Brainfuck


また,私が以前Tsukuba.R#4で発表した時に使ったスライドの前半にもBrainf*ckの紹介があります.興味がある方はぜひご覧ください.
http://www.slideshare.net/mickey24/rbrainfck-1085191

実行可能な命令

Brainf*ckで利用できる命令は以下の8つだけです.

命令対応するC言語説明
>ptr++;ポインタをインクリメントする.
<ptr--;ポインタをデクリメントする.
+(*ptr)++;ポインタが指すメモリの値をインクリメントする.
-(*ptr)--;ポインタが指すメモリの値をデクリメントする.
.putchar(*ptr);ポインタが指すメモリの値を出力する.
,*ptr = getchar();標準入力から1バイトを受けとりポインタが指すメモリに代入する.mickey24_botにおけるこの命令の扱いについては次項を参照.
[while(*ptr){ポインタが指すメモリの値が0なら,対応する]の直後までジャンプする.
]}ポインタが指すメモリの値が0でないなら、対応する[にジャンプする.
これらの命令を駆使すればmickey24_botに好きな文字列を発言させることが可能です.

細かい仕様について

以下はmickey24_botで動かせるBrainf*ckの仕様についてです.

mickey24_botがreplyをBrainf*ckのコードと判断する条件

mickey24_botに対するreplyの文字が><+-.,[]とスペースだけで構成されている場合,mickey24_botはreplyをBrainf*ckのコードと判断します.スペースはBrainf*ckの処理の際に無視されます.

「,」の扱い

「,」は標準入力から1バイト受け取りその値をptrが指すメモリに格納する命令ですが,mickey24_botではreplyを送ったユーザ名が標準入力として与えられているものとみなします.ユーザ名の長さを超えて「,」を繰り返すと,以降は0がメモリに格納されるようになります.ループの終了処理などにうまく使ってみてください.

「.」で出力される文字

「.」を実行すると,mickey24_botはptrが指すメモリの値に対応するASCIIコードの文字を出力します.頑張れば全角文字(UTF-8)を出力させることも可能です.

メモリがとりうる値の範囲

各メモリ領域は0から255までの8bit(1Byte)の値をとります.初期値は0となっています.メモリの値が255の時に「+」を実行した場合は循環して0に戻ります.逆も同様で,メモリの値が0の時に「-」を実行した場合は255になります.

実行ステップ数の上限

ひとつの命令に対する処理を1ステップとして数え,合計10,000ステップを超えた時点でBrainf*ckの実行は中断されます.これは無限ループを阻止するための仕様です.ステップ数が10,000を超えるプログラムを走らせたい場合は,mickey24_botのプレミアム会員に加入する必要があr

ポインタの移動可能な範囲

「<」を繰り返してポインタがメモリの負のアドレス(ptr < 0)に移動するとBrainf*ckの実行は中断されます.逆に「>」を繰り返してポインタの位置を正の方向に進めることはいくらでもできますが,前述の実行ステップの上限があるため,実質ptr = 10,000が上限となっています.

Brainf*ckのコード例

以下にmickey24_botで動かせるBrainf*ckのコードの簡単な例を載せておきます.


A (単純な書き方)

++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ +++++.

A (ループを使った書き方)

++++++++[>++++++++<-]>+.

Hello, world!

+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<++++++++.--------.+++.------.--------.>+.

自分のユーザ名を表示

,[.,]

Twitterのポストは140字以内という制約があるため,mickey24_botにある程度複雑な処理をさせるには工夫が必要です.是非いろいろチャレンジしてみてください.

以上

雨予報機能の方もよろしくお願いしますね!

更新履歴

  • 2009/05/07 この記事を作成.