diff options
Diffstat (limited to '2023')
| -rw-r--r-- | 2023/src/day19.cpp | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/2023/src/day19.cpp b/2023/src/day19.cpp index 192e066..78306c9 100644 --- a/2023/src/day19.cpp +++ b/2023/src/day19.cpp | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #include <functional> | 2 | #include <functional> |
| 3 | #include <iostream> | 3 | #include <iostream> |
| 4 | #include <map> | 4 | #include <map> |
| 5 | #include <numeric> | ||
| 5 | #include <regex> | 6 | #include <regex> |
| 6 | #include <string> | 7 | #include <string> |
| 7 | #include <vector> | 8 | #include <vector> |
| @@ -83,18 +84,16 @@ part1(map<string, tuple<vector<tuple<string, string, long, string>>, string>> ru | |||
| 83 | void | 84 | void |
| 84 | part2(map<string, tuple<vector<tuple<string, string, long, string>>, string>> rules) | 85 | part2(map<string, tuple<vector<tuple<string, string, long, string>>, string>> rules) |
| 85 | { | 86 | { |
| 86 | function<long(map<string, tuple<long, long>>, string)> count = [&](map<string, tuple<long, long>> ranges, const string& name) -> long { | 87 | function<long(map<string, tuple<long, long>>, string)> count = [&](auto ranges, const string& name) -> long { |
| 87 | if ( name == "R" ) { | 88 | if ( name == "R" ) { |
| 88 | return 0; | 89 | return 0; |
| 89 | } | 90 | } |
| 90 | 91 | ||
| 91 | if ( name == "A" ) { | 92 | if ( name == "A" ) { |
| 92 | long result = 1; | 93 | return accumulate(ranges.begin(), ranges.end(), 1L, [](auto lhs, auto rhs) { |
| 93 | for ( const auto& range: ranges ) { | 94 | const auto [lo, hi] = rhs.second; |
| 94 | const auto [lo, hi] = range.second; | 95 | return lhs * (hi - lo + 1); |
| 95 | result *= hi - lo + 1; | 96 | }); |
| 96 | } | ||
| 97 | return result; | ||
| 98 | } | 97 | } |
| 99 | 98 | ||
| 100 | const auto [sub_rules, fallback] = rules[name]; | 99 | const auto [sub_rules, fallback] = rules[name]; |
