diff options
Diffstat (limited to '2025/src')
| -rw-r--r-- | 2025/src/day05.cpp | 34 |
1 files changed, 31 insertions, 3 deletions
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) | |||
| 26 | 26 | ||
| 27 | for ( string line; getline(file, line); ) { | 27 | for ( string line; getline(file, line); ) { |
| 28 | smatch match; | 28 | smatch match; |
| 29 | if ( regex_search(line, match, range) ) { | 29 | if ( regex_match(line, match, range) ) { |
| 30 | ranges.emplace_back(stol(match[1]), stol(match[2])); | 30 | ranges.emplace_back(stol(match[1]), stol(match[2])); |
| 31 | } | 31 | } |
| 32 | else if ( regex_search(line, match, single) ) { | 32 | else if ( regex_match(line, match, single) ) { |
| 33 | numbers.emplace_back(stol(match[1])); | 33 | numbers.emplace_back(stol(match[1])); |
| 34 | } | 34 | } |
| 35 | } | 35 | } |
| @@ -43,7 +43,7 @@ part1(const Ranges& ranges, const vector<long>& numbers) | |||
| 43 | long count = 0; | 43 | long count = 0; |
| 44 | for ( const auto number: numbers ) { | 44 | for ( const auto number: numbers ) { |
| 45 | for ( const auto [start, end]: ranges ) { | 45 | for ( const auto [start, end]: ranges ) { |
| 46 | if ( number >= start && number <= end ) { | 46 | if ( start <= number && number <= end ) { |
| 47 | ++count; | 47 | ++count; |
| 48 | break; | 48 | break; |
| 49 | } | 49 | } |
| @@ -52,6 +52,33 @@ part1(const Ranges& ranges, const vector<long>& numbers) | |||
| 52 | cout << "Part 1: " << count << '\n'; | 52 | cout << "Part 1: " << count << '\n'; |
| 53 | } | 53 | } |
| 54 | 54 | ||
| 55 | void | ||
| 56 | part2(Ranges ranges) | ||
| 57 | { | ||
| 58 | ranges::sort(ranges); | ||
| 59 | |||
| 60 | Ranges merged; | ||
| 61 | merged.emplace_back(ranges[0]); | ||
| 62 | |||
| 63 | for ( size_t i = 1; i < ranges.size(); ++i ) { | ||
| 64 | auto& [last_start, last_end] = merged.back(); | ||
| 65 | auto& [curr_start, curr_end] = ranges[i]; | ||
| 66 | |||
| 67 | if ( last_end < curr_start ) { | ||
| 68 | merged.emplace_back(ranges[i]); | ||
| 69 | } | ||
| 70 | else if ( last_end < curr_end ) { | ||
| 71 | last_end = curr_end; | ||
| 72 | } | ||
| 73 | } | ||
| 74 | |||
| 75 | long count = 0; | ||
| 76 | for ( const auto [start, end]: merged ) { | ||
| 77 | count += end - start + 1; | ||
| 78 | } | ||
| 79 | cout << "Part 2: " << count << '\n'; | ||
| 80 | } | ||
| 81 | |||
| 55 | } // namespace | 82 | } // namespace |
| 56 | 83 | ||
| 57 | int | 84 | int |
| @@ -59,4 +86,5 @@ main() | |||
| 59 | { | 86 | { |
| 60 | const auto [ranges, numbers] = read_file("data/day05.txt"); | 87 | const auto [ranges, numbers] = read_file("data/day05.txt"); |
| 61 | part1(ranges, numbers); | 88 | part1(ranges, numbers); |
| 89 | part2(ranges); | ||
| 62 | } | 90 | } |
