Условие
Сад из treesCount яблонь, выстроенных в ряд. На каждой яблоне — анализатор, асинхронно измеряющий количество яблок N[i]. Результат приходит на телефон, который имеет ограниченную память сообщений. Если память заполнена — новый результат теряется (анализ нужно перезапустить).
Дима может в любой момент очистить память телефона, но очистка занимает время. Во время очистки телефон не принимает новые сообщения и не может запустить новую очистку. Очистка работает с перебоями:
n — счётчик операций очистки. Увеличивается с каждой очисткой.
n % 3 === 1 → удалится 1 сообщение
n % 3 === 2 → удалится 2 сообщения
n % 3 === 0 → удалятся все 3 сообщения
Задача
Реализовать асинхронную функцию harvest, возвращающую максимальное количество яблок, которое удалось собрать (то есть получить результат) с яблонь.
async function harvest(
treesCount: number,
phone: Phone,
analyzeTree: AnalyzeTree,
): Promise<number> {
// ваш код
}API
interface Phone extends EventEmitter {
clearMessages(): void; // запускает очистку (асинхронно)
on("analyze", (treeIndex: number, applesCount: number) => void): void;
on("messagesCleared", (memoryLeft: number) => void): void;
readonly maxMemory: number; // вместимость
}
type AnalyzeTree = (treeIndex: number) => void;analyzeTree(i) запускает асинхронный анализ дерева i. По завершении (если память доступна) телефон эмитит analyze с (treeIndex, applesCount). Если память была заполнена — результат теряется, анализ нужно повторить.