Add solution for 2025 Day 5

This commit is contained in:
Thraix
2025-12-05 22:20:41 +01:00
parent c32f5a380e
commit 6ee70bb6d0
2 changed files with 85 additions and 13 deletions
+11
View File
@@ -0,0 +1,11 @@
3-5
10-14
16-20
12-18
1
5
8
11
17
32
+74 -13
View File
@@ -2,35 +2,96 @@
namespace y2025::day05
{
using InputType = std::vector<int>;
REGISTER_DAY(2025, Day05, InputType, int);
using Range = std::pair<int64_t, int64_t>;
REGISTER_TEST_EXAMPLE(2025, Day05, ExampleInput, 1, 0);
REGISTER_TEST(2025, Day05, Input, 1, 0);
REGISTER_TEST_EXAMPLE(2025, Day05, ExampleInput, 2, 0);
REGISTER_TEST(2025, Day05, Input, 2, 0);
struct Input
{
std::vector<Range> ranges;
std::vector<int64_t> ingredients;
};
using InputType = Input;
REGISTER_DAY(2025, Day05, InputType, int64_t);
REGISTER_TEST_EXAMPLE(2025, Day05, ExampleInput, 1, 3);
REGISTER_TEST(2025, Day05, Input, 1, 848);
REGISTER_TEST_EXAMPLE(2025, Day05, ExampleInput, 2, 14);
REGISTER_TEST(2025, Day05, Input, 2, 334714395325710);
READ_INPUT(input)
{
std::vector<int> vec;
Input i;
std::string str;
while (std::getline(input, str))
{
if (str.empty())
break;
std::stringstream ss{str};
int n;
ss >> n;
vec.emplace_back(n);
int64_t n1, n2;
ss >> n1 >> "-" >> n2;
i.ranges.emplace_back(n1, n2);
}
return vec;
while (std::getline(input, str))
{
std::stringstream ss{str};
int64_t n;
ss >> n;
i.ingredients.emplace_back(n);
}
return i;
}
int64_t CalcNonOverlap(const Range& range,
const std::vector<Range>& overlaps,
int overlapLowerLimit,
int overlapUpperLimit)
{
if (range.second < range.first)
return 0;
for (int i = overlapLowerLimit; i <= overlapUpperLimit; i++)
{
const Range& overlap = overlaps[i];
if (range.second >= overlap.first && range.first <= overlap.second)
{
Range leftRange{range.first, std::min(overlap.first - 1, range.second)};
Range rightRangne{std::max(overlap.second + 1, range.first), range.second};
return CalcNonOverlap(leftRange, overlaps, i + 1, overlapUpperLimit) +
CalcNonOverlap(rightRangne, overlaps, i + 1, overlapUpperLimit);
}
}
// No overlap, return entire range
return range.second - range.first + 1;
}
OUTPUT1(input)
{
return 0;
int fresh = 0;
for (auto ing : input.ingredients)
{
for (auto& range : input.ranges)
{
if (ing >= range.first && ing <= range.second)
{
fresh++;
break;
}
}
}
return fresh;
}
OUTPUT2(input)
{
return 0;
int64_t sum = 0;
for (int i = 0; i < input.ranges.size(); i++)
{
sum += CalcNonOverlap(input.ranges[i], input.ranges, 0, i - 1);
}
return sum;
}
}