На пятый день 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.