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 自动生成**