はてなブログの記事をそのまま写しています
マニアックプログラミング略してマニプロの2つ目の記事です!
マニプロでは不定期で、数日かけて有名では無いプログラミング言語の基礎の基礎を習得して皆さんに使いやすさなどを書いていこうと思ってます。
注:ちょっと触ったくらいなので、誤った情報が混ざっている可能性があります
#雑談(飛ばして構いません)
学校でシャトルランがあったのですが、自宅警備員の自分からするとかなりハードな競技です。
10回目:ここら辺は舐めすぎ
20回目:ちょっと苦しいかも、、
30回目:やっぱり苦しい、、
40回目:え?まだ40!?
50回目:もう無理かも;;
60回目:もう視界がぁぁ
70回目:なんやかんや行ける
80回目:$\tiny{心の俺「あとたった10で90台だぞ!!行け!!」}\normalsize{現実}\Large{「無理」}$
てことで結果は80回。厳しい、、、
#本編
シャトルランの話はこれくらいにして、映えある2回目の言語はBrainf*ckです!!!
名前からしてヤバい。逐一、f*ckって書くのは面倒なのでそのままfuckって書きます。
#そもそもBrainfuckとは
完全にネタ言語です。
難解言語として知られています。(Hello World!を出力することすら困難です)
名前の通り、脳みそがfuckされます。
#Brainfuckの特徴
###超難解言語
要素が少なすぎて、逆にこれ以外の特徴が見当たらないです(笑)
初めから、初期値が全て0の長〜い配列が用意されており、そこを移動したり数を足したり出力したりします。
命令できるコマンドがたったの8個しか無いので全て表にしておきます。
文字 | 役割 |
---|---|
> | 1つ右に動く |
< | 1つ左に動く |
+ | ポインタの値を1足す |
- | ポインタの値を1引く |
. | ポインタの値を出力 |
, | 入力から1バイト読み込んで、ポインタが指す先に代入する |
[ | ポインタが指す値が0なら対応する ] の直後にジャンプする |
] | ポインタが指す値が0でないなら対応する [ の直後にジャンプする |
参考 | |
"+"は"++"、"-"は"--"、"."は"print"、"[]"は"while"ってことです。 |
#Brainfuckを使ってみた
https://fatiherikli.github.io/ WEB上で動かせます。
http://web-apps.nbookmark.com/ascii-converter/ 文字列のASCIIコードがすぐ分かるので便利です。
###まずはAを出力
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
+を65回打つことで値が65になり、.で出力するとAと出てきます。(ASCIIコードで65がA)
###次に掛け算
+++[->++++<]
//コメント:3*4
4を3回足して12にしています。
なので、−12にしたい時は、
---[->++++<]
//コメント:誤
+++[->----<]
//コメント:正
---[+>----<]
//コメント:正
Brainfuckの定石みたいなものです。これを使いこなせれば君もBrainfuck初心者卒業だ!
###ようやくHello World!
Helllo World!だけでも色々な書き方がある為、人によってbyte数が違ってきます。
なので、自分なりに一番byte数が少なくなったプログラムを載せておきます。
++++++[->+++<]>[->++++>++++++>++++++>++>+++++<<<<<]>.>-------.>..+++.>----.>---.<<.+++.------.<-.>>+.
//コメント:ASCIIコード:72 101 108 108 111 32 87 111 114 108 100 33
因みに101byteです。100を切れるように頑張ったんですが、自分には無理でした。。。
軽く説明すると、
++++++[->+++<]
この部分で6*3で18を作ります。
>[->++++>++++++>++++++>++>+++++<<<<<]
この部分で184,186・・・18*5を一気に作ります。
これらはASCIIコードを近い数字たちが集まった5グループ([32,33],[108,108,111,114]など)に分け、それらの数字に近い18の倍数の数字です。
そして、その後で数字を微調整して出力しています。
これよりも短く書けたぞ!って人は是非コメントお願いしますm(_ _)m
#Brainfuckを使ってみて
Brainfuckを使ってみました!
どうでしたか? 自分は意外と楽しめた気がします(笑)
パズルを解いてる感覚でした。
一見単純なネタ言語に見えても、実は、同じ値を出力するにしても人によって大きくコードが変わるっていう奥深さもあるっていう点が凄く気に入りました👍
という事で今回はこれで終了! 最後に評価を書いておきます。
記事を読んで頂きありがとうございましたm(_ _)m
#評価
習得のしやすさ★★★★★★★★★★(8つしか無いからリファレンスすら存在しない(多分))
理解のしやすさ★★★★★★★★★★(8つしか無いからサルでも分かる)
読みやすさ ★☆☆☆☆☆☆☆☆☆(可読性は壊滅的)
書きやすさ ★☆☆☆☆☆☆☆☆☆(途中でどこがどんな値か解らなくなって頭がfuckされる)
実用性 ☆☆☆☆☆☆☆☆☆☆(ある訳が無い)
面白いか ★★★★★★★★★★(ハマる)
またやるか ★★★★★★★★★☆(頭の体操がてらやろうと思います)
#参考にしたサイト
https://qiita.com/TomoShiozawa/items/25dcce1540085df71053