見出し画像

AtCoderでBrainfuckをはじめてみる

はじめに

こんにちは、LiKafです。

早いもので私も23歳になりました。
そこで今回は(論理的飛躍)AtCoderでBrainfuckをはじめてみようと思います。
大丈夫ですみなさん。僕もこの文章を書いている今、何一つBrainfuckのことを知らないので、心配しないでください。

ちなみに脱線を多く含むので、本質だけ読みたい人は「動作を確認してみる」の章に飛んでもらえるとありがたいです。


AtCoderをよく知らない方は、
AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~とかを参考にしてください。
(もしやったことないなら、やってみた方がいいと思います。異常に楽しいです、ガチで。)




Brainfuckとは

そもそもBrainfuckとはどんな言語でしょうか

なんだかんだ僕はC++やPython、JavaScript、Goなどそれなりの言語を触った(できるとは言ってない)ことがあるので舐めてもらっては困ります

とりあえず適当にコードを読んで文法を確認していきます

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

ミャあ🫨🫨🫨🫨🫨🫨🫨🫨🫨

まぁ何がなんなのか何もわからないのですが、(多分)この記事を最後まで読むだけでこの意味不明なBrainfuckを読み書きできるようになります

(まだ今この文章書いてる俺には何もわかってない、辛い、諦めようかな)



とりまBrainfuckの概要を調べました(公式Documentsみつからなかったです)

Brainfuckプログラムは非常に可読性・記述性が低いため実用性は期待できないが、チューリング完全である。その簡潔さから多くの派生言語を生み出すこととなった。

https://ja.wikipedia.org/wiki/Brainfuck

Brainfuckは非常に小さなプログラミング言語で、たった8つの文から構成されている。この言語は "チューリング完全 "であり、(理論的には)BasicやCで可能なあらゆる計算を行うことができる。(DeepLより翻訳)

https://docs.google.com/document/d/1M51AYmDR1Q9UBsoTrGysvuzar2_Hx69Hz14tsQXWV6M


8つの命令だけで成り立ってるの!?クソ簡単言語じゃん(コミュニティノート案件)



8つの命令の全て

うだうだいってても仕方ないので8つの命令を見てみましょう

はい、覚えましたね

でもこれをどう使えばいいんでしょうか、if文とかどうするの??



AIに勝てる人材になろう

ChatGPTに問題を解いて解説してもらおう!

困った時のChatGPTくんです

月額3000円をお支払しているので、困っている時は積極的に活用していかないと大損してしまいます
ここぞとばかりに使っていきましょう

この良記事に倣って(ステマ)簡単な問題をBrainfuckで解いてもらって、そのコードの解説をしてもらうことでお勉強をしていこうと思います


以下の問題をChatGPTに投げました

標準入力から整数 n が与えられます。n が正の場合、"Yes" を出力し、それ以外の場合(0または負の数)は "No" を出力してください。

簡単だね

以下がChatGPTくんの回答です

この問題に対するBrainfuckの解答はかなり挑戦的です。Brainfuckは非常に原始的な言語で、直接的な数値比較や条件分岐がサポートされていません。

〜略〜

Brainfuckの代わりにもう少し高機能なプログラミング言語を選択することをお勧めします。

草、これ以上簡単な問題って何ですか?


n = int(input())
if n > 0:
    print("Yes")
else:
    print("No")

Python、お前はすごい。すごいよ。


そうでした、「(理論的には)可能」なことは大抵「現実的には不可能」でした

くよくよしていてもどうしようもないので、
「Brainfuckで解ける問題を作ってそれを解いて」もらいました


ChatGPTの作った問題文

標準入力から英小文字が1文字与えられます。それが"a" の場合"b"を出力し、それ以外の場合は "c" を出力してください。

ChatGPTの回答?

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

おっ!なんか知らんけどできてそう!!
試しにAtCoderのコードテストで実行してみます

できていませんでした


昨今、ChatGPTに代表される生成系AIに仕事が奪われると話題ですが、見つけました。AIの禁足地を。それはBrainfuckです。(修士のテーマにしよかな『Brainfuckに強い言語モデルの提案』)


ChatGPTは解雇して、自力でやります

ガチで解約しました。一年半、4万円以上もありがとう。



動作を確認してみる

