brainfuck 入門:ループ文と定数生成と文字出力
今回の主軸
今回は、文字出力の行い方を解説します。 プログラミング的には後でもいいんですけど、AtCoderをやるうえでは、かなり重要となるので、初めに説明しておきます。 また文字出力に必要となるループ文と定数生成の説明をしたいと思います。
目次
ループ (繰り返し)文
いきなりループかと思われるかもしれませんが、brainfuck
ではこれが最も基本的な構文となります。
掛け算や割り算、果ては加算減算ですら、ループ文が使用されます。
[- code ]
現在の値の回数だけ code
を実行します。-
はcode
の前でも後でも問題ないです。場合によって使い分けでください。
ただし、終了時に、繰り返し回数を格納していたメモリは 0
となります。
また、 code
の開始時と終了時にポインタの位置が同じである必要があります。
定数の生成
brainfuck
では定数の生成を行う場合は、値を定数回インクリメントします。以下は10
を生成するコードです
++++++++++
ただし、この方法で100
といった大きい数字を生成しようとした場合は多くの+
を書かないといけないことになります。
そこでそれを回避するために、ループ文を使用して生成します。
以下は100
を生成するコードです。
++++++++++[->++++++++++<]>
ただし、この方法で100
といった大きい数字を生成しようとした場合は多くの+
を書かないといけないことになります。
そこでそれを回避するために、ループ文を使用して生成します。
以下は100
を生成するコードです。
++++++++++[->++++++++++<]>
定数の変更
定数の生成を行うときに、すでにある定数を変更することによって新たな定数とすることができます。以下は、
まず、41
を生成して、その後80
にして、そのあと57
にするというプログラムです。
+++++[->++++++++<]>+ 41を生成 <+++++[->++++++++<]>- 80に変更 (40を足して1を引く) <+++++[->------<]>--- 57に変更 (20を引いて3を引く)
文字出力
一文字の出力
brainfuck
では文字は文字コードを生成して出力を行います。 例えば H
という文字を出力しようとした場合、H
の文字コードは 72 (=8x9)
なので、
++++++++[->+++++++++<]>.
とすることで H
を出力することができます。
複数文字の出力
複数の文字を出力する場合は毎回文字コードを生成するのは面倒なので、前回の値に増減させて表示を行うことがあります。
以下は Hello
を出力するプログラムです。 Hello
文字コードは順に、72,101,108,108, 111
です。
++++++++[->+++++++++<]>. <+++++[->++++++<]>-. +++++++.. +++.
ちなみに、言語仕様編 に記載されている Hello World.
は少し違った方法で実現しています。
問題例
- いろはちゃんコンテスト Day3 J - Go to Heaven
文字列を出力するだけでACが取れる問題もあります。
次回
次回は今度こそ基本構文の話しようと思います。