Ленивые потоки со счётчиком вызовов

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

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

Потоки описаны списком определений definitions, каждое — слова через пробел ИМЯ = ВИД АРГ…; в аргументах — только потоки, определённые раньше. Виды:

  • range A B — числа A, A+1, …, B-1 (пусто при A ≥ B);
  • map F S — F(x) для каждого x из S; F: double (2x), square (x²), inc (x+1), neg (−x), half (x/2 с округлением вниз);
  • filter P S — элементы S, для которых P(x) истинно; P: even, odd, positive (x > 0), mult3 (делится на 3);
  • takewhile P S — элементы S, пока P(x) истинно; первый элемент, где P ложно, уже взят из S, но не выдаётся, и поток кончается;
  • take K S — первые K элементов; выдав K-й, больше ничего у S не просит;
  • drop K S — пропускает первые K элементов S, остальные выдаёт;
  • zip G S T — G(x, y) для пар элементов с одинаковым номером; G: add, sub (x − y), mul, max, min. Сначала просит элемент у S, потом у T; кончается, как только кончился любой (если кончился S, у T не просит).

Потоки ленивые: стадия просит у источника следующий элемент, только когда у неё самой попросили элемент. Каждое упоминание имени потока — свой независимый проход с начала (в zip add i i поток i пройден дважды).

Для каждого имени из queries пройдите поток до конца и верните список: сначала число вызовов функций F, P и G за этот проход, затем все выданные числа. До 20 определений; все выданные и промежуточные числа помещаются в 32-битное целое; каждый запрос выдаёт не больше 100 чисел и делает не больше 10 000 вызовов.

Пример: ["a = range 0 4", "b = map double a", "c = zip add a b"], ["c"] → [[8, 0, 3, 6, 9]].


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

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

Ещё задачи

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