aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/day09.cpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/day09.cpp b/src/day09.cpp
new file mode 100644
index 0000000..1afcfe2
--- /dev/null
+++ b/src/day09.cpp
@@ -0,0 +1,107 @@
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>
30void
31solve_rec_part1(vector<T>& values)
32{
33 vector<T> differences;
34
35 for ( size_t idx = 1; idx < values.size(); ++idx ) {
36 auto difference = values[idx] - values[idx - 1];
37 differences.emplace_back(difference);
38 }
39 auto all_zeros = all_of(differences.begin(), differences.end(), [](long diff) { return diff == 0; });
40 if ( !all_zeros) {
41 solve_rec_part1(differences);
42 }
43 else {
44 differences.emplace_back(0);
45 }
46 auto last_value = values.back();
47 auto last_difference = differences.back();
48 values.emplace_back(last_value + last_difference);
49}
50
51void
52part1()
53{
54 auto lines = read_file("data/day09.txt");
55
56 long sum = 0;
57 for ( const auto& line: lines ) {
58 auto values = read_ints(line);
59 solve_rec_part1(values);
60 sum += values.back();
61 }
62 cout << sum << endl;
63}
64
65template<typename T>
66void
67solve_rec_part2(vector<T>& values)
68{
69 vector<T> differences;
70
71 for ( size_t idx = 1; idx < values.size(); ++idx ) {
72 auto difference = values[idx] - values[idx - 1];
73 differences.emplace_back(difference);
74 }
75 auto all_zeros = all_of(differences.begin(), differences.end(), [](long diff) { return diff == 0; });
76 if ( !all_zeros) {
77 solve_rec_part2(differences);
78 }
79 else {
80 differences.insert(differences.begin(), 0);
81 }
82
83 auto first_value = values.front();
84 auto first_difference = differences.front();
85 values.insert(values.begin(), first_value - first_difference);
86}
87
88void
89part2()
90{
91 auto lines = read_file("data/day09.txt");
92
93 long sum = 0;
94 for ( const auto& line: lines ) {
95 auto values = read_ints(line);
96 solve_rec_part2(values);
97 sum += values.front();
98 }
99 cout << sum << endl;
100}
101
102int
103main()
104{
105 part1();
106 part2();
107}