Вычислитель Лисп-выражений с 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
Решить онлайнБесплатно и без регистрации: пишете код в браузере и проверяете его тестами (без аккаунта — несколько задач в день).