#D0346. 红楼
红楼
题目背景
一个是阆苑仙葩,一个是美玉无瑕。——《枉凝眉》
题目描述
有一天 33DAI 睡觉做梦进入了喵喵幻境。喵喵幻境有一门编程语言叫做喵喵编程语言(MeowLang
)。比如下面就是一段计算 A+B
的代码:
MiaoMiaoMiaoMiaoMiaoMiaoMiaoMiao; MiaoMiaoMiaoMiaoMiao;
;MiaoMiaoMiao;MiaoMiao;
MiaoMiaoMiaoMiao; MiaoMiaoMiao;
MiaoMiaoMiaoMiao; MiaoMiaoMiaoMiao;
MiaoMiaoMiaoMiaoMiaoMiao;
MiaoMiaoMiaoMiaoMiao; MiaoMiao;
MiaoMiaoMiao;
MiaoMiaoMiaoMiao; MiaoMiao;
Miao;
MiaoMiaoMiao;
这个程序可以输出第二行的两段 Miao
的数量之和个猫猫表情,可以在 Meowlang Interpreter、或者使用下面的 C++ 解释器测试运行这段代码。
请你写一段 C++ 代码,实现输入输出一个喵喵程序代码,保证运行后可以一共输出 个猫猫表情。
喵喵编程语言参考手册
本题使用中文拼音语境下的喵喵编程语言,只能使用两种字符串:Miao
和 ;
,所有这两种字符串之间的多余空格和换行都将被忽略。
对应到整数列表
一段喵喵编程语言的代码可以包含多条语句,每条语句都包含若干个 Miao
且以 ;
结尾。假设有 条语句,则解释器会先计算出每条语句中 Miao
的数量,并得到一个包含 个整数的列表 。
比如下面这段代码对应的列表初始为:[0,1,2,4,3]
;Meow;Meow Meow;Meow Meow Meow Meow;Meow Meow Meow;
程序运行
程序运行时有下面几种变量:
IP
:当前执行的语句对应的列表下标,初始为 ,每次执行E(IP)
对应的指令。E(x)
:列表中下标为x
的那一项的数字T
:当前列表末尾的的数字N
:E(IP+1)
,即列表中下一项的数字。
指令集:
指令 | 名称 | 描述 | IP 变化 |
---|---|---|---|
RET 换行 |
打印一个换行符 | IP++ |
|
MEOW 喵 |
输出 T 个喵 |
||
PUSH 压入 |
在列表末尾添加一项,添加的数字为 N |
IP+=2 |
|
POP 弹出 |
删除列表末尾 | IP++ |
|
LOAD 载入 |
把 E(N) 压入列表末尾 |
IP+=2 |
|
SAVE 储存 |
把 E(N) 修改为列表末尾的元素的值 |
||
ADD 加法 |
把列表末尾两项相加,弹出末尾两项,然后把和压入列表末尾 | IP++ |
|
SUB 减法 |
计算列表倒数第二项减去最后一项的差,弹出末尾两项, 把差压入队列末尾,如果差为负数,会压入 0 |
||
JMP 跳转 |
将 IP 设置为 N |
IP=N |
|
JE 比较 |
如果列表最后一项是 ,将 IP 设置为 N ,否则设置为 IP+2 |
IP = (T == 0) ? N : IP + 2 |
|
NOP 跳过 |
跳过当前指令 | IP++ |
本题规定
- 程序中的
Miao
一共不能超过 个。 - 任意时刻列表总长度都不能超过 。
- 涉及到
N
、E(x)
、末尾两项的操作,必须存在对应项。 - 最多只能执行 次指令。
- 当
IP
超过列表范围时停止程序。
详细请看下面 C++ 解释器中的代码。
C++ 解释器
为了更好理解喵喵编程语言,我用 C++
写了一个语言解释器,这个代码中准确描述了本题规则,你的代码输出的程序就会使用类似这个解释器的方式运行,看看能否输出 个喵。
输入格式
输入一个整数 。
输出格式
输出一段喵喵语言的代码,要求那个代码会无换行的输出 个喵。
5
MiaoMiaoMiaoMiaoMiaoMiaoMiaoMiao; MiaoMiaoMiaoMiaoMiao;
;MiaoMiaoMiao;MiaoMiao;
MiaoMiaoMiaoMiao; MiaoMiaoMiao;
MiaoMiaoMiaoMiao; MiaoMiaoMiaoMiao;
MiaoMiaoMiaoMiaoMiaoMiao;
MiaoMiaoMiaoMiaoMiao; MiaoMiao;
MiaoMiaoMiao;
MiaoMiaoMiaoMiao; MiaoMiao;
Miao;
MiaoMiaoMiao;
这是题目给的 a+b 的代码。执行过程如下
初始列表如下
下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
列表:8 5 0 3 2 4 3 4 4 6 5 2 3 4 2 1 3
IP = 0,执行 JMP,跳转到 IP = 5
IP = 5,执行 LOAD,N=E[6]=3,把 E[N]=E[3]=3 压入列表末尾,IP+=2
IP = 7,执行 LOAD,N=E[8]=4,把 E[N]=E[4]=2 压入队列末尾,IP+=2
下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
列表:8 5 0 3 2 4 3 4 4 6 5 2 3 4 2 1 3 3 2
IP = 9,执行 ADD,把末尾两项相加,IP++
下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
列表:8 5 0 3 2 4 3 4 4 6 5 2 3 4 2 1 3 5
IP = 10,执行 SAVE,N=E[11]=2,把末尾 5 存入 E[N] 即 E[2],IP+=2
下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
列表:8 5 5 3 2 4 3 4 4 6 5 2 3 4 2 1 3 5
IP = 12,执行 POP 去掉列表末尾,IP++
下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
列表:8 5 5 3 2 4 3 4 4 6 5 2 3 4 2 1 3
IP = 13,执行 LOAD,N=E[14]=2,把 E[N]=E[2]=5 压入列表末尾,IP+=2
下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
列表:8 5 5 3 2 4 3 4 4 6 5 2 3 4 2 1 3 5
IP = 15,执行 MEOW,喵列表末尾那么多下,输出了 5 个喵,IP++
IP = 16,执行 POP,弹出列表末尾,IP++
下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
列表:8 5 5 3 2 4 3 4 4 6 5 2 3 4 2 1 3
IP = 17 结束。
显然其实在算完 ADD
之后直接 MEOW
然后结束就好了。或者直接末尾放五个 Miao
,然后开头 MEOW
完直接跳转到列表外结束即可。
数据规模与约定
对于 的数据,。
- 子任务 1(10 分):保证 。
- 子任务 2(20 分):保证 。
- 子任务 3(30 分):保证 。
- 子任务 4(40 分):没有特殊限制。