From 57b89409cee9def1b15f27c09163d3cde1582be0 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 5 Dec 2025 09:59:22 +0100 Subject: aoc 2025, day 5, part 2 --- 2025/src/day05.cpp | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) (limited to '2025/src/day05.cpp') diff --git a/2025/src/day05.cpp b/2025/src/day05.cpp index 2322948..ee565a3 100644 --- a/2025/src/day05.cpp +++ b/2025/src/day05.cpp @@ -26,10 +26,10 @@ read_file(const filesystem::path& filename) for ( string line; getline(file, line); ) { smatch match; - if ( regex_search(line, match, range) ) { + if ( regex_match(line, match, range) ) { ranges.emplace_back(stol(match[1]), stol(match[2])); } - else if ( regex_search(line, match, single) ) { + else if ( regex_match(line, match, single) ) { numbers.emplace_back(stol(match[1])); } } @@ -43,7 +43,7 @@ part1(const Ranges& ranges, const vector& numbers) long count = 0; for ( const auto number: numbers ) { for ( const auto [start, end]: ranges ) { - if ( number >= start && number <= end ) { + if ( start <= number && number <= end ) { ++count; break; } @@ -52,6 +52,33 @@ part1(const Ranges& ranges, const vector& numbers) cout << "Part 1: " << count << '\n'; } +void +part2(Ranges ranges) +{ + ranges::sort(ranges); + + Ranges merged; + merged.emplace_back(ranges[0]); + + for ( size_t i = 1; i < ranges.size(); ++i ) { + auto& [last_start, last_end] = merged.back(); + auto& [curr_start, curr_end] = ranges[i]; + + if ( last_end < curr_start ) { + merged.emplace_back(ranges[i]); + } + else if ( last_end < curr_end ) { + last_end = curr_end; + } + } + + long count = 0; + for ( const auto [start, end]: merged ) { + count += end - start + 1; + } + cout << "Part 2: " << count << '\n'; +} + } // namespace int @@ -59,4 +86,5 @@ main() { const auto [ranges, numbers] = read_file("data/day05.txt"); part1(ranges, numbers); + part2(ranges); } -- cgit v1.3