三流プログラマの戯言

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

brainfuck 入門:文字列の受け取り

概要

今回は文字の入力に関して説明します。数値の入力ではないです。ごめんなさい。


目次


文字列読み込み

1 行読み込み

brainfuck では 1 行読み取るという高度なことはできないので、改行文字まで読み取るということをします。ここで改行コードは \n (=10)とします。

,----------
[
  ++++++++++ 
  code 
  ,----------
]

読み取った値から 10 引いて 0 であれば処理を抜けるというコードになります。 3行目で 10 を足していますが、これは元の文字コードに戻す処理なので、文字数を数える場合などでは不必要となります。
また、メモリに展開したい場合は、

,----------
[
  ++++++++++ 
  >
  ,----------
]

と書くことができます。

スペースまでの読み取り

時々、スペースまでを読み取りたい時があります。そういった場合には、 1 行読み取りの\n の代わりに空白 (=32) で判断することができます。

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

インクリメント、デクリメントを 32 回行う代わりに、ループで処理しています。

改行またはスペースまでの読み取り

改行とスペースの両方の区切り文字で読み取りを終了を行いたい場合、一方のみの時と比べてめんどくさいコードになります。

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

読み取りを行うメモリの右側を区切り文字以外が入力されたかどうかをフラグ管理しています。


問題例

  • ABC 072 B - OddString
    AtCoderbrainfuck やってる人には有名な問題です。AtCoder での色々な裁定を知っていれば、9 byte で解くことができます。
    しかし、ここまでの知識を駆使すれば裁定を知らなくても解くことができます。
    ただし、AtCoder では 10000 文字をメモリに展開できないので気を付けてください。


次回

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


記事一覧

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