#include #include #include #include #include using namespace std; vector read_file(string_view filename) { fstream input{ filename }; vector data; for ( string line; getline(input, line); ) { data.emplace_back(line); } return data; } template vector read_ints(const string& line) { stringstream iss{ line }; return vector{ istream_iterator{ iss }, istream_iterator{} }; } template T solve_rec_part1(const vector& values) { vector differences; for ( size_t idx = 1; idx < values.size(); ++idx ) { differences.emplace_back(values[idx] - values[idx - 1]); } auto all_zeros = all_of(differences.begin(), differences.end(), [](T diff) { return diff == 0; }); if ( !all_zeros ) { return solve_rec_part1(differences) + values.back(); } else { return values.back(); } } void part1() { auto lines = read_file("data/day09.txt"); long sum = 0; for ( const auto& line: lines ) { sum += solve_rec_part1(read_ints(line)); } cout << sum << endl; } template T solve_rec_part2(const vector& values) { vector differences; for ( size_t idx = 1; idx < values.size(); ++idx ) { differences.emplace_back(values[idx] - values[idx - 1]); } auto all_zeros = all_of(differences.begin(), differences.end(), [](T diff) { return diff == 0; }); if ( !all_zeros ) { return values.front() - solve_rec_part2(differences); } else { return values.front(); } } void part2() { long sum = 0; for ( const auto& line: read_file("data/day09.txt") ) { sum += solve_rec_part2(read_ints(line)); } cout << sum << endl; } int main() { part1(); part2(); }