Инкрементальные ячейки с ранней отсечкой
Задача по программированию с проверкой онлайн
- Сложность
- Сложная
- Языки
- 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