ange1のブログスマートフォン用の表示で見るange1のブログこの広告は、90日以上更新していないブログに表示しています。非破壊的条件分岐Brainf**kはじめにいよいよ今回で条件分岐の最後の話題になります。ideoneオンラインのIDE環境で、bffという処理系が使えます。この講座は基本的にこのbffに対応したものです。Brainf**kインタープリタあじさんという方が作られたブラウザ上で動くインタプリタです。細かい挙動の調整や、途中のセルの状態のダンプができたり、重宝しています。終端」を「-1」と設定すると、bffと同じ挙動になります。これまでに出てきた条件分岐は、いずれのパターンでも、最終的には条件変数を必ずクリアしていました。分岐に入った場合で位置を合わせ、のちの処理で齟齬が出ないようにするためです。それでは、後で利用したいデータを条件変数とすることができなくなってしまいます。そこで、非破壊的な条件分岐を紹介します。シンプルな解決策:条件変数のバックアップただし、これまでのように条件変数をクリアしてしまう実装でも、特に問題ないようにすることは可能です。それは、条件変数のバックアップを取ることです。次のような処理になります。)残ったバックアップ用を元のセルに移動する特に、前回の多段化した分岐を行う場合等、どうしても条件変数を壊していかないといけませんから、このような方法を採らざるを得ません。条件判断が「0か非0か」だけで済むのであれば、もっと別な方法があります。して取り上げるのは、非同期的な条件分岐です。「非同期」というのは何かというと、ifの処理で]から出る時に、[で入った位置と別の位置で出る、すなわち、ifの処理に進まなかった場合に位置がずれることを言っています。別の位置で出る以上、条件変数をクリアする必要がありません。そのため、非破壊的な条件分岐に使えるということになります。それだとif文が終わった時の位置が不定になってしまうため、そのままでは以降の処理に齟齬が出ます。処理を設け、ずれを解消するようにします。典型的には、次のようなコードが考えられます。ifの処理の]の直後では、C,Eどちらのセルにいるか分かりませんが、elseの処理に入った時には明確にEにいます。出るようにすることで、最終的に位置を合わせます。図示すると次の通りです。このコードではelseの処理でEをクリアしていますが、elseの[]から出る時も位置がずれますので、実はクリアしなくても済みます。いうことで、前回までで紹介した条件分岐ではEは明確にelse用の条件変数として使うものでしたが、非同期的なものでは、単に非ゼロなセルであれば流用できたりします。FizzBuzzのFizzのみでは、実例として、FizzBuzz...だと数字の出力がありますので、簡単のために「Fizzのみ」を挙げたいと思います。ありますが、それはまだやっていないので、3周期のカウンターを設けて対処したいと思います。Rubyで書くと次のようなコードになります。end}これをBraif**kで書くと次のようになります。動作をシミュレートすれば、大丈夫かと思います。まとめ条件変数を保存して条件分岐したい場合、バックアップを取る方法と非同期的な方法がある非同期的な方法では、ifの処理に入るかどうかでセルの位置がずれる非同期的な方法では、elseの処理でずれた位置を調整するバックアップを取る場合はバックアップ用のセルが、非同期的な方法では位置調整用のブランクセルが必要となる終わりにこれで条件分岐も終わりとなりました。非同期的な条件分岐は少し難しいですが、簡潔で短いコードを書くためには避けられないところです。次回からは実際の問題に対処するための幾つかの典型的な処理を紹介しようと思います。2016、10日目の記事です。今回でいよいよ最後になりました。)月別アーカイブはてなブログをはじめよう!ange1さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。