Ещё одна задачка для собеседования на должность backend-разработчика. Адовость заключается в отсутствии и отказе предоставлять описание алгоритма выбора лифтов и пограничных случаев, а так же в отсутствии дополнительных сведений о работе подобных лифтов.
Есть в бизнес-центрах лифты, когда пассажир нажимает на кнопку нужного этажа, а на экране загорается номер лифта, на который нужно сесть пассажиру. Нужно смоделировать работу X подобных лифтов в Y этажном здании.
Сперва может показаться, что задача элементарная и решается в пару десятков строк кода. Условно её можно разбить на несколько отдельных проблем:
- выбор структур данных для хранения состояния лифта
- алгоритм движения, разворота, высадки и посадки пассажиров
алгоритм выбора ближайшего попутного лифта для пассажира- менеджер комплекса лифтов, который выбирает лифт для посадки
- интерфейсная система для ввода и вывода данных
- систему очередей на тот случай, если все лифты заняты и пассажира в данный момент нельзя никуда впихнуть
- сохранение и восстановление состояния системы
Третий пункт о выборе попутного лифта перечёркнут, потому что подобные лифты не берут попутных пассажиров, что делает решение задачи чуть более простым.
Собственно, из этого списка уже видны сущности и объекты из которых будет состоять программа. Особое внимание стоит уделить первому пункту, т.к. при плохом способе организации данных можно сильно усложнить алгоритм. В идеале, конечно сюда стоит добавить:
- учёт вместимости и грузоподъёмности лифта
- влияние нагрузки на скорость передвижения
- кнопки и действия внутри лифта, которые могу влиять на его движение
На мой взгляд, удобнее всего решать по восходящему программированию, т.е. имплементировать сущность за сущностью щедро покрывая тестами, матом и костылями. Если останется время, можно провести рефакторинг, стараясь не нарваться на непокрытый тестами регресс.
Свой вариант решения я приводить не буду, однако поиском на гитхабе нашёл несколько реализаций систем на PHP с одним лифтом: