From ec402bc00c7ab5774e355e56b141c2f6ff1340d5 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Sat, 9 Dec 2023 10:37:27 +0100 Subject: Lösung für Tag 9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/day09.cpp | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 src/day09.cpp (limited to 'src') 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 @@ +#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 +void +solve_rec_part1(vector& values) +{ + vector differences; + + for ( size_t idx = 1; idx < values.size(); ++idx ) { + auto difference = values[idx] - values[idx - 1]; + differences.emplace_back(difference); + } + auto all_zeros = all_of(differences.begin(), differences.end(), [](long diff) { return diff == 0; }); + if ( !all_zeros) { + solve_rec_part1(differences); + } + else { + differences.emplace_back(0); + } + auto last_value = values.back(); + auto last_difference = differences.back(); + values.emplace_back(last_value + last_difference); +} + +void +part1() +{ + auto lines = read_file("data/day09.txt"); + + long sum = 0; + for ( const auto& line: lines ) { + auto values = read_ints(line); + solve_rec_part1(values); + sum += values.back(); + } + cout << sum << endl; +} + +template +void +solve_rec_part2(vector& values) +{ + vector differences; + + for ( size_t idx = 1; idx < values.size(); ++idx ) { + auto difference = values[idx] - values[idx - 1]; + differences.emplace_back(difference); + } + auto all_zeros = all_of(differences.begin(), differences.end(), [](long diff) { return diff == 0; }); + if ( !all_zeros) { + solve_rec_part2(differences); + } + else { + differences.insert(differences.begin(), 0); + } + + auto first_value = values.front(); + auto first_difference = differences.front(); + values.insert(values.begin(), first_value - first_difference); +} + +void +part2() +{ + auto lines = read_file("data/day09.txt"); + + long sum = 0; + for ( const auto& line: lines ) { + auto values = read_ints(line); + solve_rec_part2(values); + sum += values.front(); + } + cout << sum << endl; +} + +int +main() +{ + part1(); + part2(); +} -- cgit v1.3