Логотип YeaHub

Лучший покупатель (Best Buyer)

3

JavaScript

Асинхронность

Яндекс

Условие:

Есть список покупателей, каждый из которых предлагает свою цену за рекламное место и асинхронно отвечает — согласен он купить или нет. Опрашивать покупателей нужно параллельно.

Напишите функцию, которая принимает массив покупателей и возвращает индекс покупателя с наибольшей ценой среди тех, кто ответил согласием. При этом функция должна завершиться как можно быстрее — то есть не ждать тех, кто заведомо не может улучшить результат.

Покупатель с более высокой ценой имеет приоритет. Если он ещё не ответил — нужно дождаться его ответа, прежде чем вернуть результат с меньшей ценой. Если все покупатели с более высокой ценой ответили отказом — возвращаем лучшего из оставшихся согласившихся.


Входные данные:

buyers — массив объектов:

{ price: number, response: () => Promise<boolean> }

Покупатели не отсортированы. response() возвращает промис, который резолвится в true (согласен) или false (отказ).

Выходные данные:

Promise<number> — индекс лучшего покупателя, или -1 если никто не согласился.

Ограничения:

  • 1 <= buyers.length <= 100

  • Каждый покупатель отвечает ровно один раз

  • Цены уникальны

Пример:

Вход:

buyers = [
  { price: 1,  response: () => asyncResponse(true,  500) },
  { price: 10, response: () => asyncResponse(false, 200) },
  { price: 5,  response: () => asyncResponse(true,  100) }
]

Выход: 2 (покупатель с ценой 5, индекс 2 — покупатель с ценой 10 ответил отказом, покупатель с ценой 1 ещё не ответил, но его цена ниже)

Время выполнения: ~200мс (не 300мс и не 600мс)

Loading...
Лучший покупатель (Best Buyer) | Yeahub