Logo Wy Online Judge

WyOJ

#660. IOIP 20231015 no-nesting(数据错误)

本题 Checker 使用了 C++17 特性,暂无法提交。如需要用到本题请联系管理员。

题目:解释

时间限制:1秒
内存限制:256 MB
输入:标准输入
输出:标准输出

对于任何足够强大的武器及其维护实验室,都需要软件支持。但在奥本海默时代,计算机才刚刚诞生,这一说法还不成立。但这并不意味着当时完全没有编程——任何日常算法都可以用伪代码表示。

在奥本海默的实验室里,墙上挂着一份伪代码,它能输出核弹的某些特性。伪代码结构非常简单:它仅由我们称为 <block> 的块组成,并且只处理整数,因此奥本海默在需要时可以在脑中运行它。

在该伪代码中:

  1. <block> —— 要么是基本操作,要么是循环;
  2. 循环形式为:
    for <var> = <value1>...<value2> {
        <block>
        <block>
        ...
    }
    这样的循环让变量 <var> 遍历从 <value1><value2> 包含两端的所有值,并对每个值执行其内部指定的块序列。这里的变量 <var> 只能在该循环内部使用,且只能出现在 = 的右侧。
  3. <var> —— 变量名;
  4. <value> —— 要么是变量名,要么是整型常量;
  5. 基本操作可以是:
    • print(<var>) —— 打印变量的值,
    • read(<var>) —— 从输入读取值存入变量,
    • 形如 <var> = <expression> 的赋值操作;
  6. <expression> —— 可以是变量名、整型常量或算术表达式;
  7. 算术表达式形如 <value1> [+-] <value2>,即两个量的和或差。

该伪代码满足以下性质:

  • 循环计数器是唯一的,并且不会在对应循环之外使用。
  • 循环计数器的值永远不会在循环内部被修改(不会出现在 = 左侧,也不会被 read 读取)。
  • 变量的作用域是全局的:一旦某个变量被创建,它在程序结束前一直可用。
  • 如果循环的上界小于下界,则循环不会执行任何迭代。

你是一名年轻的实验室助理,对编程不太了解(事实上,当时几乎还没有编程)。你对嵌套循环的理解存在困难。你不理解嵌套结构,因此希望将这份伪代码翻译成另一种语言,以便能够帮助罗伯特·奥本海默工作。

另一种语言支持所有相同的基本操作(输入、输出和变量赋值),也具有全局变量作用域,但完全没有括号和嵌套循环的能力。取而代之的是:

  • 调用 printread 时,需要大写写出对应命令,并在后面跟一个空格及其参数。
  • 将值赋给变量时,需要写 <var> GETS <expression>

此外,该语言还有两个特殊命令:

  • MACRO 命令。如果你写 MACRO <macro_name>:,则接下来的若干行(每行缩进 4 个空格,每行一条命令)可以列出一系列命令(不能再包含另一个 MACRO 命令)。宏名称只能由小写英文字母 az 组成,长度在 1 到 10 之间。
  • REPEAT 命令。如果你写 REPEAT <macro_name> <value>,则与相应宏关联的命令序列(该宏必须已在前面声明)将被顺序执行 <value> 次。如果重复次数为负数,则宏一次也不会被调用。

请将常规伪代码翻译成你更易理解且没有嵌套的代码。说不定你就能在罗伯特·奥本海默的指导下,在核物理领域取得新的突破!

输入数据

第一行包含整数 $n$ —— 伪代码的行数 ($1 \le n \le 1000$)。接下来的 $n$ 行包含伪代码本身。

伪代码严格按照题目描述中的语法格式化,包括空格和缩进。初始缩进为 0。每个嵌套循环的缩进比前一个多 4 个空格。每个循环在声明行的末尾包含一个字符 {,并以只包含字符 } 的行结束,且该行具有正确的缩进。

变量名是由小写英文字母 az 和数字 09 组成的字符串,长度在 1 到 10 之间。变量名不能是 forprintread,也不能以数字开头。所有整型常量均为非负且不超过 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

或者逐个上传:
题目信息
  • 难度 UKE
  • 控制组 group_default
  • 时间限制 1000 s
  • 空间限制 256 MB
  • 数据大小 158 Bytes
提交统计
  • 提交数 0
  • 通过数 0
  • 通过率 N/A