В девятый день Advent of Code мы моделируем движения веревки. Я призываю вас сначала попытаться решить ее самостоятельно. https://adventofcode.com

Вход

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

При этом мы можем использовать простой std::views::istream и получить std::vector<Order> в качестве входных данных.

Имитация короткой веревки.

В первой части нам нужно смоделировать короткую веревку, состоящую из головки и хвостовой части. Голова следует направлениям приказов, двигаясь в ортогональных направлениях, а хвост должен оставаться на расстоянии не более одного места (ортогонального или диагонального) и может двигаться по диагонали.

Все, что нам нужно отслеживать, — это положение головы и хвоста, а также набор позиций, которые хвост посетил во время симуляции (это наш результат).

Затем мы можем разложить задачу на «двигать головой» и «следовать хвостом», что мы будем повторять до тех пор, пока не обработаем каждый заказ.

Имитация длинной веревки.

Во второй части перед нами стоит задача улучшить симуляцию, моделируя веревку, состоящую из десяти частей (головка, восемь промежуточных и хвост).

Это не меняет нашего подхода, но с одной важной оговоркой. В то время как голова движется только ортогонально, промежуточные части могут двигаться по диагонали. Наша процедура «следуй хвостом» должна это учитывать.

Ссылки

Репозиторий с полным решением (включая парсинг ввода) доступен здесь: https://github.com/HappyCerberus/moderncpp-aoc-2022.

Я ежедневно размещаю контент на современном C++ в Twitter, LinkedIn, Mastodon, Medium и Substack.