Кэш с одной загрузкой на ключ и лимитом загрузок
Задача по программированию с проверкой онлайн
- Сложность
- Сложная
- Языки
- Python
- JavaScript
- TypeScript
- Темы
- Асинхронность и потоки
- Словари и множества
К кэшу приходят запросы: запрос i за ключом keys[i] приходит в момент at[i] (в мс от старта; список at не обязательно упорядочен). Загрузка значения ключа длится fetch мс, и одновременно идут не больше limit загрузок. Загрузка, которой не хватило места, ждёт в очереди и стартует, как только место освободится; загрузки из очереди стартуют в порядке создания. Значение, загрузка которого завершилась в момент d, годно для ответов в моменты t с d ≤ t < d + ttl.
Пришедший запрос обрабатывается так: (1) если у ключа есть годное значение, запрос получает ответ сразу; (2) иначе, если загрузка этого ключа уже идёт или ждёт в очереди, запрос ждёт её и получает ответ в момент её завершения; (3) иначе запрос создаёт новую загрузку этого ключа и получает ответ в момент её завершения. Запросы, пришедшие в один момент, обрабатываются по возрастанию номера; место, освободившееся в некоторый момент, достаётся в этот же момент первой загрузке очереди.
Верните моменты ответов в порядке номеров запросов, а последним элементом — число созданных загрузок. Функция асинхронная: удобно запустить по корутине на запрос и ждать через таймеры; текущее время в миллисекундах: Date.now() в JS/TS, round(asyncio.get_running_loop().time() * 1000) в Python. Ожидания в тестах идут по виртуальным часам и не занимают реального времени. Списки одной длины, до 50 запросов; fetch, ttl и limit — от 1 до 1000000, моменты — от 0 до 1000000. Для пустых списков верните [0].
Пример: ["a", "a", "b", "a"], [0, 5, 6, 30], fetch = 10, ttl = 25, limit = 1 → [10, 10, 20, 30, 2] (запрос 1 ждёт уже идущую загрузку a, загрузка b ждёт места до 10, запрос 3 застаёт годное значение a).
Источник: задача CodeShare