Инкрементальные ячейки с ранней отсечкой

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

Сложность
Сложная
Языки
Python
JavaScript
TypeScript
Java
Go
Темы
Функции и замыкания
Деревья и графы
Словари и множества

Реализуйте ленивую инкрементальную таблицу. Дан список команд operations, каждая — слова через один пробел:

  • input ИМЯ V — создать входную ячейку со значением V; результат [];
  • formula ИМЯ F A1 A2 … — создать ячейку-формулу: функция F от значений ячеек A1, A2, … (они созданы раньше). Функции: add (сумма), sub (первый минус второй), mul (произведение), max, min — от двух аргументов; neg (смена знака) и abs (модуль) — от одного. При создании формула не вычисляется; результат [];
  • set ИМЯ V — задать входной ячейке значение V; результат [];
  • get ИМЯ — результат [значение, вычисления]: значение ячейки и сколько раз во время этой команды вызывались функции формул.

Чтобы получить свежее значение формулы x: если x ещё ни разу не вычислялась, получите свежие значения её аргументов по порядку и вычислите x. Иначе, если с тех пор, как x была свежей, ни одна входная ячейка, от которой x зависит (прямо или через другие), не получила через set значение, отличное от прежнего, — x свежая, ничего не делайте. Иначе получите свежие значения аргументов по порядку и вычислите x заново, только если хотя бы один аргумент отличается от значения, с которым x вычислялась в прошлый раз (ранняя отсечка). После этого x свежая. Значение входной ячейки всегда свежее, вычислений не требует.

Верните список результатов всех команд. Команды корректны, до 100 команд, все значения помещаются в 32-битное целое.

Пример: ["input a 2", "formula b abs a", "formula c neg b", "get c", "set a -2", "get c"] → [[], [], [], [-2, 2], [], [-2, 1]].


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

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

Ещё задачи

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