#include "common/aoc.h" namespace y2023::day01 { REGISTER_DAY(2023, Day01, std::vector, int); REGISTER_TEST_EXAMPLE(2023, Day01, ExampleInput, 1, 209); REGISTER_TEST(2023, Day01, Input, 1, 54990); REGISTER_TEST_EXAMPLE(2023, Day01, ExampleInput, 2, 281); REGISTER_TEST(2023, Day01, Input, 2, 54473); int GetNumberAt(const std::string& str, int pos) { if (str[pos] >= '0' && str[pos] <= '9') { return str[pos] - '0'; } else { static const std::vector numbers{ "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; for (int num = 0; num < numbers.size(); num++) { if (Helper::StartsWith(std::string_view{&str[pos], str.size() - pos}, numbers[num])) { return num + 1; } } } return -1; } READ_INPUT(input) { return Input::ReadLines(input); } OUTPUT1(input) { int sum = 0; for (auto& str : input) { int first = 0; int last = 0; for (int i = 0; i < str.size(); i++) { if (Helper::IsDigit(str[i])) { first = str[i] - '0'; break; } } for (int i = str.size() - 1; i >= 0; i--) { if (Helper::IsDigit(str[i])) { last = str[i] - '0'; break; } } sum += first * 10 + last; } return sum; } OUTPUT2(input) { int sum = 0; for (auto& str : input) { int first = -1; int last = -1; for (int i = 0; i < str.size(); i++) { int number = GetNumberAt(str, i); if (number != -1) { first = number; break; } } for (int i = str.size() - 1; i >= 0; i--) { int number = GetNumberAt(str, i); if (number != -1) { last = number; break; } } sum += first * 10 + last; } return sum; } }