Собесов

Frontend Яндекса — Яблоневый сад: асинхронный сбор с ограниченной памятью

АлгоритмыAsync + EventEmitterСложнаяSenior

Условие

Сад из 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). Если память была заполнена — результат теряется, анализ нужно повторить.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти