三流プログラマの戯言

プログラミング初心者が気になったことを書き綴るだけ。主にc#

brainfuck 入門:値の移動とコピーと初期化と準非破壊ループ

概要

brainfuck を書く上で基本となる、値の移動、値のコピー、値の初期化および、準非破壊な繰り返し文の説明をします。

目次

構文解説

値の移動

brainfuck では、どのメモリに値があるかが重要になることが多々あります。そのため、望む位置に値を移動させることが重要となってきます。 値の移動は以下のコードで実現できます。

[->+<]

上記コードは一つ右に移動させます。ただし、移動先の初期値が 0 である必要があります。
また、>< を適切に変更することで任意の位置に値を移動させることができます。ただし、ループの開始と終了でポインタの位置が変化しないように気を付ける必要があります。

値のコピー

brainfuck では基本的に破壊的命令が多いです。そのため、一つの数値を使いまわすためには値をコピーすることが必要となります。値のコピーは以下のコードで実現できます。

[->+>+<<]

上記コードは値を次とその次のメモリに複製します。値の移動と同様に複製先の初期値が 0 である必要があることに気を付けてください。
また、最初に値があったポインタは 0 になることに気を付けてください。
最初の位置に値を復元したい場合は、値のコピーの後、値の移動を行う必要があります。

[->+>+<<]>>[-<<+>>]<<

これは、次のメモリに値をコピーするコードです。

値の初期化

値の移動やコピーで述べた通り、brainfuck の構文はいくつかのメモリが 0 となっている必要があることがあります。もちろん、メモリは 0 初期化されていますが、いくつかのコードの実行後に 0 であることが保証されないことも少なくありません。そこで、メモリの初期化をする必要が出てきます。以下のコードで実現できます。

[-]

メモリの値が 0 になるまで、デクリメントするだけです。

準非破壊ループ

完全に非破壊なループを組むことはできませんが、あらかじめ値のコピーを行うことでループ回数を保持したままループを行うことができます

[->+>+<<]>>[-<<+>>]<< >[- code]

ただし、値のコピーをループ文を一つにまとめることができます。

[->+ code <]>[-<+>]<

このコードを見てもらうとわかりますが、値の複製も、順非破壊ループを使用しているとも言えます。

問題例

今回の説明は基本的なため、特に問題例はありません。

次回

次回は、bool 演算と if 文を書きたいですね。

記事一覧

brainfuck 入門:リンクまとめ - 三流プログラマの戯言