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

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

Ещё задачи

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