diff --git a/src/days/06/Day06.cpp b/src/days/06/Day06.cpp index 7b48c8f..80b06d0 100644 --- a/src/days/06/Day06.cpp +++ b/src/days/06/Day06.cpp @@ -1,9 +1,46 @@ #include "Day06.h" Result Day06::Task1() { - return Day::Task1(); + uint64 product = 1; + + for (auto &[time, distance] : parseRecords()){ + uint64 wins = 0; + for (uint64 holdTime = 1; holdTime < time; holdTime++) + if ((time - holdTime) * holdTime > distance) wins++; + product *= wins; + } + + return to_string(product); } Result Day06::Task2() { - return Day::Task2(); -} \ No newline at end of file + auto [time, distance] = parseRecord(); + + uint64 wins = 0; + for (uint64 holdTime = 1; holdTime < time; holdTime++) + if ((time - holdTime) * holdTime > distance) wins++; + + return to_string(wins); +} + +vector Day06::parseRecords() const { + vector records; + + vector time = parseInts(input[0].substr(5)); + vector distance = parseInts(input[1].substr(10)); + + for (size_t i = 0; i < time.size(); i++) + records.emplace_back(time[i], distance[i]); + + return records; +} + +Day06::Record Day06::parseRecord() const { + string rawTime = input[0].substr(10); + std::erase(rawTime, ' '); + string rawDistance = input[1].substr(10); + std::erase(rawDistance, ' '); + uint64 time = std::stoul(rawTime); + uint64 distance = std::stoul(rawDistance); + return {time, distance}; +} diff --git a/src/days/06/Day06.h b/src/days/06/Day06.h index 785fc5d..e3e1685 100644 --- a/src/days/06/Day06.h +++ b/src/days/06/Day06.h @@ -3,8 +3,12 @@ #include "../../Day.h" class Day06 : public Day { + typedef pair Record; protected: Result Task1() override; Result Task2() override; + + vector parseRecords() const; + Record parseRecord() const; }; \ No newline at end of file diff --git a/src/util.cpp b/src/util.cpp index d383250..16ea5e1 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -44,4 +44,27 @@ bool isDigit(char c, uint8_t &result) { bool isDigit(char c) { auto val = c - '0'; return val >= 0 && val < 10; +} + +vector parseInts(const string &data) { + vector result; + + uint64 value = 0; + bool readingInt = false; + + for (const char c : data){ + uint8_t digit; + if (isDigit(c, digit)) { + value = value * 10 + digit; + readingInt = true; + } else if (readingInt){ + readingInt = false; + result.push_back(value); + value = 0; + } + } + if (readingInt) + result.push_back(value); + + return result; } \ No newline at end of file diff --git a/src/util.h b/src/util.h index dd82d06..6be798c 100644 --- a/src/util.h +++ b/src/util.h @@ -28,4 +28,6 @@ vector split(const string &data, char c); bool isDigit(char c, uint8_t &result); -bool isDigit(char c); \ No newline at end of file +bool isDigit(char c); + +vector parseInts(const string &data); \ No newline at end of file