Идет второй день Пришествия Кода. Сегодня мы воспользуемся возможностями C++ для подсчета очков в турнире камень-ножницы-бумага. Рекомендую попробовать решить проблемы самостоятельно: https://adventofcode.com/.

Вход

Наш ввод представляет собой серию пар хода противника и нашего ответа. Ход противника закодирован в символы A, B и C, представляющие камень, ножницы и бумагу соответственно. Наш ответ аналогичным образом кодируется в символы X, Y и Z. Мы примем этот ввод как std::vector<std::pair<char,char>>.

Часть 1: ответ кодирует наш ход

В этой части наша цель — интерпретировать наш ответ как ход, а это означает, что X, Y и Z соответствуют Камню, Ножницам и Бумаге соответственно.

Первый шаг — нормализовать ввод:

  • oponent-'A' превратит Камень в 0, Бумагу в 1 и Ножницы в 2
  • our_move-'X' превратит Камень в 0, Бумагу в 1 и Ножницы в 2

Хотя стандарт C++ не определяет кодировку символов, он требует, чтобы буквы кодировались как последовательные значения.

Для подсчета баллов нам понадобится еще одно наблюдение. Ход побеждает другой, если он на один разряд выше, чем ход противника. Например. Бумага (1) лучше камня (0). Здесь есть одно предостережение: Камень (0) побеждает Ножницы (2), поэтому нам нужно будет использовать модуль в наших вычислениях.

Собрав это вместе, мы получим следующее решение:

Часть 2: ответ кодирует результат совпадения.

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

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

Собрав это вместе, мы получим следующее решение:

Ссылки

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

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