Sobes.tech
Middle+

Reklam satış ağı prototipinde, reklam alanlarının satışı şu şekilde düzenlenmiştir: alıcılar önceden kendi fiyatlarını belirtir ve her reklam alanı için kabul edip etmeyeceklerini yanıtlarlar. Bir fonksiyon uygulamak gerekir ki, reklam alanını satmadan önce yüksek teklif veren alıcıların kabul veya red yanıtlarını beklesin ve sonra kabul edenler arasından en yüksek teklifi yapan alıcıya satışı gerçekleştirsin. Fonksiyonun yanıtını mümkün olan en hızlı şekilde döndürmelidir. Alıcının indeksini döndürmelidir. Örnekler: Alıcılar 1, 5, 10 fiyat teklif eder 10 teklifli alıcı red yanıtı verdi 1 teklifli alıcı kabul etti // Hala bekliyoruz, çünkü 5 teklifli alıcı yanıt verebilir 5 teklifli alıcı kabul etti // 5 teklifli alıcıyı seçiyoruz ------------ Alıcılar 1, 5, 10 fiyat teklif eder 10 teklifli alıcı red yanıtı verdi 5 teklifli alıcı kabul etti // 1 teklifli alıcı yanıtını beklemiyoruz - kesinlikle seçilmeyecek ------------ Alıcılar 1, 2 fiyat teklif eder 1 teklifli alıcı red yanıtı verdi 2 teklifli alıcı red yanıtı verdi // Hiçbir alıcıyı seçmiyoruz 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 yapay zeka

AI'dan gelen yanıt

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

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

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

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