aboutsummaryrefslogtreecommitdiff
path: root/2024/src/day05.cpp
diff options
context:
space:
mode:
authorThomas Schmucker <ts@its1.de>2024-12-05 22:32:08 +0100
committerThomas Schmucker <ts@its1.de>2024-12-05 22:32:08 +0100
commit3d25bbb7e6cc67dc96e6c1f40ae901bd2bb754da (patch)
treeb12e00e43b6151e191484a1b8078b310d35adcac /2024/src/day05.cpp
parent307db3fd03f53ddc8e13c57586d3fbe393696e60 (diff)
downloadadvent-of-code-3d25bbb7e6cc67dc96e6c1f40ae901bd2bb754da.tar.gz
advent-of-code-3d25bbb7e6cc67dc96e6c1f40ae901bd2bb754da.tar.bz2
advent-of-code-3d25bbb7e6cc67dc96e6c1f40ae901bd2bb754da.zip
aoc 2024, day5
Diffstat (limited to '2024/src/day05.cpp')
-rw-r--r--2024/src/day05.cpp104
1 files changed, 104 insertions, 0 deletions
diff --git a/2024/src/day05.cpp b/2024/src/day05.cpp
new file mode 100644
index 0000000..37d74c6
--- /dev/null
+++ b/2024/src/day05.cpp
@@ -0,0 +1,104 @@
1#include <fstream>
2#include <iostream>
3#include <numeric>
4#include <set>
5#include <sstream>
6#include <string>
7#include <vector>
8using namespace std;
9
10vector<long>
11split(const string& line, char sep = ',')
12{
13 vector<long> parts;
14 stringstream input{ line };
15
16 for ( string part; getline(input, part, sep); ) {
17 parts.emplace_back(stol(part));
18 }
19
20 return parts;
21}
22
23tuple<vector<tuple<long, long>>, vector<vector<long>>>
24read_file(string_view filename)
25{
26 fstream input{ filename };
27
28 vector<tuple<long, long>> rules;
29 for ( string line; getline(input, line); ) {
30 if ( line.empty() ) {
31 break;
32 }
33 long lhs = 0;
34 long rhs = 0;
35 sscanf(line.c_str(), "%ld|%ld", &lhs, &rhs); // NOLINT
36 rules.emplace_back(lhs, rhs);
37 }
38
39 vector<vector<long>> pages;
40 for ( string line; getline(input, line); ) {
41 pages.emplace_back(split(line));
42 }
43 return { rules, pages };
44}
45
46bool
47is_valid(const vector<tuple<long, long>>& rules, const vector<long>& page)
48{
49 set<long> processed;
50
51 bool invalid = false;
52 for ( const auto& num: page ) {
53 processed.emplace(num);
54
55 auto pred = [num](const tuple<long, long>& rule) {
56 return get<0>(rule) == num;
57 };
58
59 for ( auto it = find_if(rules.begin(), rules.end(), pred); it != rules.end(); it = find_if(it + 1, rules.end(), pred) ) {
60 const auto foo = get<1>(*it);
61
62 if ( processed.contains(foo) ) {
63 invalid = true;
64 }
65 }
66 }
67 return !invalid;
68}
69
70void
71part1(const vector<tuple<long, long>>& rules, const vector<vector<long>>& pages)
72{
73 long sum = 0;
74 for ( const auto& page: pages ) {
75 if ( is_valid(rules, page) ) {
76 sum += page.at(page.size() / 2);
77 }
78 }
79 cout << sum << endl;
80}
81
82void
83part2(const vector<tuple<long, long>>& rules, const vector<vector<long>>& pages)
84{
85 long sum = 0;
86 for ( auto page: pages ) {
87 if ( !is_valid(rules, page) ) {
88 ranges::sort(page, [&](auto lhs, auto rhs) -> bool {
89 return ranges::find(rules, make_tuple(lhs, rhs)) != rules.end();
90 });
91
92 sum += page.at(page.size() / 2);
93 }
94 }
95 cout << sum << endl;
96}
97
98int
99main()
100{
101 auto [rules, pages] = read_file("data/day05.txt");
102 part1(rules, pages);
103 part2(rules, pages);
104}