From 56e890cec0a28c0a485212ccebfaf774235a79a2 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Wed, 3 Jan 2024 23:35:54 +0100 Subject: prepare for more puzzles ... :) --- 2023/src/day09.cpp | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 2023/src/day09.cpp (limited to '2023/src/day09.cpp') diff --git a/2023/src/day09.cpp b/2023/src/day09.cpp new file mode 100644 index 0000000..4b30e6e --- /dev/null +++ b/2023/src/day09.cpp @@ -0,0 +1,75 @@ +#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(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(differences) + values.back(); + } + else { + return values.back(); + } +} + +void +part1(const vector& lines) +{ + long sum = 0; + for ( const auto& line: lines ) { + sum += solve_rec(read_ints(line)); + } + cout << sum << endl; +} + +void +part2(const vector& lines) +{ + long sum = 0; + for ( const auto& line: lines ) { + auto values = read_ints(line); + reverse(values.begin(), values.end()); + sum += solve_rec(values); + } + cout << sum << endl; +} + +int +main() +{ + auto lines = read_file("data/day09.txt"); + part1(lines); + part2(lines); +} -- cgit v1.3