AtCoder に登録したら解くべき精選過去問 10 問を Brainf*ck で解いてみた

# はじめに
[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067)で紹介されている問題を難解言語のBrainf*ckで解いてみました。

コードの詳しい解説は~~（私も読めないので）~~できませんが、雰囲気だけでも楽しんでいってください。

# Brainf*ckとは
コンパイラがなるべく小さくなるように考案された難解プログラミング言語です。

最初に各要素が0で初期化された配列と、その配列の最も左の要素（0番地）を指すように初期化されたポインタが与えられます。

プログラムは以下の8個の命令から成ります。

- `>` ポインタをインクリメントする
- `<` ポインタをデクリメントする
- `+` ポインタの指す値をインクリメントする
- `-` ポインタの指す値をデクリメントする
- `.` ポインタの指す値を出力する
- `,` 入力を1byte読み込み、ポインタの指す位置に代入する
- `[` ポインタの指す値が0なら対応する`]`にジャンプする
- `]` ポインタの指す値が0以外なら対応する`[`にジャンプする

制御構文には`[`と`]`を使いますが、0か0でないかという判定しかできないため、これをいかに使うかが重要です。

## AtCoder での Brainf*ckの扱いについて
なんとAtCoderではBrainf*ckのソースコードを提出することができます！
Brainf*ckの大まかな仕様は上記の通りなのですが、細かい仕様は処理系によって異なる部分があるので、以下AtCoderで採用されている処理系の仕様について少しだけ書いておきます。

- 配列に格納できる値は0から255
- 値が255の時に`+`を実行すると値が0になる。逆も同様。
- 配列の長さは9999
- 負番地にアクセスすると怒られる