不慣れなTexで卒論を書いてる時、いつもそばで教えてくれたChatGPTはもう今はいません
今できることは一つ一つ理解を深めていくことです

さて、再度8つの命令を全ておさらいしてみましょう


入出力・移動(,.<>)

,      // 1セル目で入力を受け取る
.      // 1セル目を出力する

素晴らしい。hを1セル目で受け取って、それを出力できています

ちなみに、二文字受け取る時はこうすればOK

,      // 1セル目で入力を受け取る
>      // 2セル目に移動
,      // 2セル目で入力を受け取る
<      // 1セル目に移動
.      // 1セル目を出力する
>      // 2セル目に移動
.      // 2セル目を出力する

あれ、もしかして、Brainfuck簡単???


While文・インクリメント・デクリメント([]+-)

,      // 1セル目で入力を受け取る
[      // 1セル目が0の時に5行目に移動
.      // 1セル目を出力する
-      // 1セル目の値を1減らす
]      // 1セル目が0でない時2行目に移動

入力として'a'、つまり内部ではASCIIコードでは97を受け取るので、それが0になるまで、つまり97回

.      // 1セル目を出力する
-      // 1セル目の値を1減らす

が行われていることがわかります


Q. あれ?でもよく数えたら65文字(スペースを含む)しか生成されてないけど…?
A. ASCII制御文字のせいです。

初めの32文字(10進数で0–31)はASCIIでは制御文字として予約されている。基本的にはこれらの制御文字は表示するための文字ではなく、モニタプリンタなどの機器を制御するために用いられる。

これで8つ全ての命令をマスターしましたね!!



ChatGPTが作った問題を解いてみる

あれ?この知識でChatGPTの作った問題自力で解けるのでは???
やってみましょう

問題

標準入力から英小文字が1文字与えられます。それが"a" の場合"b"を出力し、それ以外の場合は "c" を出力してください。

考察

"a"のASCIIコードは97だから、入力を97回デクリメントして、
それが0なら"b"(ASCIIコード98)を出力するために98回インクリメントして出力
そうでないなら0に初期化した上で99回インクリメントして"c"を出力

すればいいだけじゃないか…??

コード

,                     // 1セル目で入力を受け取る

>                     // 2セル目に移動
+                     // 2セル目を1にする("a"かどうかのフラグとして機能)
<                     // 1セル目に移動

--------------------
--------------------
--------------------
--------------------
-----------------     // 97減らす

[                     // 97減らした結果0ではない、つまり入力がaでない時
>                     // 2セル目に移動
-                     // 2セル目を0にする("a"ではなかったのでFalse(0)にする)
<                     // 1セル目に移動
[-]                   // 1セル目を0に初期化
++++++++++++++++++++
++++++++++++++++++++
++++++++++++++++++++
++++++++++++++++++++
+++++++++++++++++++   // 99増やす(ASCIIコードで"c"に対応)
.                     // "c"を出力
[-]                   // 1セル目を0にする
]                     // 抜ける

>                     // 2セル目に移動("a"かどうかのフラグとして機能しているセル)
[                     // 2セル目が0でない、つまり入力が"a"であるとき、
<                     // 1セル目に移動
++++++++++++++++++++
++++++++++++++++++++
++++++++++++++++++++
++++++++++++++++++++
++++++++++++++++++    // 98増やす(ASCIIコードで"b"に対応)
.                     // "b"を出力
[-]                   // 1セル目を0にする
]                     // 抜ける
入力が"a"
入力が"a"以外

まって、


えぐい、

楽しい。


Brainfuck楽しすぎるだろ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


あの、すごく楽しいです
こういうのを求めていました



おまけでもう1問やります

Brainfuckの楽しさに気づいてしまった僕を止めれる人はもういません

問題

文字列 S が与えられます。S の頭文字を出力してください。

考察

一文字目だけ受け取って出力するだけじゃん、はいはい,.ね


コード

,.
https://atcoder.jp/contests/iroha2019-day1/submissions/51491386


さぁ、これで君もBrainfucker!!!!!!!!!



おわりに

Brainfuckをやってみました。
どうでしたか???

今後また使うかはわかりませんが、僕的には非常に面白かったです。

この記事を読んでBrainfuckerが一人でも多く誕生することを祈って終わりの言葉とさせていただきます。


最後まで読んでいただきありがとうございました!!!

この記事が気に入ったらサポートをしてみませんか?