Найти в Дзене
Николай Сталин

B. Кораблекрушение. Yandex Cup 2020: Фронтенд — Финал

Исследовательский космический корабль потерпел крушение. Перед крушением он успел отправить информацию о своем местоположении – данные о расстоянии до ближайших объектов для каждой стороны света. На борту корабля находились важные данные о местности, и мы обязаны его разыскать! Переданная информация о крушении записана как объект следующего формата:

interface DownfallInfo {
top: number;
left: number;
right: number;
bottom: number;
}

К счастью, недалеко от места крушения находится наш вспомогательный дрон c рабочим лидар-модулем. На нем не установлен модуль искусственного интеллекта, однако мы можем подключиться к нему удалённо и отправить ему программу на выполнение. В нашем распоряжении будет асинхронный интерфейс управления дроном:

interface Dron {
move: (position: [number, number]) => Promise<boolean>;
top: () => Promise<number>;
left: () => Promise<number>;
right: () => Promise<number>;
bottom: () => Promise<number>;
}

Команда move перемещает дрон в указанные координаты:

  • при невозможности достичь указанной точки дрон вернётся обратно и отправит в ответ false как результат того, что по этим координатам находится препятствие;
  • если точка достижима, по окончании перемещения дрон отправит true;
    в процессе перемещения дрон не может выполнять другие команды,
  • попытка выполнить любую другую команду приведет к ошибке и отказу дрона.

Команды top, left, right и bottom взаимодействуют с лидар-модулем и возвращают количество метров (целочисленное значение от 0 до 100) до ближайшего объекта/препятствия к северу, востоку, западу или югу соответственно.

Дрон на старте выполнения программы считает, что находится в точке с координатами [0, 0] и может передвигаться в поле [MapSize, MapSize], где MapSize — число от 0 до 100 включительно. MapSize определяется на старте запуска программы и будет доступен наряду с интерфейсом дрона и информацией о точке крушения, которую надо найти.

Дрон не может приземляться на точку с препятствием, но может свободно перелетать через любое количество точек, недоступных для посадки. Также попытка приземлиться на точку с препятствием через команду move будет корректно обработана дроном – дрон вернётся на предыдущую свободную точку и вернёт в ответ статус о том, что точка недоступна для посадки.

Искомая точка обязательно является доступной к перемещению и без препятствия.

Решение

Решение должно быть оформлено в виде commonJS-модуля. Модуль должен экспортировать функцию, соответствующую следующему интерфейсу:

function solution(
dron: Dron,
downfallInfo: downfallInfo,
mapSize: number
): Promise<[number, number]> {}

Результатом выполнения программы должен быть промис, возвращающий точку координат – [number, number].

Заготовка для вашего решения:

module.exports = function solution(dron, downfallInfo, mapSize) {
// ваш код
}

Использовать синтаксис async-await запрещено. В этом случае вы получите RE ошибку при выполнении тестов.

Пример входных данных
Здесь карта представлена исключительно как иллюстрация данных, которыми будет оперировать асинхронный интерфейс дрона. Карта недоступна внутри программы.

Нулями на карте отмечено свободное для перемещения пространство, единицами отмечены объекты и препятствия. Зелёным обозначена начальная точка, на которой находится дрон в момент запуска программы. Синим отмечена точка крушения, которую необходимо найти.Карта

0110
11
00
0101
1111

Информация о месте крушения (downfallInfo):

{ top: 0, right: 1, bottom: 1, left: 0 }

Ожидаемый результат (координаты крушения): [2, 1]

Размер карты (mapSize): 4