diff --git a/src/days/09/Day09.cpp b/src/days/09/Day09.cpp index 5e1968d..2cfcdb8 100644 --- a/src/days/09/Day09.cpp +++ b/src/days/09/Day09.cpp @@ -1,9 +1,47 @@ #include "Day09.h" Result Day09::Task1() { - return Day::Task1(); + int64 sum = 0; + for (auto &history : parseHistories()){ + vector tails = {history.back()}; + vector diff = history; + + while (std::any_of(diff.begin(), diff.end(), [](int64 v){return v != 0;})){ + for (size_t i = 0; i < diff.size() - 1; i++) + diff[i] = diff[i + 1] - diff[i]; + diff.pop_back(); + tails.push_back(diff.back()); + } + + sum += std::reduce(tails.begin(), tails.end(), 0, [](int64 a, int64 b){ return a + b; }); + } + return to_string(sum); } Result Day09::Task2() { - return Day::Task2(); -} \ No newline at end of file + int64 sum = 0; + for (auto &history : parseHistories()){ + vector heads = {history.front()}; + vector diff = history; + + while (std::any_of(diff.begin(), diff.end(), [](int64 v){return v != 0;})){ + for (size_t i = 0; i < diff.size() - 1; i++) + diff[i] = diff[i + 1] - diff[i]; + diff.pop_back(); + heads.push_back(diff.front()); + } + + for (size_t i = 0; i < heads.size(); i++) + sum += heads[i] * (i % 2 == 0 ? 1 : -1); + } + return to_string(sum); +} + +vector> Day09::parseHistories() const { + vector> histories; + + for (const string &line : input) + histories.push_back(parseInts(line)); + + return histories; +} diff --git a/src/days/09/Day09.h b/src/days/09/Day09.h index 0747edd..4209ca6 100644 --- a/src/days/09/Day09.h +++ b/src/days/09/Day09.h @@ -7,4 +7,6 @@ protected: Result Task1() override; Result Task2() override; + + vector> parseHistories() const; }; \ No newline at end of file