题解:AT_iroha2019_day3_k えそらんぐ
大模拟,个人感觉没有 struct 难(
一看题意,只有 8 种操作,前 6 种是移动指针、自增自减和输入输出。那么后 2 种就比较有用,相当于一个 while 循环,当然也可以当 if 用。
乍一看根本不知道怎么用这东西实现加法,于是我们尝试使用封装思想,一步步建立这种语言的各种操作。
假设我们钦定每对 [] 之间的 < 与 > 数目相同,那么我们便可以知道在程序执行到任意位置时指针指向的内存编号。
从实现来讲,我们存储全局变量
Access(x)
将指针指向 < 或 > 后更新
Add(x,c)
将内存
access 后直接输出 + 或 - 即可。
Read(x) / Write(x)
输出第 0 的 ASCII 值),输出时加回去。
access, add 后输出 , 或 . 即可
Loop(x) / End()
我们定义 loop(x) ... end() 等价于 while(x) { ... },即调用 loop 就设置循环,调用 end 就标记循环停止,并且当
那我们在 loop 时 access 到 [ 开始循环;在 end 时再次 access 到 ] 结束循环。
Addto(x,S)
将
直接用循环暴力自增自减即可。
到这里,我们已经实现了大部分一个语言具有的功能,甚至已经可以实现不进位加法。那么我们唯一需要处理的就是进位。
考虑什么时候需要进位,当且仅当两个相同数位上的和大于等于 10。
那我们如何判断呢?比较运算符不是很好写,但是我们只需检查当前的数是否在
那么怎么判相等呢?容易发现我们可以判断他们的差是否为
细节见 code