Files
advent-of-code/2023/puzzle-01-01.cc

69 lines
1.6 KiB
C++

#include <array>
#include <cassert>
#include <cstdint>
#include <cstdlib>
#include <iostream>
#include <string>
#include <utility>
using UInt = std::uint64_t;
constexpr std::array nums = {
std::make_pair("one", 1), std::make_pair("two", 2), std::make_pair("three", 3),
std::make_pair("four", 4),
std::make_pair("five", 5), std::make_pair("six", 6),
std::make_pair("seven", 7),
std::make_pair("eight", 8), std::make_pair("nine", 9)};
auto find_first_digit(std::string const& line) -> int
{
auto pos = line.find_first_of("0123456789");
auto value = line[pos] - '0';
for (auto [s, v] : nums) {
if (auto p = line.find(s); p != std::string::npos) {
if (p < pos) {
pos = p;
value = v;
}
}
}
return value;
}
auto find_last_digit(std::string const& line) -> int
{
auto pos = line.find_last_of("0123456789");
auto value = line[pos] - '0';
for (auto [s, v] : nums) {
if (auto p = line.rfind(s); p != std::string::npos) {
if (p > pos) {
pos = p;
value = v;
}
}
}
return value;
}
auto main() -> int
{
int sum1{0};
int sum2{0};
std::string line;
while (std::getline(std::cin, line)) {
auto first = line.find_first_of("0123456789");
auto last = line.find_last_of("0123456789");
assert(first != std::string::npos);
assert(last != std::string::npos);
sum1 += (line[first] - '0') * 10;
sum1 += line[last] - '0';
sum2 += find_first_digit(line) * 10;
sum2 += find_last_digit(line);
}
std::cout << "Sum 1: " << sum1 << "\n";
std::cout << "Sum 2: " << sum2 << "\n";
return EXIT_SUCCESS;
}