Сегодня двадцать третий день Пришествия кода, и мы моделируем оптимальные схемы посадки звездчатых деревьев. Я призываю вас сначала попробовать решить ее самостоятельно https://adventofcode.com.

Вход

Сегодняшние данные — это наша начальная конфигурация эльфа. Мы будем хранить эту информацию в нашем пользовательском типе Map.

Разложение проблемы

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

Во-первых, для основного цикла нам нужно будет перебрать всех эльфов, заставить их спланировать свое движение, и, если они единственный эльф с этим пунктом назначения, переместить их во второй части цикла. Эта логика будет инкапсулирована в нашем основном классе Elves.

Во-вторых, чтобы определить, куда эльф может двигаться, он должен проверить, занято ли уже определенное место. Для этого нам нужно некоторое представление карты. Примечательно, что в то время как область, покрытая эльфами, будет меняться по мере запуска нашей симуляции, количество эльфов не изменится. Это указывает на скудное хранилище. Мы закодируем это в нашем классе Map, который предоставит вспомогательные функции для добавления, перемещения и запроса позиций эльфов.

Наконец, у нас есть усложнение вращающейся эльфийской логики. В каждом раунде предпочтения эльфов по кругу меняются. Хотя это не данные, а логика, это мало что значит для наших возможностей C++. Мы можем закодировать это как итерацию по std::vector из std::function со смещением, которое увеличивается после каждого раунда.

Когда все части готовы, осталось реализовать всю логику 😀.

Ссылки

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

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