502. Больше-Меньше

Не решаласьСредняя

Никита придумал игру «Сокровища дракона» и сделал веб-приложение, чтобы в неё можно было играть онлайн. По сюжету дракон спрятал волшебный артефакт на одном из множества островов, а игроки должны угадать, на каком.

Правила довольно простые: артефакт кладётся на остров со случайным номером — целым неотрицательным числом, которое cервер на JavaScript может безопасно и точно хранить внутри примитива Number. Чтобы угадать, на каком острове находится артефакт, игрок делает запросы к специальному API по адресу https://game.yandex?value={число}, а в ответ получает подсказку: больше или меньше номер заветного острова, чем число из запроса.

К сожалению, сервер Никиты очень слабый, поэтому он может обрабатывать не больше одного запроса за единицу времени, то есть, пока не выполнится первый запрос, остальные будут получать ответ 429 Too Many Requests. Также установлено ограничение на количество запросов: за одну игру можно сделать максимум 55 запросов. Ещё сервер не очень стабильно работает, поэтому иногда может отвечать 503 Service Unavailable

Описание API

  1. Сервер принимает только GET запросы на https://game.yandex, при использовании других методов вернётся ошибка 405 Method Not Allowed.

  2. Предполагаемое число необходимо передавать в query-параметре с именем value (https://game.yandex?value=123).

  3. Сервер возвращает результат сравнения в виде JSON-объекта с полем result, которое содержит more, less или equal (например, {"result": "more"}).

  4. Если загаданное число больше, чем value из query-параметров, то сервер вернёт {"result": "more"}.

  5. Если загаданное число меньше, чем value из query-параметров, то сервер вернёт {"result": "less"}.

  6. Если загаданное число равно value из query-параметров, то сервер вернёт {"result": "equal"}.

  7. Если было сделано больше 55 запросов, то сервер вернёт {"error": "You have made too many requests"} и статус 403 Forbidden.

  8. С некоторой вероятностью сервер может вернуть ошибку со статусом 503 Service Unavailable.

  9. Если передать некорректное значение (https://game.yandex?value=abc), то сервер вернёт ошибку со статусом 400 Bad Request.

  10. Сервер отвечает со случайной задержкой, но гарантируется, что за время, выделенное на выполнение вашего кода, можно успеть сделать 55 подряд идущих запросов.

Примеры

Предположим, что дракон положил артефакт на остров под номером 142.

Если мы сделаем запрос, где в value передадим 100, то сервер вернёт JSON с полем result со значением more.

Запрос:
fetch('https://game.yandex?value=100')

Ответ:
{"result": "more"}

Если мы сделаем запрос, где в value передадим 150, то вернётся less.

Запрос:
fetch('https://game.yandex?value=150')

Ответ:
{"result": "less"}

Если сделать запрос, где в value передаётся номер острова с артефактом — 142, то мы получим equal.

Запрос:
fetch('https://game.yandex?value=142')

Ответ:
{"result": "equal"}

Ожидаемый формат вывода

Необходимо в виде CommonJS модуля экспортировать асинхронную функцию, которая вернёт одно единственное число — номер острова, на котором лежит артефакт.

module.exports = async () => {
  // Ваше решение
}

Примечание

В решении обязательно используйте fetch для отправки запросов, XMLHttpRequest — запрещён.

Дело в том, что в реальности сервера по адресу https://game.yandex не существует, просто в рамках тестов функция fetch будет пропатчена. То есть для запросов на game.yandex она будет отвечать согласно логике, описанной выше, а не делать запрос в интернет. Однако будут эмулироваться помехи с сетью и задержка на выполнение запроса.

Для удобства разработки вы можете воспользоваться функцией patchFetch(142) из нашего модуля, которая так же пропатчит fetch в вашем коде, но, перед отправкой решения, эту функцию нужно будет удалить из кода. Число, которое передаётся в функцию patchFetch, и будет значением, которое загадает локальный эмулятор сервера Никиты.

const patchFetch = require('./patchFetch.js');

patchFetch(142);

// Запрос не отправится в интернет,
// а выполнится на локальном эмуляторе сервера Никиты
fetch('https://game.yandex?value=100');

Ограничения

Ограничение времени

2 с

Ограничение памяти

64 МБ

Теги

JavaScript Node.js 20.14
Нужно войти, чтобы отправить решение.Войти