Sobes.tech
Middle+

Reklam şəbəkəsinin prototipində, reklam yerlərinin satışı aşağıdakı kimi təşkil olunub: alıcılar əvvəlcədən öz qiymətlərini bildirirlər və hər bir reklam yeri üçün razı olub-olmadıqlarına cavab verirlər. Satışdan əvvəl, ən yüksək qiymət təklif edən alıcıların razılıq və ya rədd cavablarını gözləyən və sonra razı olanlar arasından ən yüksək qiymətə sahib alıcıya satışı həyata keçirən bir funksiya tətbiq etmək lazımdır. Funksiyanın cavabını mümkün qədər tez geri qaytarmalısınız. Alıcı indeksini geri qaytarın. Nümunələr: Alıcılar 1, 5, 10 qiymət təklif edir 10 qiymət təklif edən alıcı rədd cavabı verdi 1 qiymət təklif edən alıcı razılaşdı // Hələ də gözləyirik, çünki 5 qiymət təklif edən alıcı cavab verə bilər 5 qiymət təklif edən alıcı razılaşdı // 5 qiymət təklif edən alıcıyı seçirik ------------ Alıcılar 1, 5, 10 qiymət təklif edir 10 qiymət təklif edən alıcı rədd cavabı verdi 5 qiymət təklif edən alıcı razılaşdı // 1 qiymət təklif edən alıcının cavabını gözləməyirik - o, mütləq seçilməyəcək ------------ Alıcılar 1, 2 qiymət təklif edir 1 qiymət təklif edən alıcı rədd cavabı verdi 2 qiymət təklif edən alıcı rədd cavabı verdi // Heç bir alıcı seçmirik interface 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 Süni İntellekt

AI-dan cavab

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

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

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

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