cormoran.me



Brainfuck で HelloWorld など

せっかくインタープリターを書いたのでbrainfuckでもう少し遊びます。

ただHelloWorldを表示させるのは楽しくないので好きな文字列を表示するbrainfuckソースコードを生成するプログラム(長い!)を作ってみました。

 例えば”Hello World!”を入れると以下のようなファイルが生成されます。

language: ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++. +++++++++++++++++++++++++++++. +++++++. . +++. +++++++++++++++++++++++++++++++++++++++++++++++++++++++. ++++++++++++++++++++++++. +++.

ループを使えばもっと短くかけるのですがそれはまた別の機会に…

以下がプログラムです。ここにも置いています。ループ無しで(改行がなければ)一番短いプログラムを出力させているつもりです。(と思っていましたが、書いている最中に、ポインターをインクリメントしたほうが早い場合があると気付きました。メモリを一つだけ使うプログラムの中では最短だと思います。)

使い方:コンパイルして実行にテキストファイルのパス、出力したいファイル名を引数で渡す。

language: ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 #include<iostream> #include<fstream> #include<string> #include<cstdlib> int main(int argc,char **argv){ if(argc!=3){std::cerr<<"please input following format : inputfilepath outputfilename"<<std::endl;exit(0);} std::ifstream ifs(argv[1]); if(ifs.fail()){std::cerr<<"no such file"<<std::endl;exit(0);} std::string input="",output=""; unsigned char value=0; while(getline(ifs,input)){ input.push_back('\n'); for(int i=0;i<input.size();i++){ int diff=abs((int)input[i]-(int)value+256) - abs((int)value+256-(int)input[i]); //incrementしたほうが近い場合 if(diff>0){ while(value!=input[i]){++value;output.push_back('+');} } //decrementしたほうが近い場合 else if(diff<0){ while(value!=input[i]){--value;output.push_back('-');} } output+=".\n"; } } ifs.close(); std::ofstream ofs(argv[2]); ofs<<output; ofs.close(); return 0; }