На пятый день Advent Of Code нам поручили смоделировать кран, переупорядочивающий ящики. Рекомендую попробовать решить проблемы самостоятельно: https://adventofcode.com
Вход
Основная сложность сегодняшней проблемы на самом деле заключается в разборе входных данных, поэтому давайте впервые взглянем на код разбора. Для простой обработки было бы удобно представить состояние как std::vector<std::vector<char>>
.
Ввод неудобно нерегулярный со значительными пробелами. Самый простой способ проанализировать такой ввод в C++ — сначала проанализировать построчно, а затем интерпретировать каждую строку.
В отличие от начального состояния, заказы являются регулярными, поэтому мы можем ввести собственный тип и перегрузить оператор извлечения потока.
Часть 1: CrateMover 9000
Что касается первой части, теперь мы можем обрабатывать каждый заказ, изменяя состояние по ходу дела.
Мы могли перемещать ящики один за другим; однако мы также можем перемещать все ящики с помощью одного std::ranges::copy
, что, возможно, проще. В любом случае, мы должны помнить об удалении ящиков из источника.
Часть 2: CrateMover 9001
Во второй части мы можем повторно использовать один и тот же код с той оговоркой, что теперь мы копируем ящики по порядку.
Ссылки
Репозиторий с полным решением (включая парсинг ввода) доступен здесь: https://github.com/HappyCerberus/moderncpp-aoc-2022.
Я ежедневно размещаю контент на современном C++ в Twitter, LinkedIn, Mastodon, Medium и Substack.