站神在学习 C 语言的时候发现,C 语言有那么多的符号,甚至还要会26个英文字母!以及一大堆的数字和符号
站神最不喜欢英文字母了,于是为了方便站神他发挥自己强大的编程能力,于是站神发明了一种新的语言,站神将其命名为 Brain Fuck!(简称 BF 语言 )这种全新的语言甚至都不需要学会任何的英文字母,用 BF 语言写出来的代码,只会出现 8 种符号(><+-.,[])。
BF 语言是基于一个数组和一个指针来实现的。一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)
BF 语言的 8 个符号的定义如下
符号 | 含义 |
---|---|
> | 指针加一 |
< | 指针减一 |
+ | 指针指向的字节的值加一 |
- | 指针指向的字节的值减一 |
. | 输出指针指向的单元内容(ASCII码) |
, | 输入内容到指针指向的单元(ASCII码) |
[ | 如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处 |
] | 如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处 |
如果使用 C 语言的方式来描述这些符号,则可以这样表述
符号 | 含义 |
---|---|
> | ++ptr; |
< | --ptr; |
+ | ++*ptr; |
- | --*ptr; |
. | putchar(*ptr); |
, | *ptr = getchar(); |
[ | while (*ptr) { |
] | } |
而 BF 语言将从代码的开头开始运行,直到运行至代码最后一个字符结束
例如代码
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.就是一个能够在屏幕上输出Hello World!这样一个字符串
这是一种非常具有创新性的语言,你可以仅靠这四个字符来实现非常多的操作,例如加法只需要用6个字符就可以解决 ——[->+<] 把当前位置的值加到后面的单元中(破坏性的加,它导致左边的单元被归零)。
但是站神的 C 语言并不是那么的优秀,所以他没有办法为自己创建的这么强大的语言编写一个程序来运行 BF 语言。于是他请求你帮助他编写一个程序,用来运行 BF 语言。同时,他希望这个程序不仅能运行合理的 BF 语言的代码,还要能够识别出来这段代码是否会出现一些不合理的情况,例如数组越界,数值越界。同时,他不喜欢输出一些看不见的字符,所以每次输出时,必须保证这个字符是可见的。即此程序还需要满足以下条件
输入仅一行,即所需要运行的 BF 语言的代码,长度不超过 3000。仅包含以下 7 个字符 ><+-.[] ,即不会出现 , 这个输入指令。保证输入的代码不会发生死循环,且总共处理的指令个数(每个 BF 语言的字符都是一个命令,考虑循环的展开后)不会超过 1000000,保证输入的字符串不会出现方括号嵌套的情况,即可能出现 [][] 但是不可能出现 [[]] 的情况,且保证能满足括号匹配
将 BF 代码的输出直接输出至控制台,同时保证以下条件也能正常运行
++++++++[->++++++++<]>+.+.+.<
ABC
对于代码 ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>. 其在运行结束后,数组内的前 5 个值分别为 0, 87, 100, 33, 10,并且指针指向最后一个字符,即值 "10" 上。同时,输出为 Hello World!