130 条题解
-
-6
题解 - 【MX-A1】你好,梦熊 OJ!
这里我们推荐一种语言:Brainfuck,并用它来解决这个问题。
Brainfuck 的语法极其简单,它用 个控制符控制处于一个初始化为 的字符数组(字符采用 ASCII 码表示)上的一个指针来实现程序的运行。这 个控制符是:
控制符 含义 等价于 C++ 代码(指针为 p
)+ 当前值加 ++*p;
- 当前值减 --*p;
> 指针加 ++p;
< 指针减 --p;
. 输出当前字符 putchar(*p);
, 输入当前字符 *p=getchar();
[ 当前值为 则跳转到对应的 ]
while(*p){
] 当前值非 则跳转到对应的 [
}
可以证明,Brainfuck 是图灵完备的。
根据题目描述,我们可以编写出本题的 Brainfuck 代码:
++++[>++++<-]>[>+++++>++++>++++++>+++>++<<<<<-]>>++++++++.>+++++.+++++++..+++.>----.>.<<<+++++.<++++++++.>++.-----.>>>+.
可是, 梦熊不提供 Brainfuck 这个语言选项怎么办?
这里我们可以用 C++ 手写一个 Brainfuck 的解释器:
char s[10000],*p=s; char*run(char*c,bool i=0) { while(*c!='\0'&&*c!=']') { if(*c=='+') { if(!i)++*p; } else if(*c=='-') { if(!i)--*p; } else if(*c=='>') { if(!i)++p; } else if(*c=='<') { if(!i)--p; } else if(*c=='.') { if(!i)putchar(*p); } else if(*c==',') { if(!i)*p=getchar(); } else if(*c=='[') { if(i)c=run(c+1,1); else { char*t; if(!*p)t=run(c+1,1); while(*p)t=run(c+1); c=t; } } ++c; } return c; }
把 Brainfuck 代码放进解释器里运行就好了。提交的代码如下:
#include<stdio.h> char s[10000],*p=s; char*run(char*c,bool i=0) { while(*c!='\0'&&*c!=']') { if(*c=='+') { if(!i)++*p; } else if(*c=='-') { if(!i)--*p; } else if(*c=='>') { if(!i)++p; } else if(*c=='<') { if(!i)--p; } else if(*c=='.') { if(!i)putchar(*p); } else if(*c==',') { if(!i)*p=getchar(); } else if(*c=='[') { if(i)c=run(c+1,1); else { char*t; if(!*p)t=run(c+1,1); while(*p)t=run(c+1); c=t; } } ++c; } return c; } int main() { char code[]="++++[>++++<-]>[>+++++>++++>++++++>+++>++<<<<<-]>>++++++++.>+++++.+++++++..+++.>----.>.<<<+++++.<++++++++.>++.-----.>>>+."; run(code); return 0; }
信息
- ID
- 1
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 1
- 标签
- (无)
- 递交数
- 2982
- 已通过
- 1464
- 上传者