Brainfuckインタープリタをできるだけ短く書く

過去のブログのアーカイブ
この記事は前身のブログのアーカイブを引き継いだものです. 画像が正しく表示できないなど,コンテンツの表示に問題がある恐れがあります.

昔のプロジェクトを掘り起こしていたらたまたま出てきた”Brainfuckのインタープリタ”
除いてみたらとんでもコードだった

出てきたコードはこのコート。最小目指してるといっても普通にもっと短くできそうです。

static void Main()
{
 string _ = Console.ReadLine();
 int[] m = new int[256], s = new int[9];
 int i = 0, p = 0, l = 0, d = -1, c;
 for (; i < _.Length; i++)
 {
 c = _[i];
 if (d != -1) { d += c == 91 ? 1 : c == 93 ? -1 : 0; break; }
 switch (c)
 {
 case 43: m[p]++; break;
 case 45: m[p]--; break;
 case 62: case 60: p += c - 61; break;
 case 46: Console.Write((char)m[p]); ; break;
 case 44: m[p] = Console.Read(); break;
 case 93: if (m[p] < 1) l--; else i = s[l]; break;
 case 91: if (m[p] < 1) d = 0; else s[++l] = i; break;
 }
 }
 Console.ReadKey();
}

判定式が文字コードっていう時点でもう読む気がなくなるコードですね…後変数が1文字だったりとか、いろいろ崩壊してます。
さらにこのインタープリタ、そもそも処理できるものも限られていて、メモリは256個、メモリに代入できる数値はintの範囲まで。
ループは9個重ねることができます。
ただ最適化してるだけあって処理はあまり遅くないように感じます。
このコード、空白や改行などソースコードにいらないものを取り除いて行ったら431文字だったのですが、どうでしょう。
良ければこれより短いコードを書いた方、報告していただけると嬉しいです。
ついでに、これが徹底的に無駄をなくしたコード。

static void Main(){string _=Console.ReadLine();int[] m=new int[256],s=new int[9];int i=0,p=0,l=0,d=-1,c;for(;i<_.Length;i++){c=_[i];if(d!=-1){d+=c==91?1:c==93?-1:0;break;}switch(c){case 43:m[p]++;break;case 45:m[p]--;break;case 62:case 60:p+=c-61;break;case 46:Console.Write((char)m[p]);;break;case 44:m[p]=Console.Read();break;case 93:if(m[p]<1)l--;else i=s[l];break;case 91:if(m[p]<1)d=0;else s[++l]=i;break;}}Console.ReadKey();}

このコードなら、コンソールアプリケーションを作って、Program.csをこれに置き換えても使えます。なおこちらのコードなら456文字となっています。

using System;class test{static void Main(){string _=Console.ReadLine();int[] m=new int[256],s=new int[9];int i=0,p=0,l=0,d=-1,c;for(;i<_.Length;i++){c=_[i];if(d!=-1){d+=c==91?1:c==93?-1:0;break;}switch(c){case 43:m[p]++;break;case 45:m[p]--;break;case 62:case 60:p+=c-61;break;case 46:Console.Write((char)m[p]);;break;case 44:m[p]=Console.Read();break;case 93:if(m[p]<1)l--;else i=s[l];break;case 91:if(m[p]<1)d=0;else s[++l]=i;break;}}Console.ReadKey();}}

試した所きちんど動作した。のはいいものやってるうちに自分がなにしてるのかわからなくなってきた…
もともと短いコードで何でもできる言語なので、インタープリタも短く作っていきたいですね
動作テスト用にHello, world!のBrainfuckコード置いておきますね

+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<++++++++.--------.+++.------.--------.>+.