Middle+
Reklāmas tīkla prototipā pārdošanas vietu pārdošana ir organizēta šādi: pircēji iepriekš norāda savu cenu, un katram reklāmas vietai atbild, vai viņi ir gatavi to iegādāties vai nē. Ir nepieciešams īstenot funkciju, kas pirms reklāmas vietas pārdošanas gaida augstākās likmes pircēju piekrišanu vai atteikumu, un pēc tam pārdod reklāmas vietu tam pircējam ar augstāko likmi no tiem, kas piekrita. Funkcijas atbilde jābūt pēc iespējas ātrākai. Jāatgriež pircēja indekss. Piemēri: Pircēji piedāvā cenas 1, 5, 10 Pircējs ar piedāvājumu 10 atbildēja ar atteikumu Pircējs ar piedāvājumu 1 atbildēja ar piekrišanu // Mēs vēl gaidām, jo var atbildēt pircējs ar cenu 5 Pircējs ar piedāvājumu 5 atbildēja ar piekrišanu // Izvēlamies pircēju ar piedāvājumu 5 ------------ Pircēji piedāvā cenas 1, 5, 10 Pircējs ar piedāvājumu 10 atbildēja ar atteikumu Pircējs ar piedāvājumu 5 atbildēja ar piekrišanu // Negaidām atbildi no pircēja ar piedāvājumu 1 - viņš noteikti netiks izvēlēts ------------ Pircēji piedāvā cenas 1, 2 Pircējs ar piedāvājumu 1 atbildēja ar atteikumu Pircējs ar piedāvājumu 2 atbildēja ar atteikumu // Neizvēlamies nevienu pircēju 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
Atbilde no AI
Ваша задача — как можно быстрее определить покупателя с максимальной ценой, который согласился купить рекламное место. При этом ответы покупателей приходят асинхронно и могут быть в любом порядке.
Основная идея решения:
- Отсортировать покупателей по цене по убыванию — от самого дорогого к дешевому.
- Запустить параллельно все промисы
accepts(). - Обрабатывать ответы в порядке убывания цены, чтобы как только самый дорогой покупатель согласится, сразу вернуть его индекс.
- Если самый дорогой отказался, ждать ответа следующего по цене и так далее.
Это позволит не ждать всех ответов, а вернуть результат как можно раньше.
Пример реализации:
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;
}
Таким образом, мы не ждём ответы покупателей с меньшей ценой, если уже получили согласие от более дорогого покупателя. Это ускоряет получение результата.