LoginSignup
18
1

More than 3 years have passed since last update.

クリスマスシーズンだしみんなでbrainをf*ckしよう

Last updated at Posted at 2019-12-01

はじめに

近大アドカレ 1日目の ネタ 記事になります。

以降のアドカレはとってもためになる記事だと思うので、みなさんよろしくです。

動作環境

みんな大好きdockerくん

$ docker run -itd --name bf sosedoff/brainfuck
$ docker exec -it bf bash

これでだれでもBrainをf*ckできますね。

Brainf*ckってどんな言語?

Esolang(難解プログラミング言語)の一種で実行命令が8種類しかないといった 可読性や記述生に優れた実用的な プログラミング言語ですね。

この言語の特徴はなんといってもコンパイラサイズが小さいことですかね、開発時のコンパイラサイズで123バイト、インタプリタだと98バイトという驚異の小ささです。

「><+-.,[]」以外の文字は全てコメント扱いされる

チューリング完全

関連言語

ついでにBrainf*ckと近い言語の紹介をしておきます。。。

派生言語

  • A ・・・「A」というアルファベット一文字でプログラムを記述する。
  • BrainCrash ・・・Brainf*ckの8つの命令にさらに4つの命令を付け加えたもの
  • Ook! ・・・「Ook.」「Ook!」「Ook?」 の三つから二つを組みわせることで、Brainf*ckの8つの命令を表現した言語
  • siro ・・・電脳少女シロの8つの名言を名言をBrainf*ckに置き換えた言語

Esolang

  • WhiteSpace
  • HQ9+
  • Piet
  • Grass
  • Lazy K

言語仕様

  1. 「>」 ポインタを一つ進める
  2. 「<」 ポインタを一つ戻す
  3. 「+」 ポインタ内の値を1加算する
  4. 「-」 ポインタ内の値を1減算する
  5. 「.」 ポインタの値を出力する
  6. 「,」入力を1バイト読み込み、現在のポインタへセットする
  7. 「[」現在のポインタの値が0の時「]」まで飛ばす
  8. 「]」現在のポインタの値が0でない時「[」まで飛ばす

7と8はセットでループとして扱います。

ごあいさつ

hello.bf
+++++++[>++++++++++<-]>++.<+++++[>++++++<-]>-.+++++++..+++.

これでHelloと出力されます。
はい、意味がわかりませんね。パーツごとに分解していきましょう

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

こうやって分解してみると少し見えてくるかもしれませんね。
1行目がHの出力で、2行目がeの。。。。でn行目がn文字目の出力になっています。

よく見てみると全て行の最後の文字がポインタの値を出力する「.」であることからも見て取れますね。

では、1行目をさらに分解していきます。

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

まず一つ目の塊は
「+」が7つ、つまり先頭のポインタの値を7にしました。

7 0 0 0 0 0 0..... <- ポインタの様子

そして二つ目の塊は
ループですね。
まず、ポインタを一つ進めて、10回2つめのポインタを加算し、
7 10 0 0 0 0 0 ....

一つポインタを戻し、ポインタの値を1減らし
6 10 0 0 0 0 0 ....
6は0ではないので、ループの先頭へと戻ります。

一つポインタを進めて、10回加算し
6 20 0 0 0 0 ....

一つポインタを戻し。ポインタの値を1減らし
5 20 0 0 0 0 ....

と続いていき、
0 70 0 0 0 0 ....
となったときに、ポインタの値が0になったのでループが終了します。

そして最後のブロックで2先頭のポインタから一つポインタを進めて2つめのポインタのあたい、つまり70を2回加算し
0 72 0 0 0 0 ...
となり、2つめのポインタの値、「72」を出力します。

この72がなにを示すかと言うとASCIIコード表とにらめっこすると10進数で72はHであることがわかります。

このようにして、まず一文字目の「H」が出力されます。
次は「e」ですね、ASCIIコード表によると「101」ですね。

文字を出力したからと言ってポインタにセットされた値が消えるわけではないので、72からスタートします。

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

先ほどと同様に、ポインタの値を101にし最後に出力し、これで「e」が出力され、次の「l」は、108なので、
+++++++.これで7回加算ですね。その次も「l」なので、そのまま出力し、最後は「o」の111にするために+++.で3回加算し、出力でターンエンドです。

このようにして、Brainf*ckでこんにちはができています。

では、本当にこれでできているか確認してみましょう。

$ docker exec -it bf bash
# brainfuck
>> +++++++[>++++++++++<-]>++.<+++++[>++++++<-]>-.+++++++..+++.
Hello

となればあなたも無事brainをf*ckできたということですね。

おつかれさまでした。
次回の近大アドカレをおたのしみに〜 じゃんk。。。(ここで通信は途絶えているようだ)

参考

18
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
1