ファッキンコールドな冬に捧ぐ、逆Brainf*ck
この記事は裏TUT Advent Calendar 2023の22日目の記事です。
ハロー、昨日です。情報・知能工学課程(3系)に所属しているバチェラーです。普段は昨日飯店というふざけたサイトで遊んでいます。note使ってみたかったので今回はこっちで記事を書きます。
新入生向けの宿舎についての記事も書いているので、良ければご覧ください。
宿舎(寮)生活スーパースタートダッシュガイド
さて皆さん。冬ですね。寒すぎてサムズアップ畑ですね。
こんな季節には、わけわからん言語でプログラミングがしたくなってきますよね。ということで、Brainf*ckというプログラミング言語で遊びます。Brainf*ckは8種類の命令でいろいろやろうって言語です。詳しくはWikipediaとか他の記事とかを読んでみてください。以下では、「A」を出力する例で簡単に説明します。
++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ +++++.
(実行結果)A
このように、「+」を65回インクリメントして、最後に「.」で文字を出力します。「65」はASCIIコードの「A」に対応しています。
さらに!裏アドカレということで、Brainf*ckの逆、任意の文字列をBrainf*ckに変換するプログラムを作成してみましょう!あれ、ここは裏アドカレ、今から作るのは、逆...?破綻しましたが、気にせず行きましょう。Brainf*ckの一種の答え合わせとしても使えて便利そうでいいですよね。
Brainf*ckはこのページにWebページ上で動作するエミュレータとサンプルが載っているので、誰でも簡単に遊べると思います。私はColab上にインストールして使ってみます。
こうして
!apt-get install bf
こう
!bf hw.bf
(実行結果)HELLO WORLD!
「hw.bf」がBrainf*ckのソースコードで、中身はこうなってます。
+++++++++++[>++++++>++++++>+++>++++++++<<<<-]>+++>++++++.<.>++++..+++.>-.>-.<<.>>-----.<<---.<-.>>+.
簡単に説明すると、
+++++++++++[>++++++>++++++>+++>++++++++<<<<-]
この部分で、先頭の箱に11を入れて、それをデクリメントして0になるまで6、6、3、8をそれぞれほかの箱に足し合わせています(「H」「E」「L」「O」を作るためのある程度大きい数)。「>」「<」で隣の箱に移動です。これ以降の部分で少しずつ値を増減させて文字を表示しています。簡単ですね。こういうチマチマやるパズルみたいな言語面白いですよね。アセンブリみたいで。
さて、これでBrainf*ckはマスターしたので後はそれぞれのご家庭で遊んでいただくとして、本命の逆Brainf*ckを作っていきます。特にプライドとかは持ち合わせていないのでPythonでやります。
def str2bf(text):
bf_program = ""
current_value = 0
for char in text:
ascii_value = ord(char)
difference = ascii_value - current_value
if difference > 0:
bf_program += '+' * difference
elif difference < 0:
bf_program += '-' * abs(difference)
bf_program += '.'
current_value = ascii_value
return bf_program
text = input()
bf_code = str2bf(text)
print(bf_code)
終わりです。何やってるかはプログラム読んでいただけるとすぐわかると思います。「Hello, World!」を入力してみましょう。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++.+++++++..+++.-------------------------------------------------------------------.------------.+++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++++++++++++++++++++.+++.------.--------.-------------------------------------------------------------------.
こうなりました。出力を見ればわかる通り、箱を一つだけ使って、出力したい文字のASCIIコードになるまでインクリメントとデクリメントをひたすら繰り返すだけです。まさに愚鈍。
このままでは可読性が悪いですね。もともと可読性も何もねえだろって話は棚に上げておきます。そのうちぼたもちになって降ってくることを願いましょう。ということでもうちょっと頑張ってみます。あと、ついでに入出力をテキストファイルでできるようにします。これでASCIIコードといえばのアレ、アスキーアートを扱えます。
def str2bf(text):
# 各文字に対して、最も近い既存の文字からの距離を見つける
def closest_distance(target, memory):
closest = None
for idx, value in enumerate(memory):
if closest is None or abs(target - value) < abs(target - memory[closest]):
closest = idx
return closest, target - memory[closest]
memory = [0]
bf_program = ""
current_cell = 0
for char in text:
ascii_value = ord(char)
closest_cell, distance = closest_distance(ascii_value, memory)
# 最も近いセルまで移動
bf_program += '>' * (closest_cell - current_cell) if closest_cell > current_cell else '<' * (current_cell - closest_cell)
current_cell = closest_cell
bf_program += '+' * distance if distance > 0 else '-' * abs(distance)
bf_program += '.'
memory[current_cell] = ascii_value
if current_cell == len(memory) - 1:
memory.append(0)
return bf_program
with open('/content/input.txt', 'r') as r:
text = r.read()
bf_code = str2bf(text)
with open('/content/f.bf', 'w') as w:
w.write(bf_code)
こんな感じになりました。「Hello, World!」を入力してみましょう。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++.+++++++..+++.>++++++++++++++++++++++++++++++++++++++++++++.------------.<------------------------.++++++++++++++++++++++++.+++.------.--------.>+.
半分くらいの長さになりましたね。まだまだ短くできそうですが、これ以上はちょっと難しかったです。時間もアルゴリズムこねこねする頭もなかったので。言い訳なんてしていいわけ!?!??はい、ビバ良い。
最後に、アスキーアートをBrainf*ckコードに変換してみましょう。
^ ^
( ' v `) < fuck
( )
| | |
(___) __)
アスキーアート初心者の全力アスキーアートです。あとこの記事のヘッダー画像の伏線回収です。
++++++++++++++++++++++++++++++++......++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++.....<.>>++++++++++.<....++++++++.--------...+++++++.-------.<++++++++++++++++++++++++.>.<----------------------.>+++++++++.---------.++++++++++++++++++++++++++++.>++++++++++++++++++++++.<<++++++.+++++++++++++++.------------------.++++++++.>>>++++++++++.<....++++++++.--------.......+++++++++.>.<---------....<<+++++++++++++++++.>>...<<.>>..<<.>>>.<....++++++++.<<-----------------------------...>>+.---------.<<..>>+++++++++.
561文字でした。ちなみに改良する前のプログラムでは、
++++++++++++++++++++++++++++++++......++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.--------------------------------------------------------------.....++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.------------------------------------------------------------------------------------.++++++++++++++++++++++....++++++++.--------...+++++++.-------.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.--------------------------------------------------------------------------------------.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-------------------------------------------------------.---------.++++++++++++++++++++++++++++.----------------------------.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++.------------------.++++++++.-------------------------------------------------------------------------------------------------.++++++++++++++++++++++....++++++++.--------.......+++++++++.-------------------------------.++++++++++++++++++++++....++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.--------------------------------------------------------------------------------------------...++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.--------------------------------------------------------------------------------------------..++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.------------------------------------------------------------------------------------------------------------------.++++++++++++++++++++++....++++++++.+++++++++++++++++++++++++++++++++++++++++++++++++++++++...------------------------------------------------------.---------.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..------------------------------------------------------.
となり、1934文字でした。やかましすぎる。ネオン街かよ。
ということで、この辺で終えます。わけわからん記事にお付き合いいただきありがとうございました。もうすぐクリスマスですが、おひとりの方は街を歩くカップルへの怨念をBrainf*ckで書いてみてはどうでしょうか。まあ僕はそんなことしませんけど。
作成したプログラムを含め、その他使いどころのないプログラム達はこちらで公開しているので、気になった方は是非ご覧ください。
明日の記事はT_TEST__さんの「VRDJについて」です。
ではさようなら。
この記事が気に入ったらサポートをしてみませんか?