せっかくインタープリターを書いたのでbrainfuckでもう少し遊びます。
ただHelloWorldを表示させるのは楽しくないので好きな文字列を表示するbrainfuckソースコードを生成するプログラム(長い!)を作ってみました。
例えば”Hello World!”を入れると以下のようなファイルが生成されます。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
+++++++++++++++++++++++++++++.
+++++++.
.
+++.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++.
++++++++++++++++++++++++.
+++.
ループを使えばもっと短くかけるのですがそれはまた別の機会に…
以下がプログラムです。ここにも置いています。ループ無しで(改行がなければ)一番短いプログラムを出力させているつもりです。(と思っていましたが、書いている最中に、ポインターをインクリメントしたほうが早い場合があると気付きました。メモリを一つだけ使うプログラムの中では最短だと思います。)
使い方:コンパイルして実行にテキストファイルのパス、出力したいファイル名を引数で渡す。
#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;
}