Вычислитель Лисп-выражений с let

Задача по программированию с проверкой онлайн

Сложность
Сложная
Языки
Python
JavaScript
TypeScript
Java
Go
Темы
Разбор и проверка данных
Рекурсия и перебор
Стек, очередь, связные списки

Дана строка с выражением на маленьком Лисп-подобном языке. Вычислите его и верните целое число. Выражение бывает одного из пяти видов:

  • целое число: необязательный минус и цифры, например -12;
  • переменная: строчная латинская буква, за которой идут строчные буквы и цифры (x, ab2); её значение — то, которое ей присвоил ближайший охватывающий let;
  • (add e1 e2) — сумма значений e1 и e2;
  • (mult e1 e2) — их произведение;
  • (let v1 e1 v2 e2 … vn en expr) при n ≥ 1: присваивания выполняются по порядку слева направо, vi получает значение ei, и каждое ei уже видит присваивания, сделанные перед ним в этом же let; затем вычисляется последнее выражение expr, его значение и есть значение let. Повторное присваивание той же переменной в одном let заменяет значение.

Переменные let видны только внутри него: внутренний let скрывает внешнюю переменную с тем же именем, а после закрывающей скобки снова действует внешняя. Слова let, add и mult никогда не бывают именами переменных. Соседние элементы разделены ровно одним пробелом, у скобок пробелов нет. Гарантируется, что выражение корректно, каждая переменная к моменту использования присвоена, длина строки — до 2000 символов, а все промежуточные значения помещаются в 32-битное целое со знаком.

Пример: "(let x 2 (mult x (let x 3 y 4 (add x y))))" → 14.


Источник: задача CodeShare

Решить онлайнБесплатно и без регистрации: пишете код в браузере и проверяете его тестами (без аккаунта — несколько задач в день).

Ещё задачи

Все задачи для тренировки