soj 1205. brainf*ck

题意:

一种叫做brainf*ck 的语言,只有七种操作符,+ - > < [ ] <,

数据范围0~255(循环),地址范围0~32677(循环),

+ 当前地址的数据自增1

- 当前地址的数据自减1

>地址自增1

<地址自减1

[ 如果当前地址的数据为0,向后跳直到遇到匹配的']'

] 如果当前地址的数据不为0,向前跳知道遇到匹配的'['

. 输出当前地址的数据(char)

当然还有注释符号%,%后面的当前行的指令无效

给出一段程序,问该段程序输出的结果。

思路:

模拟。TLE了好久,不知道是什么原因,推了重写一遍就okay了。

代码:

#include <cstdio>
#include <cstring>
#define M 32768
#define D 256
#define N 128005
unsigned char data[M];
int t, n, len, ind;
char line[N], prgm[N];
int main()
{
	scanf("%d", &t);
	for (int Case = 1; Case <= t; ++ Case)
	{
		len = n = 0;
		while (gets(line), line[0] != 'e')
		{
			for (int i = 0; line[i]; ++ i)
			{
				if (line[i] == '%') break;
				else if (line[i] == ' ') continue;
				else if (line[i] == '[') n --;
				else if (line[i] == ']') n ++;
				prgm[len++] = line[i];
			}
		}
		prgm[len] = 0;
		printf("PROGRAM #%d:\n", Case);
		if (n != 0) printf("COMPILE ERROR\n");
		else
		{
			ind = 0;
			memset(data, 0, sizeof(data));
			for (int i = 0; i < len; ++ i)
			{
				if (prgm[i] == '.') putchar(data[ind]);
				else if (prgm[i] == '+') data[ind] = (data[ind]+1) % D;
				else if (prgm[i] == '-') data[ind] = (data[ind]+D-1) % D;
				else if (prgm[i] == '>') ind = (ind+1) % M;
				else if (prgm[i] == '<') ind = (ind+M-1) % M;
				else if (prgm[i] == '[' && data[ind] == 0)
				{
					i ++;
					for (n = 1; n != 0; ++ i)
					{
						if (prgm[i] == '[') n ++;
						else if (prgm[i] == ']') n --;
					}
					i --;
				}
				else if (prgm[i] == ']' && data[ind] != 0)
				{
					i --;
					for (n = -1; n != 0; -- i)
					{
						if (prgm[i] == '[') n ++;
						else if (prgm[i] == ']') n --;
					}
					i ++;
				}
			}
			printf("\n");
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值