SP2023 ONEINSTR - One Instruction Computer Simulator
题目描述
有一台计算机只能执行一种指令:
```
SUBLEQ A B C
```
这条指令的意思是:从 $M(B)$ 中减去 $M(A)$ 的值,并将结果存入 $M(B)$;如果结果不为正数,则跳转到内存第 $C$ 个位置的指令。这里,$M(i)$ 表示存储在内存位置 $i$ 的值。计算机共有 9999 个整数内存位置,编号从 0 到 9998。如果 $C > 9996$,这意味着程序结束。此外,如果 $A$ 是负数,则直接将 $A$ 的值从 $M(B)$ 中减去。
因为这台机器只有一条指令,所以不需要在内存中显式保存指令的操作码。每条指令三连的参数就占用三连的内存位置。内存结构如下:
```
位置 内容
0-8 输入/输出变量($M0$ 到 $M8$)
9-9998 程序内存(存储指令和数据)
```
下方的伪代码描述了这台单一指令计算机的模拟机制:
```
simulate(integer M[0..9998])
integer pc, A, B, C
pc = 9
while (pc < 9999)
A = M[pc]
B = M[pc + 1]
C = M[pc + 2]
if (A >= 0)
M[B] = M[B] - M[A]
else
M[B] = M[B] - A
if (M[B] > 0)
pc = pc + 3
else
pc = C
end_if
end_while
end_simulate
```
在上面的 `while` 循环中,每次循环称为一个模拟周期。你的任务是将后缀表达式转换为这种机器语言。每个表达式最多含有 100 个算术项和 99 个运算符。数值常量是非负数,且不超过 10000。
输入格式
输入包含多组测试数据,每行一个测试用例。每个测试用例是一个后缀表示法的算术表达式,表达式中可能含有常量(整数值)、输入变量($M0$ 到 $M8$)以及算术运算符(+、-、*、/)。
输出格式
对于每个测试,用如下格式打印生成的程序:第一行输出组成程序的指令数 $m$;接下来的 $m$ 行按顺序输出程序的每条指令,每条指令由三个整数值组成,数值间用空格隔开。要求每个测试用例生成的程序在 10^7 个模拟周期内结束运行。
说明/提示
- 每个表达式最多包含 100 个算术项和 99 个运算符。
- 数值常量是非负数,且不超过 10000。
**本翻译由 AI 自动生成**