Throttle с первым и последним вызовом
Задача по программированию с проверкой онлайн
- Сложность
- Средняя
- Языки
- Python
- JavaScript
- TypeScript
- Темы
- Асинхронность и потоки
- Функции и замыкания
Функцию вызывают в моменты events (миллисекунды от вызова вашей функции, по неубыванию; одинаковые моменты возможны). Обёртка «throttle» выполняет её не чаще одного раза за interval мс и не теряет последний вызов:
- если функция ещё ни разу не выполнялась или с её последнего выполнения прошло не меньше
intervalмс, вызов выполняет её сразу, в тот же момент; - иначе вызов откладывается: функция выполнится один раз в момент «последнее выполнение +
interval», сколько бы вызовов ни отложилось за это время; - если новый вызов приходит ровно в момент отложенного выполнения, они сливаются в одно выполнение в этот момент. Вызовы, пришедшие в один момент, обрабатываются по одному: первый сливается с отложенным выполнением, а следующие уже попадают в новый интервал и откладываются (так
[0, 0, 0]приinterval = 5даёт[0, 5]).
Отложенное выполнение тоже считается выполнением: от него отсчитывается следующий интервал. Ваша функция асинхронная: смоделируйте обёртку таймерами (текущее время в миллисекундах: Date.now() в JS/TS, round(asyncio.get_running_loop().time() * 1000) в Python) или вычислите ответ иначе и верните моменты всех выполнений по возрастанию. Для пустого events ответ []. Ограничения: interval ≥ 1, до 100 вызовов, моменты до 10⁶.
Пример: [0, 3, 14, 15, 40], interval = 10 → [0, 10, 20, 40].
Источник: задача CodeShare