diff --git a/src/days/04/Day04.cpp b/src/days/04/Day04.cpp index 72beed7..74cb831 100644 --- a/src/days/04/Day04.cpp +++ b/src/days/04/Day04.cpp @@ -1,9 +1,62 @@ #include "Day04.h" +#include Result Day04::Task1() { - return Day::Task1(); + uint64 sum = 0; + + for (const auto &[winning, having] : parseCards()){ + std::set result; + std::set_intersection(winning.begin(), winning.end(), having.begin(), having.end(), std::inserter(result, result.begin())); + if (!result.empty()){ + sum += uint64(powl(2, result.size() - 1)); + } + } + + return to_string(sum); } Result Day04::Task2() { - return Day::Task2(); -} \ No newline at end of file + vector matches; + + for (const auto &[winning, having] : parseCards()){ + std::set result; + std::set_intersection(winning.begin(), winning.end(), having.begin(), having.end(), std::inserter(result, result.begin())); + matches.push_back(result.size()); + } + + vector counts(matches.size(), 1); + + for (size_t i = 0; i < matches.size(); i++){ + for (size_t instance = 0; instance < counts[i]; instance++){ + for (size_t k = 0; k < matches[i]; k++){ + counts[i + k + 1]++; + } + } + } + + uint64 sum = std::reduce(counts.begin(), counts.end(), 0, [](uint64 a, uint64 b){return a + b;}); + + return to_string(sum); +} + +vector Day04::parseCards() const { + vector cards; + + for (string line : input){ + line = line.substr(line.find(':') + 1); + string left = line.substr(0, line.find(" |")); + string right = line.substr(line.find(" |") + 2); + + set winning; + for (size_t i = 0; i < left.length(); i += 3) + winning.insert(std::stoul(left.substr(i, 3))); + + set having; + for (size_t i = 0; i < right.length(); i += 3) + having.insert(std::stoul(right.substr(i, 3))); + + cards.emplace_back(winning, having); + } + + return cards; +} diff --git a/src/days/04/Day04.h b/src/days/04/Day04.h index 8084bcf..e822ef2 100644 --- a/src/days/04/Day04.h +++ b/src/days/04/Day04.h @@ -3,8 +3,11 @@ #include "../../Day.h" class Day04 : public Day { + typedef pair, set> Card; protected: Result Task1() override; Result Task2() override; + + vector parseCards() const; }; \ No newline at end of file