心路记录——刷题失败有感

首先看看题吧。毕竟花了一晚上没做出(超时)肯定是算法不行了。越错我就越来越膜拜那些dalao们呐

先%lyric_seraph 大神 (1unsigned long long << 63)-1次!!

 BF

时间限制:2000MS  内存限制:65535K

Description

不知道看到标题的大家觉得这个是有关什么的题目呢,估计会认为是Boy Friend的缩写之类的吧。嗯,其实我想表达的是Brainfuck‎_(:з」∠)_。
Brainfuck是一种编程语言,虽然它很难看懂,但是它可以完成任何计算操作。
下面说明摘自wiki。
这个语言是基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。
整个语言只有8条指令:
字符	含义
>	指针加一
<	指针减一
+	指针指向的字节的值加一
-	指针指向的字节的值减一
.	输出指针指向的单元内容(ASCII码)
,	输入内容到指针指向的单元(ASCII码)
[	如果指针指向的单元值为零,向后跳转到对应的]指令的下一指令处
]	如果指针指向的单元值不为零,向前跳转到对应的[指令的下一指令处

如果把这些指令对应c语言的话,就是下面这张表(ptr是char *类型):
BF	C
>	++ptr;
<	--ptr;
+	++*ptr;
-	--*ptr;
.	putchar(*ptr);
,	*ptr =getchar();
[	while (*ptr) {
]	}
好了,说到这里,估计大家都知道这个题目是干什么的了:给出一个Brainfuck程序以及一串输入,请输出对于这串输入的输出结果.




输入格式

输入包含两部分,第一部分是Brainfuck源程序(在100000个字符内)包括多行(源程序分析过程中忽略空白字符例如:空格' '、制表符'\t'、换行回车'\n'),以#号表示源程序结束,保
证程序没有语法错误。
#号的下一行整行是输入(在100000个字符以内),如果输入为空,则这行是“NULL”,不包含引号。


输出格式

输出这个程序对于对应输入的输出。


输入样例

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.#
NULL


输出样例

Hello World!


提示

ps:这里给一段小小的Brainfuck程序出来,其实和测试数据没什么关系,大家能跟我做个约定吗?大家过了这题之后才许运行这段小程序哦~
windows用户请运行这个:
++++++++++++++++[>+++>++++++++++>+++++++++++>++++++++++++>+++++++++++++>++++++++++++++>+++++++++++++++>++++++++++++++++<<<<<<<<-]>>>>++.>>>-.
<<<<<+.>-----.>>+++.---.<+.--------.>+++.---.+++++++.>>++.<<-------------.>--------.----.<<+.------.<---.>-.++++++++.>>+++.>---.<<<---.>>>+++
++.<<------.>+.<<<<++.>>+++++.>++++.>>------------.<<<------.>>>>-----.<<<++.---.<----.>---.<++++++.<++++++++.<.>----.>>++++++.<<<+++.>>-----
-.>>++++.<<<<<-.>>>>.<<<.>>>-------..+.>>----.<----------.<<++++++.-----.<<++.>>>++++++.---.<++.>>>>-----.<<<<++.>----.<.<<------.>>>>+++++.-
---.<<<<-.>-.>>+++++.>>++++.<<<-.>>>>+++++.<<<<-------.+++++++++.>++.---.---.+++.>-.<<<+++++++.>>----.<.>>----.----.++.>-----.<<<<<++.>------
.++++++++.>>>>>--------.<<+++++.<<<<++++.>>>>------.<+..>>++++++++.<<<<<----.+++++++++.>>>>++++++++.---.<<-.>>++++++++++++.<<<++.>>>++++.<<<-
--.>>++++++++++++.-----------.<<++.<---------.+++++++++.>>>++.>>+.<<<++.>>+.<<<--.>>>-----------.<<<++.>+.>>+.>+++.<<<---.>>>>.<<<<<<--------
---.++++++++++.#
linux/unix用户请运行这个:
++++++++++++++++[>+++>++++++++>+++++++++>++++++++++>+++++++++++>++++++++++++>++++++++++++++>+++++++++++++++<<<<<<<<-]>>>>>>>+++++.<<<--------
.+++.>>>>-.<<---.<<+++.>>>+.<<<--.<-------.>>>>.<<++.<+++++.>>>.<<<-----.<.>>>>+++.<<<<<+.>>>+++.>>----.<<-------.<<-.>>>>++.<---.<--------.>
>--.<<++++++++.<--.>>>.<<<<.>>++.>>+.<<<++.<<-.>>>>>-.<<<<++++++++.--.>>>>.<<<<+++.>++++++.>>>>.<<++.<<---.>>>.<<<+++++++.<<++.>>>>>+.<<<----
----.--.>>>.<<<----.>-.>>+.<<<++.<<++.>>>>>+.<<.<+++.>>>>.<<.<<<-----.>>>>---.<----.<<<----.>>>>.<++++.<<++.<<<-.>>>>>>.<----.<<<.>>>>.<<<+++
++++.>>+.>-.<++++.<<------.>>>.<-----.<<<<----.>>>>>+.<<-.<------.>>>+.<<<--.>+.>>--.<.<-----.>>+.<<-----.>+++++.>.<<++++++++.----.>>.<<++++.
<--------.>>>>.<<.<<++++++++++++++.>>>.<<-------.<<<++.>>>>>+.<<<.--.>>>--.<-----.<<<+++++.>>>>++.<<<----.>+++++++++.>>+++.<<<<<.>>++++++++++
+.>>>-----.<+.<<----.>>>++.<<+++.<++.>>>+++.<<<----------.>----.>>.<<<+++++++++++.----------.>>>>.<<+++.<<<-.>>>>----.<<----------.+++.>>.<<+
+++++.-------.>>.<<<+++..>>>.<---.-----.>>.<<++++++++.<<<.>>>>+.<<<+.<---.>>>>-.<++.<<<-.>>>>.<<--.<--.>>>+.<<<<+.>>>+.>++.<<+++++++++++.>---
--.>>.<<++.<<<+++.>>>>.<<.>-----.>---.<<<+++.---.>>>+.<<<<.<-.>>>>>-.<<<<----.>>+.>>+.<<<++.<<-.>>>>>-.<<<<++++++++.--.>>>>>.<<++++++.<<++.#


作者

 lyric_seraph 
附上我通过下图样例照样超时的代码

#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <iostream>
#include <bitset>
#include <algorithm>
using namespace std;

const int sm=1000005;
char Brainfuck[sm];
char input[sm];
char output[sm];
int pre_mark[sm],last_mark[sm],p=0,l=0;
int main() {
    int mark=0,mark2=0;
    char c;
    while((c=getchar())!='#'){
        if(c==' '||c=='\t'||c=='\n');
        else {
            if(mark>=1&&c=='-'&&Brainfuck[mark-1]=='+'||mark>=1&&c=='+'&&Brainfuck[mark-1]=='-')
                --mark;
            else if(mark>=1&&c=='<'&&Brainfuck[mark-1]=='>'||mark>=1&&c=='>'&&Brainfuck[mark-1]=='<')
                --mark;
            else{
                if(c=='[')pre_mark[p++]=mark;
                else if(c==']')last_mark[l++]=mark;
                Brainfuck[mark++]=c;
                }
            }
    }
    getchar();
    gets(input);
    char *ptr=output;
    stack<int> loc;
    for(int i=0;i<mark;++i)
    {
        switch(Brainfuck[i]){
            case '>':++ptr;break;
            case '<':--ptr;break;
            case '+':++*ptr;break;
            case '-':--*ptr;break;
            case '.':putchar(*ptr);break;
            case ',':*ptr=input[mark2++];break;
            case '[':if(!*ptr){int c=0;while(Brainfuck[i]!=']'&&i<mark||c&&i<mark){if(Brainfuck[i]=='[')++c;++i;if(Brainfuck[i]==']')--c;}}
                     else loc.push(i);
                     break;
            case ']':if(*ptr)i=loc.top();else loc.pop();break;
        }
    }
    return 0;
}

询问某位大佬时,他说:“实在不会那就不做了。”的确,与其消耗在此,不如趁机多学习自己能力范围内的知识,迟早有一天,就能做出来了。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值