На двадцать второй день Пришествия кода мы следим за заметками обезьян, пытаясь раскрыть пароль. Я призываю вас сначала попробовать решить ее самостоятельно https://adventofcode.com.
Вход
Наш вклад сегодня состоит из двух частей: сначала карта, которую мы возьмем как std::vector<std::string>
, а затем заметки от обезьян, которые мы возьмем как std::string
.
Исследование с обтеканием
В первой части нам нужно следовать заметкам обезьян, чтобы перемещаться по карте.
Есть два основных осложнения. Наши направления относительны; нам только предписано двигаться вперед и поворачивать влево и вправо. Мы можем инкапсулировать эту логику в Direction
class.
Вторая сложность заключается в том, что карта зацикливается. Если мы выходим за границы или на пустое место, мы оборачиваемся в этой строке или столбце. Из-за формы карты самый простой подход — инкапсулировать логику в функции, которые возвращают крайнюю левую, крайнюю правую, самую верхнюю и самую нижнюю позиции по определенной координате.
Мы могли бы кэшировать или предварительно вычислять эти значения для повышения производительности, но сегодня в этом нет необходимости.
Собрав это вместе, мы корректируем нашу позицию в зависимости от текущего направления на каждом шаге. Если мы выходим за пределы, мы обходим наши функции, избегая стен.
Чтобы вычислить пароль, нам нужно следовать инструкциям, многократно перемещаясь или поворачиваясь влево и вправо.
Это КУБ!
Во второй части нам нужно интерпретировать карту как стороны куба.
В основном это меняет логику обхода, так как теперь, когда мы выходим из стороны, мы не только меняем нашу позицию, но также можем менять направление.
Я жестко закодировал свое решение для конкретного шаблона сторон в своем вводе. Основная идея здесь состоит в том, чтобы разделить входные данные на пронумерованные стороны куба и для каждой стороны настроить четыре функции, которые представляют логику зацикливания в каждом из четырех направлений, которые мы можем оставить на этой стороне.
Я сделал физический куб, чтобы помочь мне с отображением.
Все это поддерживается новым типом позиции, который кодирует плитку, на которой мы находимся, относительное положение внутри этой плитки и, наконец, направление.