三流プログラマの戯言

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

brainfuck 入門:if 文と bool 演算

概要

今回は、if 文とそれに伴う bool 演算について解説します。等価、不等価も説明しますが、大小比較に関しては別記事で書こうと思っています。


目次


if

if

brainfuck は条件により分岐するのはループ文しかありません。そこで、ループ分を利用して if 文を構築します。ただし、 0false それ以外を true とします。

[[-] code ]

ループ内でデクリメントを行う代わりに、初期化を行うとで ループ回数を1 回にすることができます。

if-else

else 句を付ける場合はフラグを用いる必要があります。

>+<[[-]>-< if ]>[- else ]<

else 句では初期化ではなくデクリメントしてますが、フラグは 01 しかとらないので、問題ないです。(もちろん初期化をしても問題ないです。)フラグ管理は Not の項目を見てください。


bool 演算

bool 代数として、 0false 、それ以外を true とします。 ただし、brainfuck では true,false を使用できるわけではないので、false0true1 として表現することが多いです。この記事ではそのように表現することとします

bool 化 ((bool)value)

00 、 それ以外を 1 に変換するコードです。if 文で実現できます。

[[-]>+<]

変換結果は次のメモリに格納されます。

真理値反転 (!value)

Notif を利用して実装を行います。 具体的には、あらかじめフラグを立てておいて、if 句でフラグを下げることで、そのフラグ値が Not の結果となります。

>+<[[-]>-<]

演算の結果はひとつ右のメモリに格納されます。

不等価演算 (!=)

c++ における != 演算です。 以下の例では、0 番地と 1番地の値を比較しています。

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

また別の機会に説明しようと思いますが [->-<]は引き算を行います。 ただし、0 に対するデクリメントが 255 になる環境でのみ使用できます。0 に対するデクリメントが許可されない環境での不等価はまた別の機会に説明したいと思います。

等価演算 (==)

c++ における == 演算です。 以下の例では、0 番地と 1番地の値を比較しています。不等価演算と Not の組み合わせで実現できます。

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

不等価演算と同様に 0 に対するデクリメントが 255 となる環境でのみ使用できます。

if 文と bool 演算の組み合わせ

bool 演算の項目で、0,1 に変換する構文を書いてきましたが、実際には 0,1 に変換することなく if 文につなげることも多いです。 例えば不等価の時に処理したいときは、

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

というように書くことができます。
ただし、等価時に指定のコードを実行したい場合は、

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

という風に Not をとる必要がどうしても出てきます。 臨機応変に対応しましょう。

固定値との比較

比較対象が固定値であり、ハードコーディングできる場合は、直接数値を引くことができます。 例えば、20 かどうかの判別は

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

と書くことができます。(この例では結果は次のメモリに格納されます。)


問題例


次回

次回は、大小比較書きたいですね。


記事一覧

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