Интерпретатор каррирования и композиции

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

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

Вычислите выражение expression маленького функционального языка. Выражение — это число (целое, возможно с минусом: -7) или имя встроенной функции, за которым может идти несколько применений в скобках: f(a, b)(c)…; аргументы — снова выражения. Значение — либо целое число, либо функция. У каждой встроенной функции есть арность (число аргументов):

  • add, sub (первый минус второй), mul, max — арность 2, аргументы — числа;
  • neg (смена знака), inc (+1) — арность 1, аргумент — число;
  • id — арность 1, возвращает аргумент как есть (число или функцию);
  • compose(f, g) — арность 2, f и g — функции; результат — функция арности 1: x ↦ f(g(x));
  • twice(f) — арность 1, f — функция; результат — функция арности 1: x ↦ f(f(x));
  • flip(f) — арность 1, f — функция; результат — функция арности 2: (a, b) ↦ f(b, a).

Применение функции к аргументам каррировано: если аргументов меньше, чем осталось до арности, получается частично применённая функция, которая запоминает их; если ровно столько — функция вызывается; если больше — функция вызывается на нужном числе первых аргументов, а её результат применяется к остальным. Аргументы и применения вычисляются слева направо.

Если результат — число, верните его десятичную запись; если функция — строку <fn/k>, где k — сколько аргументов ей ещё не хватает. Если число применяют к аргументам, если функция попала туда, где нужно число, или число — туда, где нужна функция, сообщите об ошибке: бросьте исключение, в Go верните error. Выражение синтаксически корректно, скобки не бывают пустыми, все числа помещаются в 32-битное целое.

Пример: "compose(inc, mul(2))(5)" → "11".


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

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

Ещё задачи

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