この辺の話は[こちらのサイト](https://kimiyuki.net/blog/2016/03/21/brainfuck-on-services/)が参考になります。

##基本的な構文
###値を初期化

```
[-]
```

ポインタの指すセルの値が0になるまで減算を繰り返します。`[+]`でも同じ働きをします。状況に応じて速そうな方を使いましょう。

###足し算
0番地の値aを1番地の値bに足す、という操作を考えます。ここでは繰り上がりは考えないものとします。

| 番地 | 0 | 1 |
|:-:|:-:|:-:|
|操作前 | a | b |
|操作後 | 0 | a+b |

ポインタは0番地を指しているとすると足し算は以下のコードで実装できます

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

0番地の値が0になるまで1番地の値に`+`を実行します。引き算なら`+`を`-`に変えればいいですね。

###値のコピー
Brainf*ckでは、値の破壊的操作をすることがしばしばなので、値のコピーが必要です。

0番地の値aを1番地にコピーする操作を考えます。

| 番地 | 0 | 1 | 2 |
|:-:|:-:|:-:|:-:|
| 操作前 | a | 0 | 0 |
| 操作後 | a | a | 0 |
ポインタは0番地を指し、1,2番地は初期化されているとすると、以下のコードで実装できます。

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

2番地は一時変数として使っています。

###forループ
例えば3回繰り返す処理は次のように書けます。

```
[-]+++[(繰り返し実行する処理)-]
```

このとき重要なのは、対応する`[`と`]`でポインタの位置を合わせておくことです。上で紹介した操作もforループと同じ形をしていますね。

###数字の入力
標準入力として'2'が与えられた場合を考えます。'2'はASCIIコードで50なので、`,`で代入されるのは50です。幸いにも数字は'0'(ASCII 48）から'9'（ASCII 57）まで順に並んでいるので、入力から48を引けば対応した整数が得られます。

上記の操作は以下のコードで実装できます。

```
,>++++++[<-------->-]
```

`-`を48個書いてもいいですが、forループを使うとすっきり書けます。

###多倍長整数について
配列に格納できる値は255が上限なので、それより大きい整数を扱うには多倍長整数を使います。もちろんBrainf*ckに多倍長整数などという便利な機能は無いので、何らかの形で**自力で多倍長整数を実装**します。

以下の問題では、3つくらいのセルで1つの桁を表して、256進数や10進数のようなものを実装することにより、多倍長整数を扱っています。

多倍長整数は工夫のしがいがあって面白いのですが、長くなるのでここでは深入りしないことにします。

---
前置きが長くなりました。ACできるのか正直不安ですが、**†チューリング完全†**を信じて問題を解いていきます。

コードを適当に改行、インデントしていますが、元はワンライナーコードなので読みにくかったらすみません。

# 第0問 [Practice A - はじめてのあっとこーだー（Welcome to AtCoder）](https://beta.atcoder.jp/contests/abs/tasks/practice_1)
早速ですが、この問題を解くのはあまり簡単ではありません。整数の入出力でさえ苦しいBrainf*ckで、256以上の整数を扱うなど全く初心者向けではないです。

```
# 定数の代入
>>>>>>++++++++++[>+>>>+>>>+<<<<<<<-]<<<<<<

# 3回のループ
+++[

    # 整数の受け取り
    >+[[-]>,----------[<++++[>-----<-]>--[<++++[>----<-]>>>>[>+<-]<[>+<-]<[>+<-]<[>+<-]<+>]]<]>>

    # 整数の和を求める
    [>>>>-[>>+<]>[<]>-[+>-<<<++++++++++>>]<<<<<<-]>>>>>>>
    [>>+<]>[<]>-[+>-<<<++++++++++>>]<<<<<<<<
    [>>>>>>-[>>+<]>[<]>-[+>-<<<++++++++++>>]<<<<<<<<-]>>>>>>>>>
    [>>+<]>[<]>-[+>+<<<++++++++++>>]<<<<<<<<<<
    [>>>>>>>>-[>>+<]>[<]>-[+>+<<<++++++++++>>]<<<<<<<<<<-]>
    [>>>>>>>>>>+<<<<<<<<<<-]<<<<<<-
]

# 整数の和を出力
>>>>>>>>>++++++++++[<+>>>+>>>+<<<<<-]<<[>-<-]>>>[>-<-]>>>[>-<-]>>>
[>++++++[<++++++++>-]<.<+>[-]]<
[+++++[<++++++++>-]<.[-]<+>>]<[>++++++[<++++++++>-]<.[-]<+>]<
[<++++++[<++++++++>-]<.[-]>>-]<<[>++++++[<++++++++>-]<.[-]]<<
++++++++[<++++++<++++>>-]<.[-]<.<<

# 文字列を出力
+[,----------[++++++++++.>]>[<]<]

++++++++++.
```

[提出例](https://beta.atcoder.jp/contests/abs/submissions/2702778)

# 第1問 [ABC 086 A - Product](https://beta.atcoder.jp/contests/abs/tasks/abc086_a)
大きな数を扱うのは難しいので、一の位だけ使います。一の位は直後の半角スペース（ASCII 32）やLF（改行）（ASCII 10）を目印にして見つけることができます。

また、掛け算はせずにa、b少なくとも一方が偶数なら`'Even'`、そうでなければ`'Odd'`を出力します。

```
# aの一の位のみ受け取り
+[->,>++++[<-------->-]<[>++++[<---->-]>[-]<<[>>+<<-]<+>]<]

# bの一の位のみ受け取り
+[->,----------[>++++++[<------>-]>>[-]<<<--[>>>+<<<-]<+>]<]>

# Even,Oddのフラグを立てる
+>+>

# aが偶数ならOddのフラグを倒す
-[--[--[--[--[<->[+]]]]]]>

# bが偶数ならOddのフラグを倒す
-[--[--[--[--[<<[-]>>[+]]]]]]<<

# 'Odd'を出力,Evenのフラグを倒す
[+++++++++[>++++++++>++++++++++<<-]>-.>..<<<->]<

# 'Even'を出力
[+++++++++[>+++++++>++++++++++++>++++++++++<<<-]>-.>--.>+.+++++++++.<<<]

# LF（改行）を出力
++++++++++.
```

[提出例](https://beta.atcoder.jp/contests/abc086/submissions/2690475)

入力の文字数が固定でない問題の入力の受け取りや、if文のいい練習になる問題だと思います。改行は出力しなくても通りますが、一応添えています。

# 第2問 [ABC 081 A - Placing Marbles](https://beta.atcoder.jp/contests/abs/tasks/abc081_a)
この問題は比較的解きやすいので真面目に解説します。

与えられた3つの整数の和を出力すればいいので、「1文字読み込んで整数に直し、変数ansに足す」というループを3回回せばいいですね。先に各番地の役割を決めておきましょう。

| 番地 |  |
|:-:|:-:|
| 0 | ループカウンタ |
| 1 | 入力の読み込み |
| 2 | ans |

3回のループなので大枠は次のようになります。

```
+++[(何か処理)-]
```

では、具体的な処理の中身について考えてみましょう。まず、1番地で入力を1byte読み込み、ansに足します。

```
>,[>+<-]
```

入力に対応した整数をansに足したいので、ansから48を引きます。これでループの中でする処理は終わりなので、ポインタは0番地に戻します。

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

ここまでの処理をまとめます。与えられた3つの整数の和をansに格納する、という操作が実装できました。

```
+++[>,[>+<-]++++++[>--------<-]<-]
```

あとはansに48を足して出力するだけです。これでこの問題は解けました。~~ね、簡単でしょう？~~

```
+++[>,[>+<-]++++++[>--------<-]<-]>++++++[>++++++++<-]>.
```

[提出例](https://beta.atcoder.jp/contests/abc081/submissions/2714421)

ちなみに、上のコードではansから48を3回引いて、48を1回足していますが、ansからは正味で96だけ引けばいいのでコードはもう少し単純にできます。

```
+++[>,[>+<-]++++[>--------<-]<-]>>.
```

# 第3問 [ABC 081 B - Shift only](https://beta.atcoder.jp/contests/abs/tasks/abc081_b)
整数を1つ読み込み、2で何回割れるかを調べ、必要なら答えの最小値を更新する、という操作を繰り返します。（多倍長整数を扱えれば）やるだけです。

```
# 定数の代入
>>>>>>>>>>>>>>>>>>>>>++++++[>++++++<-]<<<<<<<<<<<<<<<<<<<<<

# Nの受け取り
,>++++++[<-------->-],----------[>++++++[<------>-]<--<[>++++++++++<-]>[<+>-],----------[>++++++[<------>-]<--<[>++++++++++<-]>[<+>-],[-]]]<

# N回のループ
[

    # A_iの受け取り
    >+>>>>>>>>>>>>,>++++++[<-------->-]<<<<<<<<<<<<<[->,----------[>++++[<----->-]<--[---------------->>>>>>>>>>>[<++++++++++[<<<<<<<<<<+[>>+<]>[<]>-[>+[>>+<]>[<]>-[>+[>>+<]>[<]>-[>+<+]<<<+]<<<+]>>>>>>>>-]>-]>[<<++++++++++[<<<<<<<+[>>+<]>[<]>-[>+[>>+<]>[<]>-[>+<+]<<<+]>>>>>-]>>-]>[<<<++++++++++[<<<<+[>>+<]>[<]>-[>+<+]>>-]>>>-]>[<<<<<++++++++++>>>>>-]<<<<<<<<<<<<<<[>>>>>>>>>>>+<<<<<<<<<<<-]>>>[>>>>>>>>>+<<<<<<<<<-]>>>[>>>>>>>+<<<<<<<-]>>>[>>>>>+<<<<<-]<<<<<<<<<<+>]]<]

    # 2で何回割れるか調べる
    +[>>>>>>>>>>>>[<<<<<<<<<<<+>>>>>>>>>>>-]>[<<<<<<<<<+>>>>>>>>>-]>[<<<<<<<+>>>>>>>-]>[<<<<<+>>>>>-]<<<<<<<<<<<<<<[-[->>+<]>[<]>-[+<<<->>>]>>>>>>>>>+<<<<<<<<<<<]>>>[-[->>+<]>[<]>-[+>>>>>++++++++[>++++++++++++++++<-]>>-<<<<<<<]>>>>>>>+<<<<<<<<<]>>>[-[->>+<]>[<]>-[+>>++++++++[>>++++++++++++++++<<-]>>>-<<<<<]>>>>>+<<<<<<<]>>>[-[-<<+>]<[>]<-[+>>>++++++++[>>>++++++++++++++++<<<-]>>>>-<<<<<<<]>>>>>>>+<<<<<]>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>

    # 必要なら最小値を更新
    ->>>>>[<+<+>>-]<[>+<-]<[<<<[>>+<]>[<]>-[+>[>>-<<-]<]<<->>>-]<<<

    # 次回のループのために値を初期化
    [-]<[-]<[-]<[-]<[-]<<<<<<<<<<<<<-
]

# 答えを出力
>>>>>>>>>>>>>>>>>>>>>>>++++++++++<[->[->>+<]>[<]>-[+<<+++++++++>>>+<]<<<]>>>>[>++++++[<++++++++>-]<.[-]]<++++++++[<+++++++>-]<++<[>-<-]>.>
++++++++++.
```

[提出例](https://beta.atcoder.jp/contests/abs/submissions/2594372)

# 第4問 [ABC 087 B - Coins](https://beta.atcoder.jp/contests/abs/tasks/abc087_b)
$500i+100j+50k = X \hspace{5pt} (0\le i\le A,0\le j\le B,0\le k\le C)$を満たす$(i,j,k)$の組を素直に三重ループを回して調べ上げます。

扱う数は小さい方が嬉しいので、$X$は50で割ってしまいます。ここでは$i,j$は大きい方から調べています。

```
# A,B,Cの受け取り
>>+++[>,>++++++++[<------>-],----------[>++++++[<------>-]<--<[>++++++++++<-]>[<+>-],[-]]<+<[>>+<<-]>>-]

# Xの受け取り
+[->,----------[>++++++[<------>-]<--<+>>>>>>[<<++++++++++>>-]<[>++++++++++[<<<<<+[>>+<]>[<]>-[>+<+]>>>-]<-]<[>>+<<-]<<<[>>>>+<<<<-]]<]>>>>>>[>>+<<-]<<<<<<

# X/50を計算
+[[-]>>>>>>>>>>+++++[<++++++++++>-]<[<<<<-[>>+<]>[<]>-[>[>>>+>+<<]>>[<]>[->-<<<<->>>]<<<<+]>>-]<<<<[<<<<<+>>>>>>>+<]>[<]>[-]>[<<<<<<<<+>>>>>>+>]<[>]<[-]<<<<<+[>>+<]>[<]>-[>+<+]<<<]>[>>>>>>>>>>>>+<<<<<<<<<<<<-]>>>[>>>>>>>>>>+<<<<<<<<<<-]<<<<<[>>+<<-]<<<<[<+>-]

# 三重ループを回す
# Aのループ
<[

    # X/50-10iを計算
    -[>+<-]>[<+>>+<-]<<<+>>>>>>>>>>>>>>>>>>>>>[<+>-]<[>+<<<<<<<<+>>>>>>>-]>>[>+<-]>[<+<<<<<<+>>>>>>>-]<<<<<<<<<<<<<<<<<<<[>>>>>>>>++++++++++[->[->>+<]>[<]>-[+>[->>+<]>[<]>-[

        # 500i > X なら次のループに行く
        +<<<<<<[-]<<<<<<<<[-]+<<<<[-]>>>>>>>>>>>>>+>>>>>
    ]
    <<<<<->>]<<<]<<<<<<<<-]<<<<

    # Bのループ
    [[-]>>>>>[>+<-]>[<+>>+<-]>>>>>>>[>>>>>>+<<<<<<-]>>>[>>>>+<<<<-]<<<<<<<<<[

        # X/50-10i-2j を計算
        -[<+>-]<[>+>+<<-]<<<<<[-]+>>>>>>>>>>>>>>>>>>[<+>-]<[>+<<<<<<+>>>>>-]>>[<<+>>-]<<[>>+<<<<+>>-]<<<<<<<<<<[>>>>++[->[->>+<]>[<]>-[<<->>+>[->>+<]>[<]>-[

            # 500i+100j > X なら次のループに行く
            +<<<<<<[-]<<<<[-]+<<<<<<<[-]>>>>>>>>>>>>>>>>>
        ]

        # Cのループ
        <<<]<<<]<<<<-]<<<<<<<[[-]>>>>>>>>[>+<-]>[<+>>+<-]>[

            # X/50-10i-2j-k を計算
            ->>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[

                # 500i+100j+50k = X なら答えに+1
                +>>>>>>+[>>+<]>[<]>-[+>+<]<<<<<<<<<<+<<<+<<[-]>>>>>>>
            ]
            <<<]<<<<
        ]
        <<<<<<<<<<]>>>>>>>>>>>>[-]>>>[-]<<<<<<<<<
    ]
    <<<<<<<]>>>>>>>>>>>>>>>>>>>[-]>[-]<<<<<<<<<<<<<<<<<<
]

# 答えを10進数に直す
>>>>>>>>>>>>>>>>>>>>>>>>>[<<+>>-]<++++++++++>>>++++++++++>>>++++++++++<<<<<<<<
[>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-<]<<<]<<<<-]>[->-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-<]<<<]<<<<-[>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-<]<<<]<<<<-]>]
++++++++++>>>++++++++++>>>++++++++++>[<->-]<<<[<->-]<<<[<->-]>>>>>

# 答えを出力
[>>++++++[<++++++++>-]<[<+<<<+>>>>-]<.[-]<<<.[-]>>>]<<<[>++++++[<++++++++>-]<.[-]]<<++++++[<++++++++>-]<.>
++++++++++.
```

[提出例](https://beta.atcoder.jp/contests/abc087/submissions/2588682)

# 第5問 [ABC 083 B - Some Sums](https://beta.atcoder.jp/contests/abs/tasks/abc083_b)
forループを回して$1$から$N$までの数それぞれについて桁和を調べます。

答えは多倍長整数ですが、10進数のような形で持っておくと、加算するときにも出力するときにも便利です。

```
# Nの受け取り
>+[>,<+++[>--------<-]>[<++++[>----<-]>>>>>[<<<<<++++++++++[>+[>>+<]>[<]>-[+>+<]<<<-]>>>>>-]>[<<++++++++++>>-]<<<<<[>>>>+<<<<-]>>>[>>+<<-]<<<<+>]<]>>>>>[<<<<<+>>>>>-]>[<<<+>>>-]<<

# A,Bの受け取り
++++++++++>>>++++++++++>>>++++++++++>>>++++++++++>>>>>>>>,>++++++[<-------->-]<<,<++++[>--------<-]>[<++++[>----<-]>>[<++++++++++>-]<[>+<-],[-]]>>>>,>++++++[<-------->-]<<,----------[<++++++[>------<-]>-->[<++++++++++>-]<[>+<-]]>+[<+>-]<<<[<+>>>-<<-]>>>>>>>>>>

# 定数の代入
++++++++++>>>++++++++++>>>++++++++++>>>++++++++++>>>++++++++++>>>++++++++++>>>++++++++++[<<<]<<<<<[<<<]<<<<[<<<]<<

# N回のループ
+[

    # 次回のループのフラグを処理
    [-]>-[<+>>>+<]>[<]>-[+>[<<<<+>>+>]<[>]>-<<-[+>>+<<]>]>>

    # 10進数の各桁を更新
    -[>>+<]>[<]>-[+>-[>>+<]>[<]>-[+>-[>>+<]>[<]>-[+>-[>>+<]>[<]>-[+>+<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<

    # 桁和を求める
    [>+>>>>>>>>>>>>->>>>>>>>>-<<<<<<<<<<<<<<<<<<<<<<-]>[<+>-]>>[>+>>>>>>>>>->>>>>>>>>>-<<<<<<<<<<<<<<<<<<<<-]>[<+>-]>>[>+>>>>>>->>>>>>>>>>>-<<<<<<<<<<<<<<<<<<-]>[<+>-]>>[>+>>>->>>>>>>>>>>>-<<<<<<<<<<<<<<<<-]>[<+>-]>>[<+>>+>>>>>>>>>>>>>+<<<<<<<<<<<<<<-]<[>+<-]>>>

    # A <=（桁和）<= B であるか調べる
    +++++[<++++++++>-]>>[>+<-]>[<+<<<->>>>-]>>[>+<-]>[<+<+>>-]<<[<<<<<[>>+<]>[<]>-[

        # 条件を満たすなら答えに足す
        +>>>[-]+>>>>++++++++++>++++++++++>++++++++++>++++++++++<<<
        [>>>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>+<]<<<]<<<]<<<]<<<]<<<]<<<]<<<<<<<-]>
        [>>>>>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>+<]<<<]<<<]<<<]<<<]<<<]<<<<<<<<<-]>
        [>>>>>>>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>+<]<<<]<<<]<<<]<<<]<<<<<<<<<<<-]>
        [>>>>>>>>>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>+<]<<<]<<<]<<<]<<<<<<<<<<<<<-]>
        [>>>>>>>>>>>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>+<]<<<]<<<]
        <<<<<<<<<<<<<<<-
    ]
    <<<<<<<<<<<<<+>>]<<->>>>>-]>>>>[+]>[+]>[+]>[+]>[-]<<<<<<<<<<<<<[+]<<<<<<<<<<<<<<<<<<
]

# 答えを出力
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>++++++++++>>>++++++++++>>>++++++++++>>>++++++++++>>>++++++++++>>>++++++++++>>>++++++++++>>[>+<-]<<<[>-<-]<<<[>-<-]<<<[>-<-]<<<[>-<-]<<<[>-<-]<<<[>-<-]<<<[>-<-]>>>>>>>>>>>>>>>>>>>>>>
[>++++++[<++++++++>-]<.<+>[-]]<
[-<++++++[<++++++++>-]<.[-]<+>>>]<<[>++++++[<++++++++>-]<.[-]<+>]<
[-<++++++[<++++++++>-]<.[-]<+>>>]<<[>++++++[<++++++++>-]<.[-]<+>]<
[-<++++++[<++++++++>-]<.[-]<+>>>]<<[>++++++[<++++++++>-]<.[-]<+>]<
[-<++++++[<++++++++>-]<.[-]<+>>>]<<[>++++++[<++++++++>-]<.[-]<+>]<
[-<++++++[<++++++++>-]<.[-]<+>>>]<<[>++++++[<++++++++>-]<.[-]<+>]<
[-<++++++[<++++++++>-]<.[-]>>]<<[>++++++[<++++++++>-]<.[-]]<<
++++++[<++++++++>-]<.>
++++++++++.
```

[提出例](https://beta.atcoder.jp/contests/abc083/submissions/2622827)

# 第6問 [ABC 088 B - Card Game for Two](https://beta.atcoder.jp/contests/abs/tasks/abc088_b)
ソートは実装したくないので、[AtCoder に登録したら解くべき精選過去問 10 問を別解で解いてみた](https://qiita.com/259_Momone/items/991d31ccc1f830a1d578)で紹介されているバケット法を使った別解で解きます。

$c[i]:=i$が書かれたカードの枚数
として、$c[i]$が奇数のものだけ考えればいいです。

```
# Nの受け取り
>>>>>>,>++++++[<-------->-],----------[>++++++[<------>-]<--<[>++++++++++<-]>[<+>-],----------[>++++++[<------>-]<--<[>++++++++++<-]>[<+>-],[-]]]<

# N-1回のループ
-[

    # a_iの受け取り
    >,>++++++[<-------->-],>++++[<-------->-]<[>++++[<---->-]<<[>++++++++++<-]>[<+>-],>++++[<-------->-]<[>++++[<---->-]<<[>++++++++++<-]>[<+>-],[-]]]<

    # c[a_i] に+1
    [>>+<<-]>>-[[>>+<<-]+>>-]>+<+[-<<]<-
]

# a_Nに対して上記の操作
>,>++++++[<-------->-],----------[>++++++[<------>-]<--<[>++++++++++<-]>[<+>-],----------[>++++++[<------>-]<--<[>++++++++++<-]>[<+>-],[-]]]<[>>+<<-]>>-[[>>+<<-]+>>-]>+<+[-<<]<

# c[i]それぞれについて調べる
++++++++++[>++++++++++<-]>[[>>+<<-]+>>-]<<[<<]<<<+>++++++++++[>++++++++++<-]>[>>>[>>]>

    # c[i]の偶奇を判定
    [--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[--[

        # 奇数の場合の処理
        [-]<<<[<<]<<<[->>[<+>>+<-]>[<+>-]<<<<<+>>]<[->>>[<->>+<-]>[<+>-]<<<<]<[->+>-<<]>>+>>>>>[>>]>
    ]
    ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]<<<-<<[<<]<-
]

# 答えを10進数に直す
++++++++++>>>++++++++++>>>++++++++++<<<<<<<[>-[>>+<]>[<]>-[+>-[>>+<]>[<]>-[+>-<<<++++++++++>>]<<<<<++++++++++>>]<<<-]++++++++++>[<->-]>>++++++++++>[<->-]>>++++++++++>[<->-]<

# 答えを出力
[<++++++[>++++++++<<<++++++++>>-]>.<<<.[-]>>>[-]]<<<[<++++++[>++++++++<-]>.[-]]<<++++++[<++++++++>-]<.>
++++++++++.
```
[提出例](https://beta.atcoder.jp/contests/abc088/submissions/2590134)

偶奇の判定をしている部分は分かりやすいですね。

# 第7問 [ABC 085 B - Kagami Mochi](https://beta.atcoder.jp/contests/abs/tasks/abc085_b)
第6問と同じ考え方で解けます。

```
# Nの受け取り
,>++++++[<-------->-],----------[>++++++[<------>-]<--<[>++++++++++<-]>[<+>-],----------[>++++++[<------>-]<--<[>++++++++++<-]>[<+>-],[-]]]

# N回のループ
<[

    # d_iの受け取り
    >,>++++++[<-------->-],----------[>++++++[<------>-]<--<[>++++++++++<-]>[<+>-],----------[>++++++[<------>-]<--<[>++++++++++<-]>[<+>-],[-]]]<

    # c[d_i]に+1
    [>>+<<-]>>-[[>>+<<-]+>>-]>+<+[-<<]<-
]

# 0でないc[i]を数える
>>++++++++++[>++++++++++<-]>[[>>+<<-]+>[<-<<[<<]>+>[>>]+>[-]]>-]<<[-<<]

# 答えを10進数に直す
++++++++++[>>+>>>+>>>+<<<<<<<<-]>[>-[>>+<]>[<]>-[<<++++++++++>>>-[>>+<]>[<]>-[<<++++++++++>>>-<+]<<<+]<<<-]++++++++++[>>+>>>+>>>+<<<<<<<<-]>[>-<-]>>>[>-<-]>>>[>-<-]>

# 答えを出力
[++++++[<+++++++>-]<.-.<->>]<<+[<[>+++++[<++++++++>-]<.[-]]>[-]]<<<++++++[<++++++++>-]<.<
++++++++++.
```

[提出例](https://beta.atcoder.jp/contests/abs/submissions/2527904)

# 第8問 [ABC 085 C - Otoshidama](https://beta.atcoder.jp/contests/abs/tasks/abc085_c)
TLEが怖いので$O(1)$解法で解きます。

```
# Nの受け取り
+[->,>++++[<-------->-]<[>++++[<---->-]>>>[<<<<<++++++++++[>+[>>+<]>[<]>-[+>+<]<<<-]>>>>>-]<<<<<+>[>>>>+<<<<-]>>>[>>+<<-]<<<]<]>>>>>[<<<<<+>>>>>-]>[<<<<+>>>>-]

# Yの受け取り、1000で割る
+[->,----------[<++++++[>------<-]+>-->>>>>>>[>+<-]<[>+<-]<[>+<-]<[>+<-]<[>+<-]<[>+<-]<[>+<-]<[>+<-]]<]>>>>>>>>>[<<<<<++++++++++>>>>>-]<[<<<<+>>>>-]<[<<<<+>>>>-]<<<[<++++++++++>-]>>[<<<<<<<+>>>>>>>-]<<<[<<<<<++++++++++[>+[>>+<]>[<]>-[+>+<]<<<-]>>>>>-]<<<<[>>>>+<<<<-]>>>[>>>>>>++++++++++<<<<<<-]>[>++++++++++[>+[>>+<]>[<]>-[+>+<]<<<-]<-]>>[<<<<<<<+>>>>>>>-]>>>[<<<<<<<<+>>>>>>>>-]>>>>>>>>>>+<<<<<<<<<<<<<<<<

# 9回のループ
+++++++++[

    # 頑張る
    -<<<<[>+>>>>>>+<<<<<<<-]>[<+>-]>[>+>>>>>>>+<<<<<<<<-]>[<+>-]>[>>+<<-]>>[<+<+>>-]<[>++++[>[>>+<]>[<]<->>-[+>[<<+>]<[>]>-<<-[+<+<[-]+<[-]+>>>>>+>>>>>>>>>+<<<<<<<<<<<]>]<<<-]<-]<<<<<<<<<[>+>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<-]>[<+>-]>[>+>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<-]>[<+>-]>>>>>>>+[>>>>>[>>+<]>[<]<->>-[+>[<<+>]<[>]>-<<-[+<+>>>+<<]>]<<[>>+<]>[<]>-[+>[<<+>]<[>]<-[+<<<<<<[-]>>>>>>]>]<<<<<<[>>+<]>[<]<->>-[+>[<<+>]<[>]>-<<-[+<+<[-]>>>>+>[-]>>>[-]>>>>>[-]+<<<<<<<<<<<]>]<<<]>[<<+>>>>+<]>[<]>[-]>[<<+<<<[-]+>>>>]<[>]<[-]<<<[>+++++++++[->[>>+<]>[<]<->>-[+>[<<+>]<[>]>-<<-[+<+<[-]<[-]>>>>>+>[-]->>>[-]->>>>>[-]+<<<<<<<<<<<]>]<<<]>[>>+<]>[<]>-[+>[<<+>]<[>]<-[+<<<[-]>>>]>]>>+[>>+<]>[<]>-[+>+<]<<<<<<<<]>>>>>>[>>>>+<<<<-]>>>[>>>+<<<-]<<<<<<<<<<<<<<<<<<[>+>>>>>>>>>>+<<<<<<<<<<<-]>[<+>-]>[>+>>>>>>>>>>>+<<<<<<<<<<<<-]>[<+>-]>>>>>[>+<-]>[<+>>+<-]>[->[>>+<]>[<]<->>-[+>[<<+>]<[>]>-<<-[+<+>>>+>>>>>>>>>[-]+<<<<<<<<<<<]>]<<<]>>>>>>>>>[>+<<<<<+>>>>-]>[<+>-]>[>+<<<<+>>>-]>[<+>-]<<<<<<<[>>+<<<<<<<+>>>>>>]>[<]>[-]>[<<+<<<<<<[-]+>>>>>>>]<[>]<[-]<<<<<<[>>>>>[>>+<]>[<]<->>-[+>[<<+>]<[>]>-<<-[+<+>>>+<<]>]<<[>>+<]>[<]>-[+>[<<+>]<[>]<-[+<<<<<<[-]>>>>>>]>]<<<<<<[>>+<]>[<]<->>-[+>[<<+>]<[>]>-<<-[+<+<[-]>>>>+>>>>>>>>>[-]+<<<<<<<<<<<]>]<<<
]

# 一万円札の枚数を出力
>>>>>>>>>>>>>-[+>-<<<[>+<-]>>++++++++++>>>++++++++++>>>++++++++++<<<<<<<[<<+<<+>>>]<[>]<[-]<[<+>>>+<]>[<]>[-]<<<[>[>>+<]>[<]<->>-[+>[<<+>]<[>]>-<<-[+<+>>>+<<]>]<<[>>+<]>[<]>-[+>[<<+>]<[>]<-[+<<[-]>>]>]>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>+<]<<<]<<<]<<<<<<<]>>>>++++++++++>>>++++++++++>>>++++++++++>>>>[<+>-]<<<[<->-]<<<[<->-]<<<[<->-]>>>>>>>>[>++++++[<++++++++>-]<.[-]<+>]<[[-]<++++++[<++++++++>-]<.[-]<+>>>]<<[>++++++[<++++++++>-]<.[-]<+>]<[[-]<++++++[<++++++++>-]<.[-]>>]<<[>++++++[<++++++++>-]<.[-]]<<++++++[<++++++++>-]<.[-]++++[<++++++++>-]<.[-]<<<<<<<<<<<<

# 五千円札の枚数を出力
++++++[<++++++++>-]<.[-]++++[>++++++++<-]>.[-]>>>>>>

# 千円札の枚数を出力
++++++++++>>>++++++++++>>>++++++++++<<<<<<<[<<+<<+>>>]<[>]<[-]<[<+>>>+<]>[<]>[-]<<<[>[>>+<]>[<]<->>-[+>[<<+>]<[>]>-<<-[+<+>>>+<<]>]<<[>>+<]>[<]>-[+>[<<+>]<[>]<-[+<<[-]>>]>]>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>-[>>+<]>[<]>-[+<<++++++++++>>>+<]<<<]<<<]<<<<<<<]>>>>++++++++++>>>++++++++++>>>++++++++++>>>>[<+>-]<<<[<->-]<<<[<->-]<<<[<->-]>>>>>>>>[>++++++[<++++++++>-]<.[-]<+>]<[[-]<++++++[<++++++++>-]<.[-]<+>>>]<<[>++++++[<++++++++>-]<.[-]<+>]<[[-]<++++++[<++++++++>-]<.[-]>>]<<[>++++++[<++++++++>-]<.[-]]<<++++++[<++++++++>-]<.[-]>>>>>>>>>]<<[-]<<[-]<[-]<<<[-]<[-]<<<[-]<<<]>>>>>>>>>>>>>>>>

# '-1 -1 -1'を出力
[->++++++++[>++++++>++++++>++++<<<-]>---.>+.>.<<.>.>.<<.>.<<<]
++++++++++.
```

[提出例](https://beta.atcoder.jp/contests/abc085/submissions/2635712)

すみません全くコードが追えませんでした。

# 第9問 [ABC 049 C - 白昼夢/Daydream](https://beta.atcoder.jp/contests/abs/tasks/arc065_a)
Brainf*ckにかかれば後ろからGreedyで解くことなど造作も無いことです。~~嘘です私には結構キツイです。~~

しかし、前述の通り、使える配列の長さはたったの9999です。ここで、この問題の制約は$|S| \le 10^5$なので、文字列を全て受け取って後ろから解くことは大変難しいです。仕方が無いので少し先まで見るGreedyで前からゴリ押します。

```
# 先頭から5文字読み込む
+>>,>>>,>>,>>,>>,<<<<<<<<<<<[

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

        # 1文字目が'd'のとき
        +<<<[-]<[-]+>>>>>>
        ++++++++++[<----------->-]<----[[-]<<<<[-]+<[-]>>>>>]>>>
        ++++++++++[<---------->-]<-[[-]<<<<<<[-]+<[-]>>>>>>>]>>>
        ++++++++[<------------>-]<-[[-]<<<<<<<<[-]+<[-]>>>>>>>>>]>>>
        ++++++++++[<----------->-]<+[[-]<<<<<<<<<<[-]+<[-]>>>>>>>>>>>]<<<<<<<<<
        +>>,>>>,>>>,<<<<<
        ++++++++++[<---------->-]<-[>>+<]>[<]>>>
        ++++++++++[<----------->-]<----[>>+<]>[<]>>>
        ++++++++[<------------>-]<-[>>+<]>[<]>-
        [[+]<<<<<<<<<<[-]>[-]+>>>>>>>>>]<<<[[-]<<<<<<<[-]>[-]+>>>>>>]<<<[[-]<<<<[-]>[-]+>>>]<<<<[

            # 'dreamer'で切る
            [-]>>>>>>>>>++++++++[>++++++++++++<-]<[>>+<<-]>>+>,>,>,>,<<<<<<<<<<<<<<
        ]
        >[
            # 'dream'で切る
            [-]>[>>>>>>>>+<<<<<<<<-]>>>[>>>>>>+<<<<<<-]>>>[>>>>+<<<<-]>++++++++++[>++++++++++>+++++++++++>++++++++++<<<-]>+>++++>--->,>,<<<<<<<<<<<<<
        ]
        >
    ]
    <<-[>>+<]>[<]>-[

        # 1文字目が'e'のとき
        +<<<[-]<[-]+>>>>>>
        ++++++++++[<----------->-]<----[[-]<<<<[-]+<[-]>>>>>]>>>
        ++++++++[<------------>-]<-[[-]<<<<<<[-]+<[-]>>>>>>>]>>>
        +++++++++[<------------->-]<++[[-]<<<<<<<<[-]+<[-]>>>>>>>>>]>>>
        ++++++++++[<---------->-]<-[[-]<<<<<<<<<<[-]+<[-]>>>>>>>>>>>]<<<<<<<<<
        +>>,>
        ++++++++++[<----------->-]<----[>>+<]>[<]>[[-]<<<<[-]>[-]+>>>]<<<<[

            # 'eraser'で切る
            [-]>>>>>>>>>>,>,>,>,>,<<<<<<<<<<<<<<
        ]
        >[
            # 'erase'で切る
            [-]>[>>>>>>>>+<<<<<<<<-]>>>>>>>>>++++++++++[<+++++++++++>-]<++++>,>,>,>,<<<<<<<<<<<<<
        ]
        >
    ]
    <<[-]]>>>>>>>>>>[<<<<<<<<<<+>>>>>>>>>>-]>[<<<<<<<<+>>>>>>>>-]>[<<<<<<<+>>>>>>>-]>[<<<<<<+>>>>>>-]>[<<<<<+>>>>>-]<<<<<<<<<<<<<<<<
]

# 'NO'を出力
>[[-]>[-]>[-]>[-]<<++++++[>+++++++++++++<-]>.+.<<<->]<

# 'YES'を出力
+[[-]>[-]>[-]>[-]<<<++++++++++[>+++++++++>+++++++<<-]>-.>-.<------.<]

++++++++++.
```

[提出例](https://beta.atcoder.jp/contests/abc049/submissions/2638267)

# 第10問 [ABC086 C - Traveling](https://beta.atcoder.jp/contests/abs/tasks/arc089_a)
特に工夫のしようが無い問題ですが、実装量、実行時間ともに一番厳しかったです。コードは長いですが、同じコードを何回も書いてるのでやってることはそこまで複雑ではないです。

```
# Nの受け取り
+[->,----------[<++++++[>------<-]+>-->>>>>>>>[<++++++++++[<<<<<<<+[>>+<]>[<]>-[+>+[>>+<]>[<]>-[+>+<]<<<]>>>>>-]>-]>[<<++++++++++[<<<<+[>>+<]>[<]>-[+>+<]>>-]>>-]<<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>[>>>>>>+<<<<<<-]>>>[>>>>+<<<<-]<<<<<<]<]>>>>>>>>>[<<<<<<<<+>>>>>>>>-]>[<<<<<<+>>>>>>-]>[<<<<+>>>>-]<<<<<<<<<<[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>-<]<<<]<<<

# N回のループ
+[

    # 次回のループのフラグを処理
    >[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<<<<<<<<[-]>+>>>+>>>+>>]<<<]<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>

    # t_iの受け取り
    +[[-]>,>++++[<-------->-]<[<++++[>----<-]+>>>>>>>>>>>>[>>+<<-]<<[>>+<<-]<<[>>+<<-]<<[>>+<<-]<<[>>+<<-]<<<[>>>+<<<-]]<]>>>>

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

    # dtを計算
    [->>>>>>>>>>>>>[>>+<]>[<]<->>-[+>-<<<++++++++++>>]<<<<<<<<<<<<<<<]<
    [->>>>>>>>>>>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>-<<<++++++++++>>]<<<<<++++++++++>>]<<<<<<<<<<<<<]<
    [->>>>>>>>>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>-<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<<<<<<<]<
    [->>>>>>>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>-<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<<<<<]<
    [->>>>>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>-<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>

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

    # x_iの受け取り
    +[[-]>,>++++[<-------->-]<[<++++[>----<-]+>>>>>>>>>>>>[>>+<<-]<<[>>+<<-]<<[>>+<<-]<<[>>+<<-]<<[>>+<<-]<<<[>>>+<<<-]]<]>>>>

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

    # |dx|を計算
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+<<+>>>>>>>>>>>>>>>>>>[-]>+<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<--------->>>>>>>>>>>>>>>>>>[-]>+<<<<<<<<<<<<<<]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<--------->>>>>>>>>>>>>>>>>>[-]>+<<<<<<<<<<<]<<<<<++++++++++>>]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<---------<<<--------->>>>>>>>>>>>>>>>>>[-]>+<<<<<<<<]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<---------<<<---------<<<--------->>>>>>>>>>>>>>>>>>[-]>+<<<<<]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<---------<<<---------<<<---------<<<--------->>>>>>>>>>>>>>>>>>[-]>+<<]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>]<<<<<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]>>>>>>>>>>>>>>>>>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<<<<<<<<<<<<<<<<<+<[-]>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<++++++++++>>]<<<<<<<<<<<<<<<<<<<<<<]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]>>>>>>>>>>>>>>>>>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<---------<<<<<<<<<<<<<<<<<<<+<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<<<<<<<<<<<<<<<<<<]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]>>>>>>>>>>>>>>>>>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<---------<<<---------<<<<<<<<<<<<<<<<<<<+<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<<<<<<<<<<<<<<<<<<]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]>>>>>>>>>>>>>>>>>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<---------<<<---------<<<---------<<<<<<<<<<<<<<<<<<<+<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<<<<<<<<<<<<<<<<<<]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]>>>>>>>>>>>>>>>>>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<---------<<<---------<<<---------<<<---------<<<<<<<<<<<<<<<<<<<+<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<<<<<<<<<<<<<<<<<<]

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

    # y_iの受け取り
    +[[-]>,----------[<++++++[>------<-]+>-->>>>>>>>>>>[>>+<<-]<<[>>+<<-]<<[>>+<<-]<<[>>+<<-]<<[>>+<<-]<<<[>>>+<<<-]]<]>>>>

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

    # |dy|を計算
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+<<+>>>>>>>>>>>>>>>>>>[-]>+<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<--------->>>>>>>>>>>>>>>>>>[-]>+<<<<<<<<<<<<<<]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<--------->>>>>>>>>>>>>>>>>>[-]>+<<<<<<<<<<<]<<<<<++++++++++>>]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<---------<<<--------->>>>>>>>>>>>>>>>>>[-]>+<<<<<<<<]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<---------<<<---------<<<--------->>>>>>>>>>>>>>>>>>[-]>+<<<<<]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<---------<<<---------<<<---------<<<--------->>>>>>>>>>>>>>>>>>[-]>+<<]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>]<<<<<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]>>>>>>>>>>>>>>>>>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<<<<<<<<<<<<<<<<<+<[-]>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<++++++++++>>>]<<<<<<<<<<<<<<<<<<<<<<<]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]>>>>>>>>>>>>>>>>>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<---------<<<<<<<<<<<<<<<<<<<+<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<<<<<<<<<<<<<<<<<<]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]>>>>>>>>>>>>>>>>>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<---------<<<---------<<<<<<<<<<<<<<<<<<<+<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<<<<<<<<<<<<<<<<<<]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]>>>>>>>>>>>>>>>>>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<---------<<<---------<<<---------<<<<<<<<<<<<<<<<<<<+<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<<<<<<<<<<<<<<<<<<]<<
    [<+>>>+<]>[<]>[-]<<<[>-[>>+<]>[<]>-[+<<<[-]>>>]>>>>>>>>>>>>>>>>>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+<<+<<<---------<<<---------<<<---------<<<---------<<<---------<<<<<<<<<<<<<<<<<<<+<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<<<<<<<<<<<<<<<<<<]

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

    # マンハッタン距離を計算
    [<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-[>>+<]>[<]>-[+>-<<<++++++++++>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-]<<<
    [<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-[>>+<]>[<]>-[+>-[>>+<]>[<]>-[+>-<<<++++++++++>>]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-]<<<
    [<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-[>>+<]>[<]>-[+>-[>>+<]>[<]>-[+>-[>>+<]>[<]>-[+>-<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-]<<<
    [<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-[>>+<]>[<]>-[+>-[>>+<]>[<]>-[+>-[>>+<]>[<]>-[+>-[>>+<]>[<]>-[+>-<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-]<<<
    [<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-[>>+<]>[<]>-[+>-[>>+<]>[<]>-[+>-[>>+<]>[<]>-[+>-[>>+<]>[<]>-[+>-[>>+<]>[<]>-[+>-<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<

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

    # dt - (マンハッタン距離) を計算
    ++++++++++[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+>+<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-]<<<
    ++++++++++[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>+<]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-]<<<
    ++++++++++[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>+<]<<<<<++++++++++>>]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-]<<<
    ++++++++++[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>+<]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-]<<<
    ++++++++++[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>+<]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-]<<<
    ++++++++++[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>[>>+<]>[<]<->>-[+>+<]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]<<<<<++++++++++>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

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

    # dtとマンハッタン距離の偶奇の一致を判定
    [--[--[--[--[[-]>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<]]]]]>>>>>>>>>>>>>>>>>>

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

# 'NO'を出力
>[[-]+++++++++++[>+++++++>++++++++++<<-]>+.>+.<<<->]<

# 'YES'を出力
+[+++++++++[>+++++++++>++++++++++>+++++++++++<<<-]>-.>+.>+++++.<<<]

++++++++++.
```

[提出例](https://beta.atcoder.jp/contests/abc086/submissions/2653558)

# おわりに
Brainf*ckは言語仕様が単純な上に、日本語の記事も豊富なので難解言語の中では取っつきやすい言語だと思います。オンライン実行環境も割とあるので是非遊んでみてください。