>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 になりますから、エンターを入力したときにループを脱出し、終了します。
>
>ということでした。
>