BrainFuck で棒グラフ(2)

This entry was posted by on Wednesday, 6 September, 2006
>2ケタ以上に対応させた。 0 の処理がなかなか思い浮かばず苦労しました。 > >++++++++++
>>++++++[<+++++++>-]
>+[
[-]>[-]>[-]<<<,[>+>+>+<<<-]
++++++++++[>-<-]
>>>>>>++++[<++++++++>-]<[<<<->>>-]
+<<<[>>>->+<<<<[-]]>>>[<[<<<<<.>>>>>-]<<<<<<.>>>>>>>[-]]>
[-<<[>++++++++++<-]>[<+>-]>
++++++[<++++++++>-]<[<<->>-]<<[>+<-]>>>]<<<<<
]
> >数値を入力してからスペースを入れると、その数だけ * が印字されます。エンターキーで終了します。例によって、数値、スペース、エンター以外のものを入力すると狂います。 > >ちょっとコードの解説をしましょうか。メモリの n 番地を、ひとまず {n} と書くことにしましょう。どういう用途で各メモリ番地を利用しているかというと、 > > >{0}: 改行文字(出力用) > > > >{1}: '*'(出力用) > > > >{2}: 読み取りバッファ > > > >{3}: 改行文字かどうかの判定 > > > >{4}: 空白文字かどうかの判定 > > > >{5}: 数値バッファ > > > >{6}: 現在入力中の数値の保持 > > > >{7}〜{9}: テンポラリ領域 > > > > >となっています。 > >最初の2行は、出力用の文字をセットしているだけで、特に問題ないでしょう。10は下手な小細工をするより + を重ねた方が文字数が短い。 > >3行目からメインループが始まります。ちょっとした小細工がありまして、ループ開始時点でポインタは {3} に合わせらています。 > >4行目は、無用なバッファをゼロクリアしてから1文字を {2} に読み出し、 {3}、{4}、{5} にコピーしています。この時点で {2} はゼロになります。 > >5行目。 {2} に10を代入し、 {3} から 10 を引いています。改行文字の文字コードは10ですから、 {3} は「入力された文字が改行文字のとき0」になります。これは後で使います。なんで最初に書いているかというと理由はありません。 > >6-7行目で、スペースの文字判定をしています。スペースのコードは32=4×8 なので {7} と {8} を使って {7} に 32 を代入します。その分、 {4} を引けばいいのですが、 {4} がゼロのときだけ実行したいのでちょっと困ります。そこで、引き算をしてたったいま 0 になった {7} に 1 を代入し、 {4} が 0 でないときに {7} から 1 を引いて 0 にすることで、 {4} が 0 のときだけ {7} が 1 になるようにしています。またついでに、 {4} が 0 でないときに {8} を 1 にしています。 > >で、 {7} が 0 でないとき、つまり {4} が 0 のときですが、出力処理を行います。このとき {6} に数値が入っているはずなので、その数だけ * を出力し、それから改行し、そしてポインタを {7} に戻してゼロクリアしています。そして 7 行目末でポインタを {8} に移します。 > >8-9行目は数値文字が入力されたときの処理ですが、これは全体が > >数値を足す処理は2ステップに分かれています。まず8行目では {6} を10倍しています。まず {6}×10 を {7} に格納し、それをまた {6} に戻すことでこの処理を行います。9行目では、まず{7}と{8}を使って6×8=48('0'の文字コード)を作り、そのぶんだけ {5} を減らします。で、残りだけさらに {6} を足します。これで {6} = {6} * 10 + ({5} - '0') 相当な処理を行いました。ポインタは忘れずに {8} に戻します。ここで {8} はどっちみちゼロになっていますからゼロクリアしていません。 > >最後に、ポインタをふたたび {3} にセットしてループ終端。 {3} は入力された文字が改行文字のとき 0 になりますから、エンターを入力したときにループを脱出し、終了します。 > >ということでした。 >

Comments are closed.