题解:AT_iroha2019_day3_k えそらんぐ

· · 题解

大模拟,个人感觉没有 struct 难(

一看题意,只有 8 种操作,前 6 种是移动指针、自增自减和输入输出。那么后 2 种就比较有用,相当于一个 while 循环,当然也可以当 if 用。

乍一看根本不知道怎么用这东西实现加法,于是我们尝试使用封装思想,一步步建立这种语言的各种操作。

假设我们钦定每对 [] 之间的 <> 数目相同,那么我们便可以知道在程序执行到任意位置时指针指向的内存编号。

从实现来讲,我们存储全局变量 p 表示当前位置。

Access(x)

将指针指向 x,直接输出对应个 <> 后更新 p 即可。

Add(x,c)

将内存 x 加上 c,其中 c 是一个常量。

access 后直接输出 +- 即可。

Read(x) / Write(x)

输出第 x 个内存的值,为了方便运算,我们输入时将其减去 480 的 ASCII 值),输出时加回去。

access, add 后输出 ,. 即可

Loop(x) / End()

我们定义 loop(x) ... end() 等价于 while(x) { ... },即调用 loop 就设置循环,调用 end 就标记循环停止,并且当 x 不为 0 时循环执行。

那我们在 loopaccessx,然后输出 [ 开始循环;在 end 时再次 accessx,然后输出 ] 结束循环。

Addto(x,S)

x 加到 \forall i \in S 中,并清空 x

直接用循环暴力自增自减即可。

到这里,我们已经实现了大部分一个语言具有的功能,甚至已经可以实现不进位加法。那么我们唯一需要处理的就是进位。

考虑什么时候需要进位,当且仅当两个相同数位上的和大于等于 10。

那我们如何判断呢?比较运算符不是很好写,但是我们只需检查当前的数是否在 [0,9] 之间即可,于是可以暴力枚举判断是否相等。

那么怎么判相等呢?容易发现我们可以判断他们的差是否为 0,于是就做完了。

细节见 code