cormoran's note


cormoran

競技プログラミング・電子工作・ロボットなどで遊びます



Recent Post




Table

Brainfuck で HelloWorld など

せっかくインタープリターを書いたので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;
}
comments powered by Disqus