diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/day09.cpp | 28 |
1 files changed, 6 insertions, 22 deletions
diff --git a/src/day09.cpp b/src/day09.cpp index 1e9bde5..0019d05 100644 --- a/src/day09.cpp +++ b/src/day09.cpp | |||
| @@ -28,7 +28,7 @@ read_ints(const string& line) | |||
| 28 | 28 | ||
| 29 | template<typename T> | 29 | template<typename T> |
| 30 | T | 30 | T |
| 31 | solve_rec_part1(const vector<T>& values) | 31 | solve_rec(const vector<T>& values) |
| 32 | { | 32 | { |
| 33 | vector<T> differences; | 33 | vector<T> differences; |
| 34 | 34 | ||
| @@ -37,7 +37,7 @@ solve_rec_part1(const vector<T>& values) | |||
| 37 | } | 37 | } |
| 38 | auto all_zeros = all_of(differences.begin(), differences.end(), [](T diff) { return diff == 0; }); | 38 | auto all_zeros = all_of(differences.begin(), differences.end(), [](T diff) { return diff == 0; }); |
| 39 | if ( !all_zeros ) { | 39 | if ( !all_zeros ) { |
| 40 | return solve_rec_part1(differences) + values.back(); | 40 | return solve_rec(differences) + values.back(); |
| 41 | } | 41 | } |
| 42 | else { | 42 | else { |
| 43 | return values.back(); | 43 | return values.back(); |
| @@ -51,35 +51,19 @@ part1() | |||
| 51 | 51 | ||
| 52 | long sum = 0; | 52 | long sum = 0; |
| 53 | for ( const auto& line: lines ) { | 53 | for ( const auto& line: lines ) { |
| 54 | sum += solve_rec_part1(read_ints(line)); | 54 | sum += solve_rec(read_ints(line)); |
| 55 | } | 55 | } |
| 56 | cout << sum << endl; | 56 | cout << sum << endl; |
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | template<typename T> | ||
| 60 | T | ||
| 61 | solve_rec_part2(const vector<T>& values) | ||
| 62 | { | ||
| 63 | vector<T> differences; | ||
| 64 | |||
| 65 | for ( size_t idx = 1; idx < values.size(); ++idx ) { | ||
| 66 | differences.emplace_back(values[idx] - values[idx - 1]); | ||
| 67 | } | ||
| 68 | auto all_zeros = all_of(differences.begin(), differences.end(), [](T diff) { return diff == 0; }); | ||
| 69 | if ( !all_zeros ) { | ||
| 70 | return values.front() - solve_rec_part2(differences); | ||
| 71 | } | ||
| 72 | else { | ||
| 73 | return values.front(); | ||
| 74 | } | ||
| 75 | } | ||
| 76 | |||
| 77 | void | 59 | void |
| 78 | part2() | 60 | part2() |
| 79 | { | 61 | { |
| 80 | long sum = 0; | 62 | long sum = 0; |
| 81 | for ( const auto& line: read_file("data/day09.txt") ) { | 63 | for ( const auto& line: read_file("data/day09.txt") ) { |
| 82 | sum += solve_rec_part2(read_ints(line)); | 64 | auto values = read_ints(line); |
| 65 | reverse(values.begin(), values.end()); | ||
| 66 | sum += solve_rec(values); | ||
| 83 | } | 67 | } |
| 84 | cout << sum << endl; | 68 | cout << sum << endl; |
| 85 | } | 69 | } |
