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

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