Код Senior Бинарный поиск обновлено

Первый упавший сервер

Условие

Массив серверов; начиная с какого-то все сбоят. Проверка асинхронная: check(name) возвращает Promise<boolean> - true, если сервер жив. Одновременно проверять можно только один сервер. Верни промис с адресом первого упавшего. Число вызовов проверки - минимально возможное. async/await и генераторы использовать нельзя.

Что проверяют тесты

  • находит первый упавший

  • минимум проверок

  • проверки не идут параллельно

  • все живы

  • первый же упал

Как подойти

Бинарный поиск по асинхронному предикату. Запрет на async/await превращает цикл в рекурсивную функцию-шаг, вызываемую из then - так гарантируется, что следующая проверка стартует только после ответа предыдущей. Логарифм проверок вместо линейного перебора и есть требование «минимально возможное количество». Ошибку проверки надо пробрасывать в reject, иначе промис зависнет.

Подсказки: 3
  1. Свойство монотонно: слева живые, справа упавшие - значит бинарный поиск левой границы.
  2. Без async/await рекурсия строится на then, вызывающем следующий шаг.
  3. Последовательность обеспечивается тем, что следующий шаг делается внутри then.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.