Files
AdventOfCode/src/2023/Day01.cpp
T
2025-11-26 22:43:11 +01:00

96 lines
1.9 KiB
C++

#include "common/aoc.h"
namespace y2023::day01
{
REGISTER_DAY(2023, Day01, std::vector<std::string>, 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<std::string> 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;
}
}