题目描述

bf是一种编程语言,全称为BrainFuck,因为题目名称不能太露骨,所以就简写成bf了。

这种语言的运行机制十分简单,只有一个大小为30000的有符号8位整数(范围[-128,127])的内存槽,和一个指向内存槽中位置的指针,在最初的时候指向内存槽的第一个整数。

这种语言的字符集也是十分的简单,只有+-,.><[]。

字符|意义
<  |指针所指向的内存地址减一。
>  |指针所指向的内存地址加一。
+  |指针所指向的内存里面的数值加一。
-  |指针所指向的内存里面的数值减一。
.  |输出当前指针所指向的内存里面的数值(以字符形式输出)。
,  |将读入缓冲区中的一个字节送入当前指针指向的内存里面。如果读入缓冲区为空则送入-1。
[  |当前指针指向的内存里面的数值不为0时,重复执行与之相匹配的]之间的语句,直到回到[时当前指针指向的内存中的数值为0。
]  |如上。

输入输出格式

输入格式:

输入数据若干行,代码有注释。直到一个$为代码截止。

$后面紧跟一个空格(不属于输入缓冲区),空格后面是输入缓冲区里面的内容,以一个空格和一个$截止。

输出格式:

输出这段代码的执行结果。

输入输出样例

输入样例#1: 复制

write whatever u c ,.,.,.,. $ asdf $
输出样例#1: 复制

asdf

说明

【数据范围】

对于10%的数据,没有循环。

对于另外10%的数据,循环没有嵌套。

对于100%的数据,输入的程序不会访问越界,输入的程序能够在10^6步内运行结束,|输入的字符串|<=30000。 字符在内存中的数值为字符所对应的Ascii码。

思路:模拟。

但是太麻烦了,所以就去copy了一下大佬的思路。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
char codes[];
char inputs[];
signed char data[]={};
int down[],up[],tstack[];
char t;
signed char * pdata;
int main(){
int i=,j=,k=,ncodes,ninputs; //i记录codes的索引,j记录inputs的索引,k记录tstack的索引
while((t=getchar())!='$')
if(strchr("><.,+-[]",t))
codes[i++]=t;
ncodes=i; //为代码的总字符数
codes[ncodes]='\0';
getchar();//跳过'$'后的空格
while((t=getchar())!='$') inputs[j++]=t;
ninputs=j-;
inputs[ninputs]='\0';
//读入完成,开始预处理
for(i=;i<ncodes;i++){
switch(codes[i]){
case '[': tstack[k++]=i; break;
case ']': down[tstack[--k]]=i; up[i]=tstack[k]; break;
}
}
//预处理完成,开始解释
i=,j=,pdata=data; //索引、数据指针归零
while(i<ncodes){//遍历代码
switch(codes[i]){
case '<': pdata--; break;
case '>': pdata++; break;
case '.': putchar(*pdata); break;
case ',': if(j<ninputs) *pdata=inputs[j++];
else *pdata=-;//此时已读完输入缓冲,置为-1
break;
case '+': (*pdata)++; break;
case '-': (*pdata)--; break;
case '[': if(!(*pdata)) i=down[i]; break;
case ']': if(*pdata) i=up[i]; break;
}
i++;
}
}

洛谷 P2027 bf的更多相关文章

  1. bzoj 3236: 洛谷 P4396: [AHOI2013]作业 (莫队, 分块)

    题目传送门:洛谷P4396. 题意简述: 给定一个长度为\(n\)的数列.有\(m\)次询问,每次询问区间\([l,r]\)中数值在\([a,b]\)之间的数的个数,和数值在\([a,b]\)之间的不 ...

  2. 洛谷 P3263 [JLOI2015]有意义的字符串

    洛谷 首先,看到\((\frac{(b+\sqrt{d})}{2})^n\),很快能够想到一元二次方程的解\(\frac{-b\pm\sqrt{\Delta}}{2a}\). 所以可以推出,\(\fr ...

  3. (洛谷 P1429 平面最近点对(加强版) || 洛谷 P1257 || Quoit Design HDU - 1007 ) && Raid POJ - 3714

    这个讲的好: https://phoenixzhao.github.io/%E6%B1%82%E6%9C%80%E8%BF%91%E5%AF%B9%E7%9A%84%E4%B8%89%E7%A7%8D ...

  4. bzoj2154||洛谷P1829 Crash的数字表格&&JZPTAB && bzoj3309 DZY Loves Math

    bzoj2154||洛谷P1829 https://www.lydsy.com/JudgeOnline/problem.php?id=2154 https://www.luogu.org/proble ...

  5. 洛谷P2661 信息传递(最小环,并查集)

    洛谷P2661 信息传递 最小环求解采用并查集求最小环. 只适用于本题的情况.对于新加可以使得两个子树合并的边,总有其中一点为其中一棵子树的根. 复杂度 \(O(n)\) . #include< ...

  6. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  7. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  8. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  9. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

随机推荐

  1. HDU 2049 不容易系列之(4)——考新郎( 错排 )

    链接:传送门 思路:错排水题,从N个人中选出M个人进行错排,即 C(n,m)*d[m] 补充:组合数C(n,m)能用double计算吗?第二部分有解释 Part 1. 分别求出来组合数的分子和分母然后 ...

  2. MySQL主从宕机的解决方法

    测试系统:centos6.5系统 测试环境IP地址划分: master: 192.168.80.130 slave:192.168.80.143 slave:192.168.80.146 首先模拟(M ...

  3. oracle11.2静默安装

    操作系统及Oracle版本 Linux版本:rhel-server-5.8-x86_64-dvd Oracle版本:Oracle Database 11g Release 2 (11.2.0.4.0) ...

  4. js sort方法根据数组中对象的某一个属性值进行排序(实用方法)

    js sort方法根据数组中对象的某一个属性值进行排序 sort方法接收一个函数作为参数,这里嵌套一层函数用来接收对象属性名,其他部分代码与正常使用sort方法相同. var arr = [ {nam ...

  5. 使用plsql创建package

    1. 2.需要在packages中新建相同的包名:否则无法编译,报没有声明

  6. java类的属性

    类的嵌套!!!!!!!!!! 首先我们创建一个学生卡卡号的一个类,这个类有两个属性,校园卡号和银行卡号 package cuteSnow; public class StudentCard { pub ...

  7. 浅谈密码加SALT原理

    我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码.  加Salt可以一定程度上解决这一问题.所谓加Salt方法, ...

  8. Git学习总结(10)——git 常用命令汇总

    1.git 基本概念: 工作区:改动(增删文件和内容) 暂存区:输入命令:git add 改动的文件名,此次改动就放到了'暂存区'(新增的文件) 本地仓库(简称:本地):输入命令:git commit ...

  9. 关于thinkpadU盘系统盘启动不了解决方法

    http://www.laomaotao.org/softhelp/bios/382.html(原文章地址,比较全面) thinkpad笔记本uefi无法启动详细解决教程 最近有个别用户反映说thin ...

  10. HDU 4335 Contest 4

    利用降幂公式..呃,还是自己去搜题解吧.知道降幂公式后,就不难了. #include <iostream> #include <cstdio> #include <alg ...