2849 brainf*ck

問題概要

brainfuckインタプリタを作成せよ。
メモリのサイズは32768で、値は0〜255を取る。

解法

定義にしたがって実装する。
メモリの値が0〜255なので、unsigned charを使えばいちいちmodを取る手間がないので良いかも。

ソースコード

const int M=32768;
char in[200000],op[200000];
unsigned char m[M];
int p;

int main()
{
	int CS; scanf("%d ",&CS);
	rep(cs,CS){
		op[0]=0; int d=0;
		while(gets(in),in[0]!='e'){
			for(int i=0;in[i];i++){
				if(in[i]=='[')d++;
				if(in[i]==']')d--;
				if(in[i]=='%'){
					in[i]=0; break;
				}
			}
			strcat(op,in);
		}
		printf("PROGRAM #%d:\n",cs+1);
		if(d!=0){
			puts("COMPILE ERROR"); continue;
		}
		p=0; rep(i,M)m[i]=0;
		for(int i=0;op[i];i++){
			if(op[i]=='>')p=(p+1)%M;
			if(op[i]=='<')p=(p+M-1)%M;
			if(op[i]=='+')m[p]++;
			if(op[i]=='-')m[p]--;
			if(op[i]=='.')putchar(m[p]);
			if(op[i]=='['&&m[p]==0){
				for(d=0;;i++){
					if(op[i]=='[')d++;
					if(op[i]==']')d--;
					if(d==0)break;
				}
				continue;
			}
			if(op[i]==']'&&m[p]){
				for(d=0;;i--){
					if(op[i]=='[')d--;
					if(op[i]==']')d++;
					if(d==0)break;
				}
				continue;
			}
		}
		puts("");
	}
	return 0;
}