aboutsummaryrefslogtreecommitdiff
path: root/src/day19.cpp
diff options
context:
space:
mode:
authorThomas Schmucker <ts@its1.de>2023-12-19 19:47:24 +0100
committerThomas Schmucker <ts@its1.de>2023-12-19 19:47:24 +0100
commit175f15fba4f9605e17f5ae963beb52681849e702 (patch)
tree3a3a66beb264696f8062c59cf2709e621f7d5246 /src/day19.cpp
parente67bd318726418f37d1541939ac3e97667995d8d (diff)
downloadadvent-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.cpp123
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>
7using namespace std;
8
9string
10read_file(string_view filename)
11{
12 fstream input{ filename };
13 return { istreambuf_iterator<char>{ input }, istreambuf_iterator<char>{} };
14}
15
16vector<string>
17split(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
37void
38part1()
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
119int
120main()
121{
122 part1();
123}