CYaRon!语
P3695 CYaRon!语
开始之前
上次水了些小模拟之后感觉不能再颓废了,于是就来大模拟。
然后这个题花了我一个多星期
还是最差解
不过,为了纪念我的第 20 道紫题,纪念我这一周的努力,我还是想写篇题解,记录我的一点一滴。
大致思路
模拟题,都是根据题意直接模拟的(雾。
这个题呢,就适合分步完成。
关于变量
用的变量大都是汉语拼音或者缩写或者半缩写(比较好调)。
有些地方没加注释就可以直接读拼音理解含义。
成长过程
一 . 输出,变量,赋值
刚开始我是这么想的:
先把变量、数组和赋值、输出打完。
输出
直接将表达式的值计算出来输出即可。
变量和数组
用到了两个 map,用来映射 string 和 int 或者 array 之间的关系。
赋值
和输出差不多,将变量名储存下来,计算出后边表达式的值即可。
具体看代码。
显然这个 js 是不对的,没有判断减法,:yosoro 2-1 都是错的。
数组的处理也有些错误。
得了 20 分。
但我当时没在意,就去打 ihu 了。
二 .ihu
我对 ihu 想的很简单,没考虑循环的情况。
如果 ihu 合法,就顺序执行;否则,就将更深层数的读入,跳过。
层数的定义大概就是每遇到一个 { 层数 +1,遇到 } 层数 -1。
然后又小改了一下 js,完善了减法的维护。
事实证明,我的 ihu 思路上没什么大错误。
30 分。
三 . 数组
之后我看了数据那张图。
就这个:

“不对啊,应该是 50 吗?”
然后就开始调试数组。
我就发现 js 用递归的话,ls 是个全局变量,会被清空。
然后我就直接当数字计算了……
没考虑数组下标是变量的情况。
不过,50 分就这么到手了……
四 .hor
从这开始,就开始有些恶心了。
因为要重复操作,顺序操作可能不好弄,所以这里选择了递归。
用了一个 zhixing 函数,将更深层数的操作储存下来。用循环递归处理。
但是因为是一些奇奇怪怪的原因,main 函数中的 zhixing 是以读入的形式执行的,而递归时则是以储存的形式执行的。
所以要有一些判断,将读入或是储存的代码统一起来。
但这样只能执行单层循环,不能嵌套(不管是嵌套循环还是 ihu)。
而原因呢,就是因为如果循环之中嵌套循环,递归执行到下一次循环时,又会执行 getline 函数。
那么加一个判断条件,如果是第一次循环(严格来说是最外层循环),就将更深层次的存下来;否则就从之前储存的代码中找到要执行的语句。
关于 duiy 的用处,举一个简单的例子:
{ vars
a:int
b:int
}
{ hor a, 1, 2
{ hor b, 1, 2
:yosoro b
}
}
不加 duiy 的输出:
1 2 0 1 2 0
加 duiy 的输出:
1 2 1 2
如果将循环执行的语句 顺序 输出的话,那么不加 duiy 的应该是这样的(仅 hor 循环):
{ hor a, 1, 2
{ hor b, 1, 2
:yosoro b
}
{ hor b, 1, 2
:yosoro b
}
:yosoro b
{ hor b, 1, 2
:yosoro b
}
{ hor b, 1, 2
:yosoro b
}
:yosoro b
}
也就是说,循环结束之后又顺序执行了一遍循环体。
应该……不难理解吧。
感性理解一下吧。
然后就 60 分了。
这里的 duiy 统计比较浅显,没有考虑 ihu 的不成立时跳过和 while 语句。
五 .while
ihu 和 hor 打完之后,while 就很好打了。
因为 while 完全就是 ihu 和 hor 的结合体。
顺便又修改了一下 js 函数。
修复了之前说的数组下标是变量时的错误。
还完善了对于循环中的 ihu 的跳过处理。
可以发现,这时的 zhixing 函数有了返回值。
这是为了判断 ihu 是否需要跳过。
而且此时的 duiy 函数的统计方式也变成了由大括号直接统计,而不是通过 hor 统计。
交上之后,80 分了,两个 TLE。
六 .set
通过下载数据,可以发现,#6 的 set 的变量和数值之间没有空格,这就导致了我的处理出现奇奇怪怪的错误(我的处理是按照空格划分的)。
既然这样,反正 set 中的 , 是绝对有的,那么就根据这个 , 划分变量。
七 . 数组
“你的 vector 怎么实现的?”
“就直接用啊。”
“那它如果直接是一个 9?”
“嗯?哦,我先 push_back 了 1000 个 0。”
“那你?”
“好像是哦。”
虽然这个对话有些奇怪,但我们两个都 get 到了对方的意思。
于是我就把 vector 换成了 int 数组。
其实差不多(反正都是最差解)。
总结
个人感觉这种紫色的大模拟对于代码能力的锻炼还是很有用的。
除了过程有点折磨外,A 掉之后还是很开心的。
如果对于我的代码疑问,可以私信问我。
2022 年 noip 后就要退役了。退役前还是能回复的。
大学之后可能会是不是上洛谷或博客园看看。
如果觉得这篇题解写的还可以,请不要吝啬您的点赞。
广告
CYaRon!语的更多相关文章
- 洛谷 P3695 CYaRon!语 题解 【模拟】【字符串】
大模拟好啊! 万一远古计算机让我写个解释器还真是得爆零了呢. 题目背景 「千歌です」(我是千歌).「曜です」(我是曜).「ルビィです」(我是露比).「3人合わせて.We are CYaRon! よろし ...
- NOIP2017酱油记
分数线终于出了,于是大胆地写下了这篇博文. 提高组Day1: T1: 打开PDF就感觉到一股骚气,不忘初心什么鬼啊??T1是数论??好一个不忘初心... 看一下样例1:3 7:11 莫不是3*7-10 ...
- REHの收藏列表
搬运自本人的AcWing,所以那里的文章会挺多. 友链(同类文章) :bztMinamoto 世外明月 mlystdcall 新人手册:AcWing入门使用指南 前言 有看到好文欢迎推荐(毛遂自荐也可 ...
- 编译器开发系列--Ocelot语言1.抽象语法树
从今天开始研究开发自己的编程语言Ocelot,从<自制编译器>出发,然后再自己不断完善功能并优化. 编译器前端简单,就不深入研究了,直接用现成的一款工具叫JavaCC,它可以生成抽象语法树 ...
- 从游戏脚本语言说起,剖析Mono所搭建的脚本基础
0x00 前言 在日常的工作中,我偶尔能遇到这样的问题:“为何游戏脚本在现在的游戏开发中变得不可或缺?”.那么这周我就写篇文章从游戏脚本聊起,分析一下游戏脚本因何出现,而mono又能提供怎样的脚本基础 ...
- [转载]jquery版小型婚礼(可动态添加祝福语)
原文链接:http://www.cnblogs.com/tattoo/p/3788019.html 前两天在网上不小心看到“js许愿墙”这几个字,我的神经就全部被调动了.然后就开始我 的百度生涯,一直 ...
- C语言中,头文件和源文件的关系(转)
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...
- h5输入框提示语 + 正常文本框提示语
<input id="username" name="username" type="text" placeholder=" ...
- C 语言中 setjmp 和 longjmp
在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...
随机推荐
- Git---git的常用操作
git三种状态的转换 git状态切换时的常用命令 1. git管理工作目录 git init # 会增加.git文件夹 2. git的三种状态 工作区 暂存区 本地仓库 3. 提交到暂存区 git a ...
- Spring配置数据源(连接池)
1.数据源(连接池)的作用:为了提高程序的性能而出现的 2.数据源的原理: *事先实例化数据源,初始化部分连接资源 *使用连接资源时从数据源中获取 *使用完毕后将连接资源归还给数据源 使用c3p0的步 ...
- 帝国CMS如何互相转移分表之间的数据
最近发现帝国CMS文章数据添加太多到某一张分表中了,如图 这是极其不合理的,需要优化下,所以这篇文章要告诉大家的也就是如何互相转移分表之间的数据. 我现在要将:phome_ecms_news_data ...
- git的.gitignore文件内容
**/pom.xml.versionsBackup **/target/ **/out/ *.class # Mobile Tools for Java (J2ME) .mtj.tmp/ .idea/ ...
- SpringMVC 解析(五)URI链接处理
URI在网络请求中必不可少,Spring提供了一些工具类用于解析或者生成URL,比如根据参数生成GET的URL等.本文会对Spring MVC中的URI工具进行介绍,本文主要参考Spring官方文档. ...
- 学习打卡——CentOS 7安装
本来今天是要学习redis的,但是redis官方又不支持在win下运行,windows版本目前都是微软官方在维护.redis最新版都已经更新到7.0了,windows却还是只有3.x版本.所以随性就去 ...
- PuddingSwap联合 ESBridge举办愚人节“币圈愚话”联合空投活动,完成任务即可获得惊喜奖励
据官方消息,4月1日0:00- 4月2日23:59,PuddingSwap联合 ESBridge举办"币圈愚话"空投活动,完成任务即可获得惊喜奖励. 此次PuddingSwap联合 ...
- JavaScript学习基础2
##JavaScript基本对象 1 .function:函数(方法)对象 * 创建: 1.var fun =new Function(形式参数,方法体): 2.function 方法名(参数){ 方 ...
- python基础练习题(输入三个整数x,y,z,请把这三个数由小到大输出)
day3 --------------------------------------------------------------- 实例005:三数排序 题目: 输入三个整数x,y,z,请把这三 ...
- 《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
1.简介 上一篇介绍了POM的基础理论知识和非POM方式写脚本,这篇介绍利用页面工厂类(page factory)去实现POM,通过查看PageFactory类,我们可以知道它是一个初始化一个页面实例 ...