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

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