论使用Brainf**k解决该题的可能性
2024-08-19 09:34:13
发布于:北京
2阅读
0回复
0点赞
背景
不想写了,自己查去。
话说有人试过bf吗
#include <bits/stdc++.h>
using namespace std;
string clear(string c){//bf只支持这些符号
	string r;
	for(int i=0;i<c.size();i++){
		char ch=c[i];
		if(ch=='+'||ch=='-'||ch=='<'||ch=='>'||
		   ch=='.'||ch==','||ch=='['||ch==']'){
			r+=ch;
		}
	}
	return r;
}
map<int,int> v;
void loops(string c){//匹配循环
	stack<int> s;
	for(int i=0;i<c.size();i++){
		if(c[i]=='['){
			s.push(i);
		}
		else if(c[i]==']'){
			v[s.top()]=i;
			v[i]=s.top();
			s.pop();
		}
	}
	if(!s.empty()) exit(1);
}
const int N=1e5+5;//内存大小
unsigned char mem[N];//内存
int ptr,mxp;//指针,mxp是debug用的
void runBF(string c,bool debug=false){//BF,启动
	for(int i=0;i<c.size();i++){
		switch(c[i]){
			case '+':
				mem[ptr]++;
				break;
			case '-':
				mem[ptr]--;
				break;
			case '<':
				ptr--;
				if(ptr==-1) ptr=N-1;
				break;
			case '>':
				ptr++;
				ptr%=N;
				mxp=max(ptr,mxp);
				break;
			case '.':
				printf("%c",mem[ptr]);
				break;
			case ',':
				scanf("%c",&mem[ptr]);
				break;
			case '[':
				if(mem[ptr]==0) i=v[i];
				break;
			case ']':
				if(mem[ptr]) i=v[i];
				break;
		}
		if(debug){//输出内存的debug
			printf("\n===========================\n");
			printf("cur: %d,char: %c\n",i,c[i]);
			for(int j=0;j<=mxp;j++){
				if(j==ptr) printf("C%-4d",j);
				else printf("%-5d",j);
			}
			printf("\n");
			for(int j=0;j<=mxp;j++){
				if(j==ptr) printf(" %-4d",mem[j]);
				else printf("%-5d",mem[j]);
			}
			printf("\n===========================\n");
		}
	}
}
int main(int argc,char *argv[]){
	string a=",>,,------------------------------------------------[<+>-]<.";//源码
    loops(a);
    runBF(a);
	return 0;
}
这里空空如也

有帮助,赞一个