Sobes.tech
Middle+

En el prototipo de la red de ventas de publicidad, la venta de espacios publicitarios se organiza de la siguiente manera: los compradores indican su precio con anticipación, y para cada espacio publicitario responden si están dispuestos a comprarlo o no. Es necesario implementar una función que, antes de vender un espacio publicitario, espere la aprobación o rechazo de los compradores con la oferta más alta, y luego venda el espacio al comprador con la oferta más alta entre los que aceptaron. La respuesta de la función debe ser lo más rápida posible. Debe devolver el índice del comprador. Ejemplos: Los compradores ofrecen precios 1, 5, 10 El comprador con oferta 10 respondió con rechazo El comprador con oferta 1 respondió con aceptación // Aún esperamos, ya que puede responder el comprador con oferta 5 El comprador con oferta 5 respondió con aceptación // Elegimos al comprador con oferta 5 ------------ Los compradores ofrecen precios 1, 5, 10 El comprador con oferta 10 respondió con rechazo El comprador con oferta 5 respondió con aceptación // No esperamos respuesta del comprador con oferta 1 - definitivamente no será elegido ------------ Los compradores ofrecen precios 1, 2 El comprador con oferta 1 respondió con rechazo El comprador con oferta 2 respondió con rechazo // No elegimos a ningún comprador type Buyer = { price: number, accepts: () => Promise<boolean>, } async function bestBuyer(buyers) { const sorted = buyers.map((buyer, index) => ({buyer, index})) .sort((a, b) => a.buyer.price - b.buyer.price); const promise = sorted.map(({buyer}) => buyer.accepts()); for (let i = 0; i < sorted.length; i++) { const accepted = await promise[i]; if (accepted) { return sorted[i].index; } } if (await buyers[0].accepts()) { return 0; } return -1; }

sobes.tech AI

Respuesta de la IA

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

Основная идея решения:

  1. Отсортировать покупателей по цене по убыванию — от самого дорогого к дешевому.
  2. Запустить параллельно все промисы accepts().
  3. Обрабатывать ответы в порядке убывания цены, чтобы как только самый дорогой покупатель согласится, сразу вернуть его индекс.
  4. Если самый дорогой отказался, ждать ответа следующего по цене и так далее.

Это позволит не ждать всех ответов, а вернуть результат как можно раньше.

Пример реализации:

async function bestBuyer(buyers) {
  // Сортируем по убыванию цены
  const sorted = buyers
    .map((buyer, index) => ({ buyer, index }))
    .sort((a, b) => b.buyer.price - a.buyer.price);

  // Запускаем все промисы параллельно
  const acceptPromises = sorted.map(({ buyer }) => buyer.accepts());

  for (let i = 0; i < sorted.length; i++) {
    const accepted = await acceptPromises[i];
    if (accepted) {
      // Возвращаем индекс покупателя с самой высокой ценой, который согласился
      return sorted[i].index;
    }
  }

  // Если никто не согласился
  return -1;
}

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