aboutsummaryrefslogtreecommitdiff
path: root/2023/src/day09.cpp
diff options
context:
space:
mode:
Diffstat (limited to '2023/src/day09.cpp')
-rw-r--r--2023/src/day09.cpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/2023/src/day09.cpp b/2023/src/day09.cpp
new file mode 100644
index 0000000..4b30e6e
--- /dev/null
+++ b/2023/src/day09.cpp
@@ -0,0 +1,75 @@
1#include <fstream>
2#include <iostream>
3#include <sstream>
4#include <string>
5#include <vector>
6using namespace std;
7
8vector<string>
9read_file(string_view filename)
10{
11 fstream input{ filename };
12 vector<string> data;
13
14 for ( string line; getline(input, line); ) {
15 data.emplace_back(line);
16 }
17
18 return data;
19}
20
21template<typename T = long>
22vector<T>
23read_ints(const string& line)
24{
25 stringstream iss{ line };
26 return vector<T>{ istream_iterator<T>{ iss }, istream_iterator<T>{} };
27}
28
29template<typename T>
30T
31solve_rec(const vector<T>& values)
32{
33 vector<T> differences;
34
35 for ( size_t idx = 1; idx < values.size(); ++idx ) {
36 differences.emplace_back(values[idx] - values[idx - 1]);
37 }
38 auto all_zeros = all_of(differences.begin(), differences.end(), [](T diff) { return diff == 0; });
39 if ( !all_zeros ) {
40 return solve_rec(differences) + values.back();
41 }
42 else {
43 return values.back();
44 }
45}
46
47void
48part1(const vector<string>& lines)
49{
50 long sum = 0;
51 for ( const auto& line: lines ) {
52 sum += solve_rec(read_ints(line));
53 }
54 cout << sum << endl;
55}
56
57void
58part2(const vector<string>& lines)
59{
60 long sum = 0;
61 for ( const auto& line: lines ) {
62 auto values = read_ints(line);
63 reverse(values.begin(), values.end());
64 sum += solve_rec(values);
65 }
66 cout << sum << endl;
67}
68
69int
70main()
71{
72 auto lines = read_file("data/day09.txt");
73 part1(lines);
74 part2(lines);
75}