Sobes.tech
Middle+

Рекламалык тармактын прототипинде, жарнама орундарын сатуу төмөндөгүчө уюштурулган: сатып алуучулар алдын ала өз баасын белгилешет, жана ар бир жарнама орынына алар сатып алууга даярбы же жокпу деп жооп беришет. Функцияны ишке ашыруу керек, ал жарнама ордун сатуудан мурун, эң жогорку бааны сунуштаган сатып алуучулардын макулдугун күтүп, андан кийин макул болгон сатып алуучунун эң жогорку баасы менен жарнама ордун сатат. Функциянын жообу мүмкүн болушунча тезирээк болушу керек. Сатып алуучунун индексин кайтаруу керек. Мисалдар: Сатып алуучулар 1, 5, 10 бааларды сунушташат 10 сунуштаган сатып алуучу баш тартты 1 сунуштаган сатып алуучу макулдугун берди // Биз дагы күтүп жатабыз, себеби 5 бааны сунуштаган сатып алуучу жооп бериши мүмкүн 5 сунуштаган сатып алуучу макулдугун берди // Биз 5 сунуштаган сатып алуучуну тандайбыз ------------ Сатып алуучулар 1, 5, 10 бааларды сунушташат 10 сунуштаган сатып алуучу баш тартты 5 сунуштаган сатып алуучу макулдугун берди // 1 сунуштаган сатып алуучунун жооптуусун күтпөйбүз - ал анык эле тандалбайт ------------ Сатып алуучулар 1, 2 бааларды сунушташат 1 сунуштаган сатып алуучу баш тартты 2 сунуштаган сатып алуучу баш тартты // Эч ким тандалбайт 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

AIден жооп

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

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

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

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