diff --git a/src/days/02/Day02.cpp b/src/days/02/Day02.cpp index f88eb65..bc16b67 100644 --- a/src/days/02/Day02.cpp +++ b/src/days/02/Day02.cpp @@ -1,9 +1,65 @@ #include "Day02.h" Result Day02::Task1() { - return Day::Task1(); + int r = 12; + int g = 13; + int b = 14; + + uint32_t sum = 0; + uint32_t id = 1; + for (const Game &game : parseGames()){ + bool possible = true; + for (const auto &set : game) + if (set[0] > r || set[1] > g || set[2] > b) + possible = false; + if (possible) + sum += id; + + id++; + } + return to_string(sum); } Result Day02::Task2() { - return Day::Task2(); -} \ No newline at end of file + uint32_t sum = 0; + for (const Game &game : parseGames()){ + size_t r = 0, g = 0, b = 0; + for (const auto &set : game){ + r = std::max(r, set[0]); + g = std::max(g, set[1]); + b = std::max(b, set[2]); + } + sum += r * g * b; + } + return to_string(sum); +} + +vector Day02::parseGames() const { + vector games; + for (const string &line : input){ + auto record = line.substr(line.find(": ") + 1); + record.push_back(';'); + auto setIndices = findAll(record, ";"); + + Game game; + size_t start = 0; + for (size_t i : setIndices){ + auto set = record.substr(start, i - start); + + auto findNumber = [set](const string &type) -> size_t { + auto pos = set.find(type); + if (pos != string::npos) + return std::stoul(set.substr(pos - 3, 2)); + return 0; + }; + size_t r = findNumber("red"); + size_t g = findNumber("green"); + size_t b = findNumber("blue"); + + game.push_back({r, g, b}); + start = i; + } + games.push_back(game); + } + return games; +} diff --git a/src/days/02/Day02.h b/src/days/02/Day02.h index e6a2124..50adb01 100644 --- a/src/days/02/Day02.h +++ b/src/days/02/Day02.h @@ -3,8 +3,11 @@ #include "../../Day.h" class Day02 : public Day { + typedef vector> Game; protected: Result Task1() override; Result Task2() override; + + vector parseGames() const; }; \ No newline at end of file