Sobes.tech
Middle+

Reklaamivõrgu prototüübis on reklaamikohtade müük korraldatud järgmiselt: ostjad näitavad oma hinda ette ning iga reklaamikoha kohta vastavad nad, kas nad on valmis selle ostma või mitte. Vajalik on rakendada funktsioon, mis enne reklaamikoha müümist ootab kõrgeima pakkumisega ostjatelt nõusolekut või keeldumist ning seejärel müüb reklaamikoha kõrgeima pakkumisega ostjale nende hulgast, kes on nõus. Funktsiooni vastus peab olema võimalikult kiire. Tuleb tagastada ostja indeks. Näited: Ostjad pakuvad hindu 1, 5, 10 Ostja pakkumisega 10 vastas keeldumisega Ostja pakkumisega 1 vastas nõusolekuga // Me veel ootame, kuna võib vastata ostja pakkumisega 5 Ostja pakkumisega 5 vastas nõusolekuga // Valime ostja pakkumisega 5 ------------ Ostjad pakuvad hindu 1, 5, 10 Ostja pakkumisega 10 vastas keeldumisega Ostja pakkumisega 5 vastas nõusolekuga // Ei oota vastust ostjalt pakkumisega 1 - teda kindlasti ei valita ------------ Ostjad pakuvad hindu 1, 2 Ostja pakkumisega 1 vastas keeldumisega Ostja pakkumisega 2 vastas keeldumisega // Ei valita ühtegi ostjat 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

Vastus AI-lt

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

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

  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;
}

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