#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语言解释器。

输入格式

第一行给出两个正整数nn,表示数组的长度。

第二行给出BF语言编写的程序。除运算符外,不含任何其它字符。

接下来若干行是输入。

输出格式

输出程序的运行结果。

当对数组范围外的地址进行操作时,输出SIGSEGV并立刻终止运行。

样例

1
,----------[----------------------.,----------]
wapapapapoo
awaqwqdmd
WAPAPAPAPOO
10
,<<>>.>>>>>>>>>>+<<<<<<<<<<.
A
ASIGSEGV

说明提示

样例解释

样例一的程序已在题目背景处说明,输入为两行字符串。第一行字符串经由程序转换为大写字符串,随后读入一个换行符,换行符的ascii编码为10,使程序跳过循环直接结束。

样例二首先在下标0处读入了一个字符A,然后将指针左移两个地址再右移两个地址,回到下标0处,输出A。接着向右移动到下标10处,然后将该处的值加一。但由于样例二的数组长度为10,下标10处在数组范围外,故当对该处的值加一时,触发段错误,输出SIGSEGV并结束运行。

数据范围

n1024n\leq 1024

程序长度不超过1023字节。

所有样例保证输入的长度足够。