ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила

2027. URCAPL, эпизод 1

Ограничение времени: 2.0 секунды
Ограничение памяти: 64 МБ
Представляем вам новый язык программирования URCAPL — Universal Reusable Cool and Amazing Programming Language.
Внимание: если вы что-нибудь знаете о языке программирования Befunge и описанный ниже синтаксис покажется вам знакомым, тем не менее внимательно прочтите описание языка URCAPL. Он был специально придуман для данного соревнования и имеет мало общего с Befunge.
Язык URCAPL работает только с целыми числами, не превосходящими 105 по модулю. Для хранения чисел используются 27 регистров: один текущий и 26 регистров памяти, которые кодируются заглавными латинскими буквами от A до Z. Изначально во всех регистрах записано число ноль.
Программа представляет собой двумерное поле размером H × W, в каждой клетке которого записан некоторый оператор. Исполнение программы происходит с помощью «каретки», которая стоит в некоторой клетке поля и имеет одно из четырёх возможных направлений движения: вверх, вправо, вниз, влево. В момент начала исполнения программы каретка находится в верхнем левом углу поля, направление её движения — вправо. В процессе исполнения программы направление движения каретки может меняться в зависимости от оператора в клетке, в которой она находится. Работа программы разбита на такты. На каждом такте сначала выполняется оператор в клетке каретки, затем каретка сдвигается на одну клетку в текущем направлении.
Список операторов:
  • "^", ">", "v", "<" — поменять направление движения каретки соответственно вверх, вправо, вниз, влево;
  • "." — ничего не делать;
  • "A"…"Z" — поменять местами числа в текущем регистре и регистре, обозначенном буквой;
  • "?" — считать число из входного потока и записать его в текущий регистр (при этом старое число удаляется из текущего регистра);
  • "!" — вывести в выходной поток число, записанное в текущем регистре (при этом в текущий регистр записывается число 0);
  • "+" — увеличить число в текущем регистре на единицу;
  • "-" — уменьшить число в текущем регистре на единицу;
  • "@" — (условный оператор) если число в текущем регистре равно 0, изменить направление движения против часовой стрелки, иначе — по часовой стрелке;
  • "#" — немедленно завершить выполнение программы.
Если в процессе исполнения значение в текущем регистре превысит 105 по модулю, программа завершится с ошибкой OVERFLOW ERROR. Если каретка выйдет за границы поля, программа завершится с ошибкой RUNTIME ERROR. Если в течение 106 тактов не будет выполнен оператор завершения программы и не произойдёт ни одна из двух описанных выше ошибок, то программа завершится с ошибкой TIME LIMIT EXCEEDED.
Ваша задача — написать интерпретатор языка, то есть по заданной программе на языке URCAPL и входным данным сказать, что выдаст программа во время её исполнения.

Исходные данные

В первой строке записаны целые числа H и W (1 ≤ H, W ≤ 100) — размеры поля. Далее дана таблица из H строк и W столбцов, представляющая собой синтаксически верную (то есть содержащую только описанные выше операторы) программу на языке URCAPL.
В следующей строке записано целое число n (1 ≤ n ≤ 105) — количество чисел во входных данных для программы. В следующих n строках по одному в строке записаны числа, по модулю не превосходящие 105, — входные данные для программы. Если программа в ходе работы уже считала n чисел из входных данных, все последующие запросы на чтение будут возвращать последнее число из этого списка. Если программа в процессе выполнения считывает не все числа, это не является ошибкой.

Результат

На каждую команду вывода в программе на URCAPL необходимо вывести число в отдельной строке. Если в какой-то момент времени произойдёт ошибка OVERFLOW ERROR, RUNTIME ERROR или TIME LIMIT EXCEEDED, необходимо вывести соответствующее сообщение в отдельной строке.
Обратите внимание, что программа на URCAPL сразу же завершается после первой ошибки. Например, если во время одного такта произошли одновременно ошибки OVERFLOW ERROR и RUNTIME ERROR, должно быть выведено только сообщение «OVERFLOW ERROR» (без кавычек), так как сначала выполняется оператор в клетке, где находится каретка, и лишь потом происходит движение каретки.

Примеры

исходные данныерезультат
4 6
?A?v>v
>..>@A
-...A!
^A.+<#
2
2
3
5
2 4
?!>v
##^<
1
0
0
TIME LIMIT EXCEEDED
1 4
??!#
1
1
1
Автор задачи: Кирилл Бороздин
Источник задачи: Уральская региональная командная олимпиада по программированию 2014