У нас есть марсоход, у которого задано начальное положение в плоской системе координат (x, y)
и направление (N
, S
, W
, E
). Марсоход понимает следующую систему команд:
F
– проехать на одну единицу вперёдB
– проехать на одну единицу назадL
– повернуть налевоR
– повернуть направо
Начальное положение марсохода: координаты (1, 1)
, направление N
. Требуется рассчитать конечное положение марсохода (координаты и направление) после выполнения произвольной заданной последовательности команд, например, FFLBFRLBBFFRRBBLFR
.
- Go 1.21.4 или выше
- Docker (для запуска в контейнере)
make
(для использования Makefile)- Утилита
golangci-lint
для линтинга кода - Утилита
goimports
для форматирования импортов
-
Запуск без флагов (будет предложено выбрать режим):
make run
-
Запуск в консольном режиме:
make console
-
Запуск в файловом режиме (укажите путь к файлу с командами):
make file FILE=/path/to/commands.txt
Пример файла data/simple_test, содержит простой путь (1,1) N => (-1,4) E
-
Запуск в интерактивном режиме:
make interactive
Этот пакет содержит основной файл программы и логику командной строки для управления марсоходом. Использует библиотеку cobra
для обработки команд и флагов.
Пакет app
содержит основную логику приложения. Здесь определяются интерфейсы Rover
и Optimizer
, а также реализация методов для обработки маршрута и интерактивного управления.
Пакет control
содержит вспомогательные функции для интерактивного управления марсоходом с помощью клавиатуры. Использует библиотеку keyboard
для обработки ввода с клавиатуры.
Пакет models
содержит определения структур и констант, используемых в приложении, включая типы команд и направления марсохода.
Пакет optimization
содержит логику оптимизации маршрута. Маршрут оптимизируется по принципу, что много поворотов/движений подряд схлопывается в структуру типа Movement, например FFFFFBBBB => Move{Movevent, 1}. Задумано для того, чтобы марсоход не топтался и на крутился на месте. Оптимизированный маршрут уже идёт на выполнение марсоходу
Пакет rover
содержит реализацию интерфейса Rover
. Здесь определяются методы для выполнения маршрута, перемещения и поворотов марсохода, а также получения текущей позиции и направления.
Пакет mocks
содержит автоматически сгенерированные mock-объекты для интерфейсов Rover
и Optimizer
. Эти mock-объекты используются в тестах для имитации поведения реальных объектов.