Files
aoccpp2025/day3.cpp
2025-12-04 22:12:32 -05:00

69 lines
1.8 KiB
C++

//
// Created by Grant Horner on 12/3/25.
//
#include <ranges>
#include <string>
#include "doctest.h"
#include "utils.h"
namespace day3 {
const std::string sample = "987654321111111\n"
"811111111111119\n"
"234234234234278\n"
"818181911112111\n";
auto split_into_banks(const std::string_view input) {
return std::views::split(input, '\n')
| std::views::transform(utils::to_string_view)
| std::views::filter(utils::non_empty);
}
uint64_t solve(const std::string_view input, uint8_t num_batteries) {
uint64_t sum = 0;
for (auto split: split_into_banks(input)) {
uint64_t bank = 0;
size_t largest_index = 0;
for (size_t i = num_batteries; i > 0; i--) {
const auto num_reserved = i - 1;
const auto substr_len = split.size() - largest_index - num_reserved;
const auto not_last = split.substr(largest_index, substr_len);
size_t temp_largest_index = 0;
uint8_t largest = 0;
for (size_t j = 0; j < not_last.size(); j++) {
if (const char c = not_last[j]; c > largest) {
largest = c;
temp_largest_index = 1 + j;
}
}
largest_index += temp_largest_index;
bank += (largest - '0') * std::pow(10, i - 1);
}
sum += bank;
}
return sum;
}
TEST_SUITE_BEGIN("Day 3");
TEST_CASE("solve first sample") {
CHECK(solve(sample, 2) == 357);
}
TEST_CASE("solve first puzzle") {
CHECK(solve(utils::read_file("day3input.txt"),2) == 17095);
}
TEST_CASE("solve second sample") {
CHECK(solve(sample, 12) == 3121910778619);
}
TEST_CASE("solve second input") {
CHECK(solve(utils::read_file("day3input.txt"), 12) == 168794698570517);
}
TEST_SUITE_END();
}