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