Сегодня двадцать третий день Пришествия кода, и мы моделируем оптимальные схемы посадки звездчатых деревьев. Я призываю вас сначала попробовать решить ее самостоятельно https://adventofcode.com.
Вход
Сегодняшние данные — это наша начальная конфигурация эльфа. Мы будем хранить эту информацию в нашем пользовательском типе Map
.
Разложение проблемы
Наша задача состоит из нескольких движущихся частей, поэтому давайте сначала подумаем, как разбить задачу на более мелкие части, которые можно легко реализовать по отдельности.
Во-первых, для основного цикла нам нужно будет перебрать всех эльфов, заставить их спланировать свое движение, и, если они единственный эльф с этим пунктом назначения, переместить их во второй части цикла. Эта логика будет инкапсулирована в нашем основном классе Elves
.
Во-вторых, чтобы определить, куда эльф может двигаться, он должен проверить, занято ли уже определенное место. Для этого нам нужно некоторое представление карты. Примечательно, что в то время как область, покрытая эльфами, будет меняться по мере запуска нашей симуляции, количество эльфов не изменится. Это указывает на скудное хранилище. Мы закодируем это в нашем классе Map
, который предоставит вспомогательные функции для добавления, перемещения и запроса позиций эльфов.
Наконец, у нас есть усложнение вращающейся эльфийской логики. В каждом раунде предпочтения эльфов по кругу меняются. Хотя это не данные, а логика, это мало что значит для наших возможностей C++. Мы можем закодировать это как итерацию по std::vector
из std::function
со смещением, которое увеличивается после каждого раунда.
Когда все части готовы, осталось реализовать всю логику 😀.
Ссылки
Репозиторий с полным решением (включая парсинг ввода) доступен здесь: https://github.com/HappyCerberus/moderncpp-aoc-2022.
Я ежедневно размещаю контент на современном C++ в Twitter, LinkedIn, Mastodon, Medium и Substack.