Debounce с предельным ожиданием
Задача по программированию с проверкой онлайн
- Сложность
- Средняя
- Языки
- Python
- JavaScript
- TypeScript
- Темы
- Асинхронность и потоки
- Функции и замыкания
Функцию вызывают в моменты events (миллисекунды от вызова вашей функции, по неубыванию; одинаковые моменты возможны). Её обёртка «debounce» не выполняет функцию сразу, а откладывает: после каждого вызова в момент t выполнение назначается на момент min(t + wait, first + max_wait), где first — момент первого вызова текущей серии, а прежнее назначение отменяется. Серия начинается с первого вызова после предыдущего выполнения (или с самого первого вызова) и заканчивается выполнением. Если вызов приходит ровно в назначенный момент, он обрабатывается раньше выполнения и входит в серию.
Ваша функция асинхронная: смоделируйте обёртку таймерами (setTimeout в JS/TS, loop.call_later или asyncio.sleep в Python; текущее время в миллисекундах: Date.now() в JS/TS, round(asyncio.get_running_loop().time() * 1000) в Python) или вычислите ответ иначе и верните список моментов, в которые функция выполнилась, по возрастанию. Для пустого events ответ []. Ограничения: 1 ≤ wait ≤ max_wait, до 100 вызовов, моменты до 10⁶.
Пример: [0, 5, 12, 30], wait = 10, max_wait = 15 → [15, 40] (первая серия начинается в 0 и не может ждать дольше 15 мс).
Источник: задача CodeShare