题目描述

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. 四、服务器上的 Git

    一个远程仓库通常只是一个裸仓库(bare repository)— 即一个没有当前工作目录的仓库.因为该仓库仅仅作为合作媒介,不需要从磁碟检查快照:存放的只有 Git 的资料.简单的说,裸仓库就是你专 ...

  2. u-boot启动代码start.S详解360

    (1)定义入口.由于一个可执行的Image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本 ...

  3. el-select 根据value查询其对应的label值

    <el-form-item label="库位" prop="goodsLocationId" > <el-col :span="1 ...

  4. spring mvc 下载

    1.代码: response.setContentType("application/msword;charset=GBK"); try { response.setHeader( ...

  5. How to check Open vSwitch version and supports OpenFlow version

    Open vSwitch (OVS) is an open-source virtual switch, featuring programmable switch forwarding capabi ...

  6. STM32使用HAL库实现ADC单通道转换

    STM32的ADC转换还是很强大的,它具有多个通道选择,这里我就不细说,不了解的可以自行百度,这里只是选取单通道,实现ADC转换.在文章开始之前,我说一下数据左对齐跟右对齐的差别,以前一直糊里糊涂的, ...

  7. java数组简单逻辑代码

    package cuteSnow; public class HelloWorld { // 遍历数组里面的每个数字 public static void print(int[] array){ St ...

  8. Xshell 安装 Xftp

    一.下载 Xftp 链接:https://pan.baidu.com/s/1dGeL2gD 密码:as9x 二.安装 Xftp 无脑下一步 三.点击 Xshell 上的新建文件传输 四.弹出 xftp ...

  9. vim 跳转指定行

    在编辑模式下输入 ngg 或者 nG n为指定的行数(如25) 25gg或者25G 跳转到第25行. 在命令模式下输入行号n : n 如果想打开文件即跳转 vim +n FileName 查看当然光标 ...

  10. WinServer-AD域控入门

    计算机账户和用户账户的区别 域控中不需要事先建立计算机账户,但必须建立登录用户账户. 计算机只要知道域控管理员或者授权管理账户,就可以利用此账户为所有计算机加域. 计算机加域成功之后,都会在AD管理里 ...