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

Вход

Наш вклад сегодня состоит из двух частей: сначала карта, которую мы возьмем как std::vector<std::string>, а затем заметки от обезьян, которые мы возьмем как std::string.

Исследование с обтеканием

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

Есть два основных осложнения. Наши направления относительны; нам только предписано двигаться вперед и поворачивать влево и вправо. Мы можем инкапсулировать эту логику в Direction class.

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

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

Собрав это вместе, мы корректируем нашу позицию в зависимости от текущего направления на каждом шаге. Если мы выходим за пределы, мы обходим наши функции, избегая стен.

Чтобы вычислить пароль, нам нужно следовать инструкциям, многократно перемещаясь или поворачиваясь влево и вправо.

Это КУБ!

Во второй части нам нужно интерпретировать карту как стороны куба.

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

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

Я сделал физический куб, чтобы помочь мне с отображением.

Все это поддерживается новым типом позиции, который кодирует плитку, на которой мы находимся, относительное положение внутри этой плитки и, наконец, направление.