题意:
一种叫做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");
}
}
}