本题 Checker 使用了 C++17 特性,暂无法提交。如需要用到本题请联系管理员。
题目:解释
时间限制:1秒
内存限制:256 MB
输入:标准输入
输出:标准输出
对于任何足够强大的武器及其维护实验室,都需要软件支持。但在奥本海默时代,计算机才刚刚诞生,这一说法还不成立。但这并不意味着当时完全没有编程——任何日常算法都可以用伪代码表示。
在奥本海默的实验室里,墙上挂着一份伪代码,它能输出核弹的某些特性。伪代码结构非常简单:它仅由我们称为 <block> 的块组成,并且只处理整数,因此奥本海默在需要时可以在脑中运行它。
在该伪代码中:
<block>—— 要么是基本操作,要么是循环;- 循环形式为:
这样的循环让变量for <var> = <value1>...<value2> { <block> <block> ... }<var>遍历从<value1>到<value2>包含两端的所有值,并对每个值执行其内部指定的块序列。这里的变量<var>只能在该循环内部使用,且只能出现在=的右侧。 <var>—— 变量名;<value>—— 要么是变量名,要么是整型常量;- 基本操作可以是:
print(<var>)—— 打印变量的值,read(<var>)—— 从输入读取值存入变量,- 形如
<var> = <expression>的赋值操作;
<expression>—— 可以是变量名、整型常量或算术表达式;- 算术表达式形如
<value1> [+-] <value2>,即两个量的和或差。
该伪代码满足以下性质:
- 循环计数器是唯一的,并且不会在对应循环之外使用。
- 循环计数器的值永远不会在循环内部被修改(不会出现在
=左侧,也不会被read读取)。 - 变量的作用域是全局的:一旦某个变量被创建,它在程序结束前一直可用。
- 如果循环的上界小于下界,则循环不会执行任何迭代。
你是一名年轻的实验室助理,对编程不太了解(事实上,当时几乎还没有编程)。你对嵌套循环的理解存在困难。你不理解嵌套结构,因此希望将这份伪代码翻译成另一种语言,以便能够帮助罗伯特·奥本海默工作。
另一种语言支持所有相同的基本操作(输入、输出和变量赋值),也具有全局变量作用域,但完全没有括号和嵌套循环的能力。取而代之的是:
- 调用
print或read时,需要大写写出对应命令,并在后面跟一个空格及其参数。 - 将值赋给变量时,需要写
<var> GETS <expression>。
此外,该语言还有两个特殊命令:
MACRO命令。如果你写MACRO <macro_name>:,则接下来的若干行(每行缩进 4 个空格,每行一条命令)可以列出一系列命令(不能再包含另一个MACRO命令)。宏名称只能由小写英文字母a到z组成,长度在 1 到 10 之间。REPEAT命令。如果你写REPEAT <macro_name> <value>,则与相应宏关联的命令序列(该宏必须已在前面声明)将被顺序执行<value>次。如果重复次数为负数,则宏一次也不会被调用。
请将常规伪代码翻译成你更易理解且没有嵌套的代码。说不定你就能在罗伯特·奥本海默的指导下,在核物理领域取得新的突破!
输入数据
第一行包含整数 $n$ —— 伪代码的行数 ($1 \le n \le 1000$)。接下来的 $n$ 行包含伪代码本身。
伪代码严格按照题目描述中的语法格式化,包括空格和缩进。初始缩进为 0。每个嵌套循环的缩进比前一个多 4 个空格。每个循环在声明行的末尾包含一个字符 {,并以只包含字符 } 的行结束,且该行具有正确的缩进。
变量名是由小写英文字母 a 到 z 和数字 0 到 9 组成的字符串,长度在 1 到 10 之间。变量名不能是 for、print 或 read,也不能以数字开头。所有整型常量均为非负且不超过 2000。
如果循环的左边界大于右边界,则循环执行 0 次迭代。
保证伪代码不会访问未赋值的变量。还保证循环声明中使用的所有变量名称唯一,不与之前出现的变量重名,且仅在其对应循环内部使用,并且不会出现在 = 左侧或 read 操作参数中。原伪代码中的任何变量都不以字母 x 开头。
输出数据
第一行输出一个整数 $m \le 5 \cdot n$ —— 你翻译后代码的行数。接下来的 $m$ 行以题目描述中反嵌套伪代码的格式输出代码。
你的代码必须精确复现输入伪代码所描述的算法。不需要使所有变量保持相同的名称和最终值——只要两个程序在相同输入下输出相同即可。
你代码中的所有变量名也必须由小写英文字母组成,长度在 1 到 10 之间。你代码中的整型常量必须非负且不超过 10000。
示例
输入数据 1
6
n = 1
read(k)
for i = 0...k {
n = n + k
}
print(n)
输出数据 1
9
n GETS 1
READ k
MACRO increase:
n GETS n + k
iters GETS k + 1
REPEAT increase iters
PRINT n
输入数据 2
14
read(somevalue)
read(morevalue)
for i = 0...10 {
for j = 1...somevalue {
print(j)
}
smthidk = i
wut = 42
for k = 1...morevalue {
smthidk = smthidk + k
wut = smthidk + smthidk
}
print(wut)
}
输出数据 2
23
MACRO printer:
PRINT j
j GETS j + 1
MACRO summator:
smthidk GETS smthidk + k
wut GETS smthidk + smthidk
k GETS k + 1
MACRO outer:
j GETS 1
REPEAT printer somevalue
smthidk GETS i
k GETS 1
wut GETS 42
REPEAT summator morevalue
PRINT wut
i GETS i + 1
READ somevalue
READ morevalue
i GETS 0
REPEAT outer 11
