brainfuck 入門:if 文と bool 演算
概要
今回は、if
文とそれに伴う bool
演算について解説します。等価、不等価も説明しますが、大小比較に関しては別記事で書こうと思っています。
目次
if
文
if
文
brainfuck
は条件により分岐するのはループ文しかありません。そこで、ループ分を利用して if
文を構築します。ただし、 0
を false
それ以外を true
とします。
[[-] code ]
ループ内でデクリメントを行う代わりに、初期化を行うとで ループ回数を1
回にすることができます。
if-else
文
else
句を付ける場合はフラグを用いる必要があります。
>+<[[-]>-< if ]>[- else ]<
else
句では初期化ではなくデクリメントしてますが、フラグは 0
か 1
しかとらないので、問題ないです。(もちろん初期化をしても問題ないです。)フラグ管理は Not
の項目を見てください。
bool
演算
bool
代数として、 0
を false
、それ以外を true
とします。
ただし、brainfuck
では true,false
を使用できるわけではないので、false
を 0
、 true
を 1
として表現することが多いです。この記事ではそのように表現することとします
bool
化 ((bool)value)
0
を 0
、 それ以外を 1
に変換するコードです。if
文で実現できます。
[[-]>+<]
変換結果は次のメモリに格納されます。
真理値反転 (!value)
Not
は if
を利用して実装を行います。
具体的には、あらかじめフラグを立てておいて、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
かどうかの判別は
>++++[-<----->]<[[-]>+<]
と書くことができます。(この例では結果は次のメモリに格納されます。)
問題例
- ABC 070 A - Palindromic Number
等価比較を行うことでACすることが可能です。
次回
次回は、大小比較書きたいですね。
記事一覧
brainfuck 入門:リンクまとめ - 三流プログラマの戯言