#CLPR1033. [数组]BF语言
[数组]BF语言
题目背景
Brainfuck是一种极小化的计算机语言,能与图灵机互相模拟。
BF语言运行时有一个unsigned char
数组,一个指针初始指向这个数组的0号位。
. 0 1 2 3 4 ·
[ 0 ][ 0 ][ 0 ][ 0 ][ 0 ] ... ·
↑ ·
ptr* ·
BF语言的程序由八种字符组成:
字符 | 作用 |
---|---|
+ | 将指针指向的地址的值加一 |
- | 将指针指向的地址的值减一 |
> | 指针向后移动一个地址 |
< | 指针向前移动一个地址 |
[ | 标记一段循环的起点,如果指针指向的地址的值为0,则跳过这段循环,如果不为0,则进入这段循环 |
] | 标记一段循环的终点,跳转到对应的[ 处 |
. | 以%c 的格式输出指针指向的地址的值 |
, | 读入一个字符到指针指向的地址 |
BF语言解释器读入这些字符,然后按照它们的作用修改数组。例如:
,----------[----------------------.,----------]
首先读入一个字符,将它减十。若减完不为零,则再减去22并输出,然后继续读取。若减完为零,则跳过循环结束程序。
可以看出这是一个小写字母转大写字母的程序。当读入换行符\n
时,程序结束运行。
wapapapapoo使用c语言诱惑你,并请你为BF语言编写一个解释器。
题目描述
如题,请编写一个BF语言解释器。
输入格式
第一行给出两个正整数,表示数组的长度。
第二行给出BF语言编写的程序。除运算符外,不含任何其它字符。
接下来若干行是输入。
输出格式
输出程序的运行结果。
当对数组范围外的地址进行操作时,输出SIGSEGV
并立刻终止运行。
样例
1
,----------[----------------------.,----------]
wapapapapoo
awaqwqdmd
WAPAPAPAPOO
10
,<<>>.>>>>>>>>>>+<<<<<<<<<<.
A
ASIGSEGV
说明提示
样例解释
样例一的程序已在题目背景处说明,输入为两行字符串。第一行字符串经由程序转换为大写字符串,随后读入一个换行符,换行符的ascii编码为10,使程序跳过循环直接结束。
样例二首先在下标0处读入了一个字符A
,然后将指针左移两个地址再右移两个地址,回到下标0处,输出A
。接着向右移动到下标10处,然后将该处的值加一。但由于样例二的数组长度为10,下标10处在数组范围外,故当对该处的值加一时,触发段错误,输出SIGSEGV
并结束运行。
数据范围
程序长度不超过1023字节。
所有样例保证输入的长度足够。