BrainfuckでAtCoderを解いてみたpart.1
タイトル通りBrainfuckでAtCoderの問題を解いてみました。BrainfuckとAtCoderの説明は5000兆人がすでにしているのでそちらをご覧ください。(BrainfuckでのAtcoderの記事もn人が書いてるじゃないか!)
まずは問題を"解いて"みよう
今回解いてみた問題はこちらです。https://atcoder.jp/contests/abc073/tasks/abc073_a
ABC073のA問題ですね。問題文を引用します。
今、日本は9月9日です。二桁の整数Nが与えられるので、十進法でNに9が含まれるか答えてください。
一目見て解法が頭に浮かぶと思います。試しにPython3で解法を書くとこんな感じですね。
N=list(str(input()))
if "9" in N:
print("Yes")
else:
print("No")
これを提出すると通ります。やったー。
解説もクソもないですが要するに与えられた二桁の整数に9が含まれるかどうか判定する___だけ___ですね。ではこれをBrainfuckで実装してみます。
Brainfuckで実装してみよう
まず整数Nが一桁だとして考えます。
入力を受け付けます。
,
はい、入力を受け付けました。それではこの整数が"9であるかどうか"を判定します。9は一桁の整数の中で最も大きいので8より大きいかそうでないかを判別します。
,
>++++++++
++++++++++++++++++++++++++++++++++++++++++++++++
<
>[
<[->>+>+<<<]>
>>[-<<<+>>>]<<
>[[-]<<->>]<
-
]<
これで与えられた整数が8より大きいとき、つまり9のとき、最初のポインタは1を示します。それ以外のときは0を示します。
次に与えられた整数が9のとき"Yes"を、それ以外のとき"No"を出力させます。
>>>>>>>>+<<<<<<<<
[[-]>
+++++++++[
>+++++++++
+<-]>-.<+++
[>++++<-]>
.<+++++++[
>++<-]>.
>>>>>>-<<<<<<
<<]
>>>>>>>>
[[-]>
++++++++++
+[>+++++++
<-]>+.<+++
[>++++++++
+++<-]>.
<<]
これで与えられた整数が一桁のときにそれが9であるかどうか判別することが出来ました。
次はいよいよ二桁の整数Nについてですが実はこれは___先ほどの処理を"No"と出力する代わりにもう一度行う___ことで出来てしまいます。
以下に全体のコードを示します。
,
>++++++++
++++++++++++++++++++++++++++++++++++++++++++++++
<
>[
<[->>+>+<<<]>
>>[-<<<+>>>]<<
>[[-]<<->>]<
-
]<
>>>>>>>>+<<<<<<<<
[[-]>
+++++++++[
>+++++++++
+<-]>-.<+++
[>++++<-]>
.<+++++++[
>++<-]>.
>>>>>>-<<<<<<
<<]
>>>>>>>>
[[-]>
,
>++++++++
++++++++++++++++++++++++++++++++++++++++++++++++
<
>[
<[->>+>+<<<]>
>>[-<<<+>>>]<<
>[[-]<<->>]<
-
]<
>>>>>>>>+<<<<<<<<
[[-]>
+++++++++[
>+++++++++
+<-]>-.<+++
[>++++<-]>
.<+++++++[
>++<-]>.
>>>>>>-<<<<<<
<<]
>>>>>>>>
[[-]>
++++++++++
+[>+++++++
<-]>+.<+++
[>++++++++
+++<-]>.
<<]
<<]
これを提出すると通ります。やったね!
おわりに
ご覧の通りAtCoderの問題をBrainfuckで少し苦労すると解くことが出来ました。これからもBrainfuckで解いた問題があればこういった形で残そうと思います。
Brainfuckは実際に書いてみるとプログラミング言語のありがたさが分かるものです。僕と同じくプログラミング初心者の方はBrainfuckに触れてみることで普段使っている言語に感謝の気持ちが芽生えると思います。
最後になりましたがこの問題のBrainfuckでのshortestcodeは126Byteでした。すごいですね。僕もshortest取れるように精進したいです。