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