AtCoderでBrainfuckをはじめてみる
はじめに
こんにちは、LiKafです。
早いもので私も23歳になりました。
そこで今回は(論理的飛躍)AtCoderでBrainfuckをはじめてみようと思います。
大丈夫ですみなさん。僕もこの文章を書いている今、何一つBrainfuckのことを知らないので、心配しないでください。
ちなみに脱線を多く含むので、本質だけ読みたい人は「動作を確認してみる」の章に飛んでもらえるとありがたいです。
AtCoderをよく知らない方は、
AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~とかを参考にしてください。
(もしやったことないなら、やってみた方がいいと思います。異常に楽しいです、ガチで。)
Brainfuckとは
そもそもBrainfuckとはどんな言語でしょうか
なんだかんだ僕はC++やPython、JavaScript、Goなどそれなりの言語を触った(できるとは言ってない)ことがあるので舐めてもらっては困ります
とりあえず適当にコードを読んで文法を確認していきます
+[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+.
ミャあ🫨🫨🫨🫨🫨🫨🫨🫨🫨
まぁ何がなんなのか何もわからないのですが、(多分)この記事を最後まで読むだけでこの意味不明なBrainfuckを読み書きできるようになります
(まだ今この文章書いてる俺には何もわかってない、辛い、諦めようかな)
とりまBrainfuckの概要を調べました(公式Documentsみつからなかったです)
8つの命令だけで成り立ってるの!?クソ簡単言語じゃん(コミュニティノート案件)
8つの命令の全て
うだうだいってても仕方ないので8つの命令を見てみましょう
はい、覚えましたね
でもこれをどう使えばいいんでしょうか、if文とかどうするの??
AIに勝てる人材になろう
ChatGPTに問題を解いて解説してもらおう!
困った時のChatGPTくんです
月額3000円をお支払しているので、困っている時は積極的に活用していかないと大損してしまいます
ここぞとばかりに使っていきましょう
この良記事に倣って(ステマ)簡単な問題をBrainfuckで解いてもらって、そのコードの解説をしてもらうことでお勉強をしていこうと思います
以下の問題をChatGPTに投げました
以下がChatGPTくんの回答です
草、これ以上簡単な問題って何ですか?
n = int(input())
if n > 0:
print("Yes")
else:
print("No")
Python、お前はすごい。すごいよ。
そうでした、「(理論的には)可能」なことは大抵「現実的には不可能」でした
くよくよしていてもどうしようもないので、
「Brainfuckで解ける問題を作ってそれを解いて」もらいました
ChatGPTの作った問題文
ChatGPTの回答?
,----------[++++++++++>,----------]<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>>[-]<<[<]>[.>]
おっ!なんか知らんけどできてそう!!
試しにAtCoderのコードテストで実行してみます
できていませんでした
昨今、ChatGPTに代表される生成系AIに仕事が奪われると話題ですが、見つけました。AIの禁足地を。それはBrainfuckです。(修士のテーマにしよかな『Brainfuckに強い言語モデルの提案』)
ChatGPTは解雇して、自力でやります
動作を確認してみる
不慣れな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制御文字のせいです。
これで8つ全ての命令をマスターしましたね!!
ChatGPTが作った問題を解いてみる
あれ?この知識でChatGPTの作った問題自力で解けるのでは???
やってみましょう
問題
考察
"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にする
] // 抜ける
まって、
えぐい、
楽しい。
Brainfuck楽しすぎるだろ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
あの、すごく楽しいです
こういうのを求めていました
おまけでもう1問やります
Brainfuckの楽しさに気づいてしまった僕を止めれる人はもういません
問題
考察
一文字目だけ受け取って出力するだけじゃん、はいはい,.ね
コード
,.
さぁ、これで君もBrainfucker!!!!!!!!!
おわりに
Brainfuckをやってみました。
どうでしたか???
今後また使うかはわかりませんが、僕的には非常に面白かったです。
この記事を読んでBrainfuckerが一人でも多く誕生することを祈って終わりの言葉とさせていただきます。
最後まで読んでいただきありがとうございました!!!
この記事が気に入ったらサポートをしてみませんか?