diff options
| author | Thomas Schmucker <ts@its1.de> | 2023-12-19 19:47:24 +0100 |
|---|---|---|
| committer | Thomas Schmucker <ts@its1.de> | 2023-12-19 19:47:24 +0100 |
| commit | 175f15fba4f9605e17f5ae963beb52681849e702 (patch) | |
| tree | 3a3a66beb264696f8062c59cf2709e621f7d5246 /src/day19.cpp | |
| parent | e67bd318726418f37d1541939ac3e97667995d8d (diff) | |
| download | advent-of-code-175f15fba4f9605e17f5ae963beb52681849e702.tar.gz advent-of-code-175f15fba4f9605e17f5ae963beb52681849e702.tar.bz2 advent-of-code-175f15fba4f9605e17f5ae963beb52681849e702.zip | |
Lösungen für Tag 19, Teil 1
Diffstat (limited to 'src/day19.cpp')
| -rw-r--r-- | src/day19.cpp | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/src/day19.cpp b/src/day19.cpp new file mode 100644 index 0000000..3dbae22 --- /dev/null +++ b/src/day19.cpp | |||
| @@ -0,0 +1,123 @@ | |||
| 1 | #include <fstream> | ||
| 2 | #include <iostream> | ||
| 3 | #include <map> | ||
| 4 | #include <regex> | ||
| 5 | #include <string> | ||
| 6 | #include <vector> | ||
| 7 | using namespace std; | ||
| 8 | |||
| 9 | string | ||
| 10 | read_file(string_view filename) | ||
| 11 | { | ||
| 12 | fstream input{ filename }; | ||
| 13 | return { istreambuf_iterator<char>{ input }, istreambuf_iterator<char>{} }; | ||
| 14 | } | ||
| 15 | |||
| 16 | vector<string> | ||
| 17 | split(string_view line, string_view delimiter) | ||
| 18 | { | ||
| 19 | size_t pos_start = 0; | ||
| 20 | size_t pos_end = 0; | ||
| 21 | |||
| 22 | vector<string> res; | ||
| 23 | |||
| 24 | while ( (pos_end = line.find(delimiter, pos_start)) != std::string::npos ) { | ||
| 25 | auto token = line.substr(pos_start, pos_end - pos_start); | ||
| 26 | pos_start = pos_end + delimiter.length(); | ||
| 27 | |||
| 28 | res.emplace_back(token); | ||
| 29 | } | ||
| 30 | |||
| 31 | if ( pos_start != line.size() ) { | ||
| 32 | res.emplace_back(line.substr(pos_start)); | ||
| 33 | } | ||
| 34 | return res; | ||
| 35 | } | ||
| 36 | |||
| 37 | void | ||
| 38 | part1() | ||
| 39 | { | ||
| 40 | const auto input = split(read_file("data/day19.txt"), "\n\n"); | ||
| 41 | const auto rules_string = split(input[0], "\n"); | ||
| 42 | const auto parts = split(input[1], "\n"); | ||
| 43 | |||
| 44 | const regex rules_pattern{ R"((.*)\{(.*),(.*)\})" }; | ||
| 45 | const regex sub_rules_pattern{ R"((.)(.)(\d*):(.*))" }; | ||
| 46 | |||
| 47 | map<string, tuple<vector<tuple<string, string, long, string>>, string>> rules; | ||
| 48 | |||
| 49 | for ( const auto& rule: rules_string ) { | ||
| 50 | smatch smatch; | ||
| 51 | if ( regex_search(rule, smatch, rules_pattern) ) { | ||
| 52 | string rule_name = smatch[1]; | ||
| 53 | string default_dest = smatch[3]; | ||
| 54 | |||
| 55 | vector<tuple<string, string, long, string>> foo; | ||
| 56 | |||
| 57 | for ( const auto& sub_rule: split(smatch[2].str(), ",") ) { | ||
| 58 | std::smatch smatch2; | ||
| 59 | if ( regex_search(sub_rule, smatch2, sub_rules_pattern) ) { | ||
| 60 | foo.emplace_back(smatch2[1], smatch2[2], stol(smatch2[3]), smatch2[4]); | ||
| 61 | } | ||
| 62 | } | ||
| 63 | |||
| 64 | rules[rule_name] = make_tuple(foo, default_dest); | ||
| 65 | } | ||
| 66 | } | ||
| 67 | |||
| 68 | long sum = 0; | ||
| 69 | const regex parts_pattern{ R"(\{x=(\d*),m=(\d*),a=(\d*),s=(\d*)\})" }; | ||
| 70 | for ( const auto& part: parts ) { | ||
| 71 | smatch smatch; | ||
| 72 | if ( regex_search(part, smatch, parts_pattern) ) { | ||
| 73 | const auto xval = stol(smatch[1]); | ||
| 74 | const auto mval = stol(smatch[2]); | ||
| 75 | const auto aval = stol(smatch[3]); | ||
| 76 | const auto sval = stol(smatch[4]); | ||
| 77 | |||
| 78 | string rule = "in"; | ||
| 79 | while ( rule != "A" && rule != "R" ) { | ||
| 80 | auto sub_rules = get<0>(rules[rule]); | ||
| 81 | auto next_rule = get<1>(rules[rule]); | ||
| 82 | |||
| 83 | for ( auto sub_rule: sub_rules ) { | ||
| 84 | const auto field = get<0>(sub_rule); | ||
| 85 | const auto cmp = get<1>(sub_rule); | ||
| 86 | const auto value = get<2>(sub_rule); | ||
| 87 | |||
| 88 | if ( field == "x" && ((cmp == ">" && xval > value) || (cmp == "<" && xval < value)) ) { | ||
| 89 | next_rule = get<3>(sub_rule); | ||
| 90 | break; | ||
| 91 | } | ||
| 92 | if ( field == "m" && ((cmp == ">" && mval > value) || (cmp == "<" && mval < value)) ) { | ||
| 93 | next_rule = get<3>(sub_rule); | ||
| 94 | break; | ||
| 95 | } | ||
| 96 | if ( field == "a" && ((cmp == ">" && aval > value) || (cmp == "<" && aval < value)) ) { | ||
| 97 | next_rule = get<3>(sub_rule); | ||
| 98 | break; | ||
| 99 | } | ||
| 100 | if ( field == "s" && ((cmp == ">" && sval > value) || (cmp == "<" && sval < value)) ) { | ||
| 101 | next_rule = get<3>(sub_rule); | ||
| 102 | break; | ||
| 103 | } | ||
| 104 | } | ||
| 105 | |||
| 106 | rule = next_rule; | ||
| 107 | } | ||
| 108 | if (rule == "A") { | ||
| 109 | sum += xval; | ||
| 110 | sum += mval; | ||
| 111 | sum += aval; | ||
| 112 | sum += sval; | ||
| 113 | } | ||
| 114 | } | ||
| 115 | } | ||
| 116 | cout << sum << endl; | ||
| 117 | } | ||
| 118 | |||
| 119 | int | ||
| 120 | main() | ||
| 121 | { | ||
| 122 | part1(); | ||
| 123 | } | ||
