画像
画像

ABOUT

画像

WORK

画像

ARTICLES

画像

CONTACT

画像
画像

1

Branfuck、試してみた

作成日時: 2022/12/01

更新日時: 2022/12/05

            
            
# はじめに brainf\*ckとは、`+` `-` `[` `]` `>` `<` `.` `,`のみで表現する、~~頭のおかしい~~珍しいプログラミング言語です。 ふと気になって試してみたので、ついでに記事にしました。 # インストール mac使ってるのでhomebrew経由で入れます。 ``` brew install brainfuck ``` ## バージョン確認 一応実行。 ``` brainfuck -v ``` 結果。 ``` brainfuck 2.7.3 (Nov 10 2021, 23:20:41) Copyright (c) 2016 Fabian Mastenbroek. Distributed under the Apache License Version 2.0. ``` # 基本操作 `+`で値を1つ増やし、`-`で値を1つ減らす。 `>`でポインタ(参照先の場所)を右にずらし、`<`で左にずらす。 `.`で出力。 これだけ。 ## イメージ ポインタを知ってるとあーはいはいって感じだと思います。 `+`で値を1つ増やしたり `>`で参照先の箱を右にずらしたり `++`で値を2つ増やしたり `.`で出力したり。
![bf6](/images/articles/15/brainf*ck6.png) # "A" `Hello World`はややめんどくさそうなので、とりあえず`A`を出力してみます。 **ファイルの拡張子は`.bf`、実行は`brainfuck ファイル名`。**
``` +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++. ``` ![eee](/images/articles/15/brainf*ck2.png) `A`が出力されました。 ちなみに`+`を65個書いてますが、65はasciiコードで`A`に対応しています。([asciiコード表](https://e-words.jp/p/r-ascii.html) 一般的な言語でも、char型の'A'をint型にキャストして出力すると`65`が出力されると思います。 # "A\nB\nC\n" ABCの間に改行を入れて出力してみます。 改行の`\n`はasciiコードで10と対応しています。
``` +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>++++++++++<.>.<+.>.<+.>. ``` ![bf5](/images/articles/15/brainf*ck5.png) ## 解説1 1. `+`を65個入力し、`A`を保存する。 2. `>`でポインタ(参照先の場所)を右にずらす。 3. `+`を10個入力し、`\n`を保存する。 4. `<`で参照先を左(`A`が格納されている場所)にずらし、`.`で出力。 5. `>`で参照先を右(`\n`が格納されている場所)にずらし、`.`で出力。 6. `<`で参照先を左にずらし、`+`で値を1つ増やし(66になる)、`.`で出力。 7. 5, 6, 5を繰り返し、`\nC\n`を出力する。 # while文 **`[`でループを開始し、`]`が読まれた時に参照している値が0の場合、ループを抜ける** 先ほどの`A\nB\nC\n`をwhile文を使って多少汎用性をあげます。 ``` +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>++++++++++>+++[<<.+>.>-] ``` ![bf7](/images/articles/15/brainf*ck7.png) ## 解説2 1. `+`を65個で`A`を保存。 1. `>`で参照先を右にずらし、`+`10個で`\n`を保存。 1. `>`で参照先を右にずらし、`+`3個分(ループ回数の変数用)を保存。 1. `[`でループ開始。 1. `<<`で参照先を左に2つずらし、`.`で`A`を出力、`+`で値を1つ増やしておく。 1. `>`で参照先を右にずらし、`.`で`\n`を出力。 1. `>`で参照先を右にずらし、`-`で値を1つ減らす。 1. 5-7を3回繰り返すと、右端の箱の値が0になり、`]`でループ終了。 # その他 - 四則演算とかやるとしたら各桁の箱用意して他の言語が内部の2進数でやってるような事を頑張るしかないですかね。。 # 参考文献 - [Brainfuck](https://ja.wikipedia.org/wiki/Brainfuck) wikipediaです。 - [Brainfuck 超入門](https://qiita.com/TomoShiozawa/items/25dcce1540085df71053) qiita記事です。ぶっちゃけこれでいい。