Разбор задачи про лифты в бизнес-центрах

Ещё одна задачка для собеседования на должность backend-разработчика. Адовость заключается в отсутствии и отказе предоставлять описание алгоритма выбора лифтов и пограничных случаев, а так же в отсутствии дополнительных сведений о работе подобных лифтов.

Есть в бизнес-центрах лифты, когда пассажир нажимает на кнопку нужного этажа, а на экране загорается номер лифта, на который нужно сесть пассажиру. Нужно смоделировать работу X подобных лифтов в Y этажном здании.

Сперва может показаться, что задача элементарная и решается в пару десятков строк кода. Условно её можно разбить на несколько отдельных проблем:

  • выбор структур данных для хранения состояния лифта
  • алгоритм движения, разворота, высадки и посадки пассажиров
  • алгоритм выбора ближайшего попутного лифта для пассажира
  • менеджер комплекса лифтов, который выбирает лифт для посадки
  • интерфейсная система для ввода и вывода данных
  • систему очередей на тот случай, если все лифты заняты и пассажира в данный момент нельзя никуда впихнуть
  • сохранение и восстановление состояния системы

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

Собственно, из этого списка уже видны сущности и объекты из которых будет состоять программа. Особое внимание стоит уделить первому пункту, т.к. при плохом способе организации данных можно сильно усложнить алгоритм. В идеале, конечно сюда стоит добавить:

  • учёт вместимости и грузоподъёмности лифта
  • влияние нагрузки на скорость передвижения
  • кнопки и действия внутри лифта, которые могу влиять на его движение

На мой взгляд, удобнее всего решать по восходящему программированию, т.е. имплементировать сущность за сущностью щедро покрывая тестами, матом и костылями. Если останется время, можно провести рефакторинг, стараясь не нарваться на непокрытый тестами регресс.

Свой вариант решения я приводить не буду, однако поиском на гитхабе нашёл несколько реализаций систем на PHP с одним лифтом:

Опубликовано
В рубрике Задачки