ange1のブログスマートフォン用の表示で見るange1のブログこの広告は、90日以上更新していないブログに表示しています。スライド型ループBrainf**kはじめに既に基本機能をマスターされたことと思われますBrainf**k講座、ループ処理の幅を広げるために、実践的なコードに触れていきたいと思います。数値入力と簡単なループ,による入力と数値解釈、簡単なループの実例スライド型ループループ継続の判断を行うセルの位置をずらしていくループ実行環境ideoneオンラインのIDE環境で、bffという処理系が使えます。この講座は基本的にこのbffに対応したものです。[Brainf**kインタープリタ(http://azisava.sakura.ne.jp/js/bf/)あじさんという方が作られたブラウザ上で動くインタプリタです。細かい挙動の調整や、途中のセルの状態のダンプができたり、重宝しています。終端」を「-1」と設定すると、bffと同じ挙動になります。今回の話題スライド型ループさて、今までのループでは、いずれかのセルを固定してカウントダウンすることで、ループ制御変数として使用するものでした。[でループに入る時と、]でループ終了判定を行う時は同一のセルにいる、ということです。]で同じセルにいなければならないという決まりはありません。「現在のセルが0かどうか」で挙動を変えるのみです。異なるセルを使うことで、例えば不定長の文字列等の処理に対応できるようになるなど、ループ処理の幅が広がります。これを便宜的にスライド型ループと呼ぶことにします。実例1:parindrome生成では実例を挙げて、スライド型ループがどのように使われるか見ていきたいと思います。ここでは、このような問題を考えます。なる数字を出力する※これ実は、CodeForcesで実際にあった問題だったりします。「元の数の桁を反転」ということは、入力された数字を全て覚えておく必要があるということです。入力に改行がない場合、Rubyで敢えて1文字毎のループで書くと次のようになります。cendではこれをBrainf**kで書くとどうなるでしょうか。文字列を保存する部分と、文字列を逆順に辿る部分と、2つのループが必要です。これらは、それぞれスライド型のループで実装することができます。保存するコードを見てみます。i-.>nn,+i],+[~,+]の形は、EOF検出まで文字を読み込むループとして、前回でも出た形です。違うところとしては、ループ内で>によってセルを移動することで、[,各]実行時のセル位置がずれていくことです。図示すると次のようになります。これにより、不定長の入力文字列を出力しながら、セルに保存していくことができました。減らしているのは、入力時に+で増やした分を元に戻すためです。n,+iのように表しています。セルの走査では今度は、セルに保存された各値を逆順に走査して出力していく部分です。桁数が固定であれば、.による出力と、<による移動を、特定の回数繰り返せば済むのですが、今回桁数は不定長になっています。そこで、「数字が途切れるところまで」という形でスライド型のループを実装します。なっていますから、そこまで移動したところでループから抜けることになります。図示すると次のようになります。