Задача A. Косвенная машина

Автор:Зимние сборы 2005   Ограничение времени:2 сек
Входной файл:indirect.in   Ограничение памяти:64 Мб
Выходной файл:indirect.out  

Условие

Ваша задача — проэмулировать простую косвенную машину, предназначенную для исполнения арифметических операций.

Память этой машины представляет собой 32768 16-битных целых ячеек с номерами от 1 до 32768. Когда машина читает или пишет одну из этих ячеек, она в первую очередь проверяет число, записанное в этой ячейке. Если это число оказывается неотрицательным, то операция производится с этой ячейкой. Иначе абсолютная величина записанного в ячейке числа рассматривается как новый адрес для чтения/записи, и вышеописанный процесс повторяется. Если при выполнении операции чтения/записи машина входит в цикл, это считается ошибкой исполнения, и происходит останов машины.

У машины имеется единственный 16-битный регистр — аккумулятор. Все операции производятся с этим регистром. В случае переполнения значение берется по модулю 216 в пределах от  − 32768 до 32767, как и в большинстве 16-битных систем.

Программа для этой машины состоит из не более чем 262144 инструкций. Вот список возможных команд:

  1. A*memory — складывает значение заданной ячейки памяти с аккумулятором.
  2. S*memory — вычитает значение заданной ячейки памяти из аккумулятора.
  3. M*memory — умножает значение аккумулятора на значение заданной ячейки памяти.
  4. D*memory — делит значение аккумулятора на значение заданной ячейки памяти. Деление производится так же, как в процессорах Intel.
  5. O*memory — записать в аккумулятор значение остатка от деления аккумулятора на значение заданной ячейки памяти.
  6. R*memory — читает значение заданной ячейки памяти в аккумулятор.
  7. W*memory — пишет в заданную ячейку памяти значение аккумулятора.
  8. A=constant — добавляет заданное число к аккумулятору.
  9. S=constant — вычитает заданное число из аккумулятора.
  10. M=constant — умножает аккумулятор на заданное число.
  11. D=constant — делит аккумулятор на заданное число.
  12. O=constant — записывает в аккумулятор остаток от деления аккумулятора на заданное целое число.
  13. R=constant — записывает в аккумулятор заданную константу.

Все обращения к памяти во время исполнения команд делаются так, как описано в начале условия. Деление и взятие остатка работают как операции div и mod в языке Паскаль. Все числа целые.

Формат входного файла

Входной файл содержит корректную программу для косвенной машины, по одной инструкции на строке. Машина начинает работу с нулевым аккумулятором и с нулевой памятью. Все адреса во входном файле корректны и лежат в пределах от 1 до 32768. Все непосредственные аргументы (для операций со знаком равенства `=') удовлетворяют стандартным ограничениям на 16-битные целые.

Формат выходного файла

Первая строка выходного файла должна содержать код завершения программы. Если программа завершилась успешно, требуется вывести строчку SUCCESSFUL TERMINATION. Если произошло деление на 0, то нужно вывести строку DIVISION BY ZERO. В случае ошибки исполнения выведите в первой строке RUN-TIME ERROR. Вторая строка должна содержать значение аккумулятора после завершения. Последующие 32768 строк содержат 32768 целых чисел — значения ячеек памяти после завершения программы. В случае ошибки исполнения или деления на ноль программа немедленно завершается и необходимо выводить состояние памяти и аккумулятора перед ошибочной инструкцией.

Примеры тестов

Входной файл (indirect.in) Выходной файл (indirect.out)
1
R=2
A=2
W*1
R=0
S*1
W*1
R*1
S=2
W*1
R=1
W*1
SUCCESSFUL TERMINATION
1
-4
1
0
-2
0
предыдущая строчка повторяется 32763 раза
2
R=2
D*1
R=3
DIVISION BY ZERO
2
0
предыдущая строчка повторяется 32767 раз
3
R=-1
W*1
W*1
A=2
RUN-TIME ERROR
-1
-1
0
предыдущая строчка повторяется 32766 раз

0.149s 0.007s 13