[Sleeping Cup #10] Trivial Script Interpretation
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
注意
本题需要使用文件读写(interpretation.in / interpretation.out)。
题目背景
在一个宁静的夜晚,Sleeping Jellyfish 正在设计一个简单的脚本语言解释器。这个解释器能够处理几种基本的数据类型和操作,包括变量定义、赋值、输出、加减运算等。由于 Sleeping Jellyfish 经常打瞌睡,他需要你帮忙实现这个解释器的核心功能,确保它能正确执行给定的脚本指令。
题目描述
实现一个简单的脚本语言解释器,支持以下数据类型和操作:
-
数据类型:
string:字符串类型int:整数类型char:字符类型
-
支持的操作:
- 变量定义:为不同类型的变量赋予初始值
set:修改已有变量的值output:输出变量的值或输出值add:对变量进行加法操作(字符串为拼接,其他类型为数值相加)minus:对变量进行减法操作(仅支持int、char类型)for:循环执行一条指令
解释器需要读取输入文件中的指令序列并执行,将 output 操作的结果输出到指定文件中。
输入格式
输入文件第一行为一个整数 ,表示共有 条指令。
接下来 行,每行是一条指令,格式如下:
-
变量定义:
string <变量名> <字符串常量>int <变量名> <整数常量>char <变量名> <字符常量>
-
赋值操作:
set <变量名> value <常量>(值的类型与变量定义时的类型一致)set <变量名> variable <变量名>(后面的变量的类型与前面的变量定义时的类型一致)
-
输出操作:
output value <常量>(若输出char类型的常量,则输出它本身)output variable <变量名>(若输出char类型的变量,用[ASCII <字符的 ASCII 编码>]格式输出)
-
加操作:
add <变量名> value <常量>(变量为int、string类型时,值的类型与变量定义时的类型一致;变量为char类型时,值为int类型,表示ASCII编码)add <变量名> variable <变量名>(后面的变量的类型与前面的变量定义时的类型一致,仅支持int、string类型)
-
减操作:
minus <变量名> value <常量>(仅支持int、char类型,变量为int类型时,值的类型与变量定义时的类型一致;变量为char类型时,值为int类型,表示ASCII编码)minus <变量名> variable <变量名>(后面的变量的类型与前面的变量定义时的类型一致,仅支持int类型)
-
循环:
for <循环次数> <循环执行的脚本>(循环执行的脚本中不会出现循环)
数据保证:
- 。
- 所有变量名的长度不大于 。
- 变量名只包含大小写字母和数字。
- 变量名不由数字开头。
- 同一个变量不会定义多次。
- 未定义的变量不会被使用。
- 参与
char类型运算的整数常量在 范围内。 - 其余所有的整数常量在 范围内。
- 所有字符串常量的长度不大于 。
- 字符串常量中只包含大小写字母和数字。
- 字符常量只可能为大小写字母和数字。
- 所有字符串变量的值在运算期间长度始终不超过 。
- 循环次数为不大于 的整数常量。
- 循环体有且仅有一条指令。
- 循环内不会嵌套循环。
- 运算可能会发生溢出,你需要按以下方式处理:
- 使用 32 位无符号整数
uint32_t进行整数运算。 - 使用 8 位无符号整数
uint8_t进行字符运算。 - 输出变量的值时,临时转为对应大小的有符号整数(
int32_t和int8_t)再输出。 - 特别注意:使用
std::cout输出int8_t类型的变量时,请先转换为int32_t类型。
- 使用 32 位无符号整数
输出格式
对于每条 output 指令,将对应变量的值输出到文件中,每行一个结果。
样例
6
string a hello
output variable a
add a value world
output variable a
set a value hi
output variable a
hello
helloworld
hi
9
int x 10
char c a
add x value 5
minus c value 65
output variable x
output variable c
int l 1000000000
add l value 2000000000
output variable l
15
[ASCII 32]
-1294967296
7
char x a
for 100 add x value 1
output variable x
string t 123
for 3 add t value 666
for 3 add t variable t
output variable t
[ASCII -59]
123666666666123666666666123666666666123666666666123666666666123666666666123666666666123666666666
样例 1 解释
- 第一条指令
string a hello:定义字符串类型变量a,初始值为hello。 - 第二条指令
output variable a:输出变量a的值,此时a为hello,故输出hello。 - 第三条指令
add a value world:对字符串变量a执行加法操作(字符串拼接),将world追加到a后,a的值变为helloworld。 - 第四条指令
output variable a:输出此时a的值helloworld。 - 第五条指令
set a value hi:修改变量a的值为hi。 - 第六条指令
output variable a:输出修改后a的值hi。
样例 2 解释
- 第一条指令
int x 10:定义整数类型变量x,初始值为10。 - 第二条指令
char c a:定义字符类型变量c,初始值为字符a(对应的 ASCII 码为97)。 - 第三条指令
add x value 5:对整数变量x执行加法操作,x = 10 + 5 = 15。 - 第四条指令
minus c value 65:对字符变量c执行减法操作(基于ASCII码值计算)。c的 ASCII 码值变为97 - 65 = 32,对应字符为空格。 - 第五条指令
output variable x:输出整数变量x的值15。 - 第六条指令
output variable c:输出字符变量c的值(空格字符),故输出为[ASCII 32]。 - 第七条指令
int l 1000000000:定义整数类型变量l,初始值为1000000000。 - 第八条指令
add l value 2000000000:对整数变量l执行加法操作。1000000000 + 2000000000 = 3000000000,但由于int类型的取值范围为[-2^31, 2^31-1](即[-2147483648, 2147483647]),3000000000超出此范围导致整数溢出。在C++中,有符号整数溢出后结果为3000000000 - 4294967296 = -1294967296(按模4294967296计算)。 - 第九条指令
output variable l:输出溢出后的l值-1294967296。
样例 3 解释
- 第一条指令
char x a:定义字符类型变量x,初始值为字符a(对应的 ASCII 码为97)。 - 第二条指令
for 100 add x value 1:对字符变量x执行100次加法操作,每次加上1,x = 97 + 100 = 197,但由于char类型的取值范围为[-128, 127],3000000000超出此范围导致整数溢出。在C++中,有符号整数溢出后结果为197 - 256 = -59(按模256计算)。 - 第三条指令
output variable c:输出溢出后的字符变量x的值(ASCII -59字符),故输出为[ASCII -59]。 - 第四条指令
string t 123:定义字符串类型变量t,初始值为123。 - 第五条指令
for 3 add t value 666:对字符串变量t执行3次加法操作(字符串拼接),将3个666追加到t后,t的值变为123666666666。 - 第六条指令
for 3 add t variable t:对字符串变量t执行3次加法操作(字符串拼接),连续3次将t追加到t后,相当于将自身重复2^3 = 8次,t的值变为123666666666123666666666123666666666123666666666123666666666123666666666123666666666123666666666。 - 第七条指令
output variable t:输出修改后t的值123666666666123666666666123666666666123666666666123666666666123666666666123666666666123666666666。
Sleeping Cup #10 (RZOI Round 1 / 2026 April Fool's Day Contest) [Rated by Level 5]
- 状态
- 已结束
- 规则
- Sleeping Cup
- 题目
- 4
- 开始于
- 2026-4-1 0:00
- 结束于
- 2026-4-8 0:00
- 持续时间
- 2 小时
- 主持人
- 参赛人数
- 5