Это десятый день Пришествия кода. Сегодня мы будем проверять и фиксировать кронштейны.

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

День 10: часть 1 и часть 2

Мы получим несколько формул скобок, и наша первая цель — обнаружить поврежденные формулы, определив неуместную скобку:

Когда мы не найдем неуместную скобку, мы вернем ноль:

При обработке формулы скобок всегда есть только одна закрывающая скобка, действительная в любой конкретной позиции. Чтобы отследить, что это такое, мы запишем открывающие скобки, а затем удалим их, когда встретимся с закрывающей стороной пары. Структура данных, которая позволит нам это сделать, — std::stack.

Наконец, в основной функции мы читаем ввод построчно и вычисляем общий балл:

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

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

Прежде чем мы сможем написать нашу основную функцию, нам также понадобится функция оценки, так как на этот раз оценка немного необычна:

Наконец, мы можем собрать все это воедино и определить средний балл в соответствии с запросом:

Ссылки и технические примечания

Репозиторий ежедневных решений доступен по адресу: https://github.com/HappyCerberus/moderncpp-aoc-2021.

Посмотрите в этом списке статьи о других днях появления кода.

И, пожалуйста, не забудьте попробовать Пришествие кода на себе.

Спасибо за чтение

Спасибо, что прочитали эту статью. Вам понравилось?

Я также публикую видео на YouTube. У тебя есть вопросы? Напишите мне в Twitter или LinkedIn.