実行環境によってはできないものもあります。ideoneのbffという処理系では最大の数は$2^{32}-1$ですが、この数を便宜上-1としています。数値の入力~1桁の場合さて、それでは数値が入力から与えられるような問題があった場合、どのように対処すれば良いでしょうか。簡単に、1桁の数値の時で考えます。すると、文字としての“0”~“9”の入力を,で扱う場合、文字コード48~57としてセルに保存されますから、そこから48を引くことで数値が得られることになります。入力時のセルをI、その右隣をTとすると、次のようなコードで、文字コード→数値変換ができ、Iのセルに変換した値が残ります。これは、前回のループをそのまま使っているものです。I,>T++++++[T-<I-------->T]T簡単なループそれでは、入力値によって繰り返し回数の変わる、簡単なループの例を挙げてみます。)これまでは、ループの回数はコード上の固定値でしたが、ここを入力由来の数値に置き換えれば良いです。次のような実装が考えられます。複雑なコードになってくると、こういった情報も載せておくと混乱が少なくなります。閑話休題、このコードは次のような構成になっています。)10行目は入力された数字を数値に変換12行目はループによる出力12行目のループで、各セルがどのように処理されているかを図解したのが次の図です。Iが8から始まった場合です。今回は、出力用の文字コードを1セルで共有し、“B”(66)→“F”(70)に増やしてまた元に戻す、ということを繰り返しています。)そして、Iが0になるまで2~4を繰り返すことで、入力された数字の回数分、“BF”が出力される、となります。複数桁の数字の解釈しかし、これでは1桁の数字しか対応できません。複数の、かつ不定長の桁数の数字に対応できなければ、実用としては厳しいでしょう。そこで、入力の処理をループにして、複数桁の数字を解釈する方法を考えてみます。数字は10進数で、上位の桁から入力されて来るわけなので、1桁増える毎にこれまで解釈された数値を10倍していけば、そしてそこに新たな桁分を加算していけば良いでしょう。Rubyで書くと次のような感じです。a=a*10+(i.ord-48)endこのような処理をBrainf**kで行う場合、入力文字を制御変数としたループを記述します。ここでは、改行無し、EOF(入力値-1)まで数字が続く場合の例を挙げます。(ループ内処理)I,+]基本的な骨組みは上のようになります。Iは入力文字コードを保存するセルです。ループ開始前と、各ループの最後に,で入力を行い、EOF(-1)かどうかを判定しています。なりますから、ループを終了するようになっています。10倍して新たな桁を足す処理を加えると、次のようになります。なっていることに注意してください。これは,の入力値を+1した状態でループに入っているからです。9個あって文章と合っていませんでした。昔の版をご覧になった方はご注意ください。ループ処理中の“x10”は前回出たループと同じです。A”によってAに戻します。これはループによる1倍の掛け算に相当します。今度、入力値IはAへの加算に使用します。これによって、ループを繰り返す毎に、これまで入力された桁分の数値がAに保存されるようになっています。それでは、先ほどの「入力された数字の分だけ“BF”を出力する」を複数桁に対応させたバージョンです。変えただけになっていることが分かるかと思います。保存します実行環境によりますが、セルの保持できる最大値から1増やすと0に戻り、0から1減らすと最大値になります。便宜上-1とはこの最大値のことを言います。入力した文字コードから48を引くことで数値に変換できます。入力文字コードに+1してEOFを検出することで入力ループを作ることができます。おわりにこれでもう既に、数値入力の処理ができるようになりました。Brainf**kの実力が上がっていくのが体感できることでしょう。次は、不定長の複数セルを活用するスライド型のループで、ループの幅を広げていきたいと思います。今回でいよいよ最後になりました。)月別アーカイブはてなブログをはじめよう!ange1さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。