130 条题解

  • -6
    @ 2024-11-10 20:30:22

    题解 - 【MX-A1】你好,梦熊 OJ!

    这里我们推荐一种语言:Brainfuck,并用它来解决这个问题。

    Brainfuck 的语法极其简单,它用 88 个控制符控制处于一个初始化为 00 的字符数组(字符采用 ASCII 码表示)上的一个指针来实现程序的运行。这 88 个控制符是:

    控制符 含义 等价于 C++ 代码(指针为 p
    + 当前值加 11 ++*p;
    - 当前值减 11 --*p;
    > 指针加 11 ++p;
    < 指针减 11 --p;
    . 输出当前字符 putchar(*p);
    , 输入当前字符 *p=getchar();
    [ 当前值为 00 则跳转到对应的 ] while(*p){
    ] 当前值非 00 则跳转到对应的 [ }

    可以证明,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
    上传者