Повторы с растущей паузой и пределом попытки

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

Сложность
Средняя
Языки
Python
JavaScript
TypeScript
Темы
Асинхронность и потоки
Исключения

Дано задание job, число попыток attempts (не меньше 1), базовая пауза delay и предел попытки timeout (оба в миллисекундах). Задание — асинхронная функция без аргументов: вызовите её (await job()), чтобы выполнить его; оно может завершиться ошибкой (исключением). Вызывайте задание, пока оно не вернёт значение, но не больше attempts раз; каждый вызов — новая попытка.

Попытка неудачна, если задание завершилось ошибкой или не завершилось за timeout мс от начала попытки: такую попытку бросьте, не дожидаясь её конца. После неудачной попытки номер k (считая с 0) подождите delay · 2^k мс и только потом начинайте следующую; после последней попытки не ждите. Верните список [значение, время]: значение успешной попытки (или -1, если все попытки неудачны) и сколько миллисекунд прошло от вызова функции до ответа. Текущее время в миллисекундах: Date.now() в JS/TS, round(asyncio.get_running_loop().time() * 1000) в Python. Значения задания неотрицательны; в тестах ни одна попытка не завершается ровно через timeout мс.

Пример: задание дважды падает через 5 мс, а в третий раз возвращает 7 через 5 мс; attempts = 4, delay = 10, timeout = 100 → [7, 45] (5 + 10 + 5 + 20 + 5).


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

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

Ещё задачи

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