From 14ff577615003c76c44eb5acaea05c2946cd6cbb Mon Sep 17 00:00:00 2001 From: Benjamin Kraft Date: Mon, 18 Dec 2023 13:44:55 +0100 Subject: [PATCH] Day 3 --- src/days/03/Day03.cpp | 99 +++++++++++++++++++++++++++++++++++++++++-- src/days/03/Day03.h | 3 ++ src/util.h | 14 ++++++ 3 files changed, 113 insertions(+), 3 deletions(-) diff --git a/src/days/03/Day03.cpp b/src/days/03/Day03.cpp index dad3568..fa36133 100644 --- a/src/days/03/Day03.cpp +++ b/src/days/03/Day03.cpp @@ -1,9 +1,102 @@ #include "Day03.h" Result Day03::Task1() { - return Day::Task1(); + uint32_t sum = 0; + + auto isSymbol = [this](int32_t x, int32_t y) -> bool { + if (x < 0 || x > input[0].length() - 1 || + y < 0 || y > input.size() - 1){ + return false; + } + char c = input[y][x]; + return !isDigit(c) && c != '.'; + }; + + for (const auto &[number, position] : parseEngineNumbers()){ + auto &[value, size] = number; + auto &[x, y] = position; + + bool symbolFound = false; + for (int32_t sx = x - 1; sx < x + size + 1; sx++){ + for (int32_t sy = y - 1; sy < y + 2; sy++){ + if (isSymbol(sx, sy)){ + symbolFound = true; + break; + } + } + } + if (symbolFound) + sum += value; + } + + return to_string(sum); } Result Day03::Task2() { - return Day::Task2(); -} \ No newline at end of file + uint32_t sum = 0; + + map, set> stars; + + auto isStar = [this](int32_t x, int32_t y) -> bool { + if (x < 0 || x > input[0].length() - 1 || + y < 0 || y > input.size() - 1){ + return false; + } + return input[y][x] == '*'; + }; + + for (const auto &[number, position] : parseEngineNumbers()){ + auto &[value, size] = number; + auto &[x, y] = position; + + for (int32_t sx = x - 1; sx < x + size + 1; sx++){ + for (int32_t sy = y - 1; sy < y + 2; sy++){ + if (isStar(sx, sy)){ + if (stars.contains({sx, sy})){ + stars[{sx, sy}].insert({number, position}); + } else { + stars[{sx, sy}] = {{number, position}}; + } + } + } + } + } + + for (auto &[position, numbers] : stars){ + if (numbers.size() == 2){ + sum += numbers.begin()->first.first * (++numbers.begin())->first.first; + } + } + + return to_string(sum); +} + +vector Day03::parseEngineNumbers() const { + vector numbers; + + for (size_t y = 0; y < input.size(); y++){ + const string& line = input[y]; + uint32_t value = 0; + uint8_t valueLength = 0; + bool readingValue = false; + + for (size_t x = 0; x < line.length(); x++){ + uint8_t digit; + if (isDigit(line[x], digit)){ + value = value * 10 + digit; + valueLength++; + readingValue = true; + if (x == line.length() - 1) + numbers.push_back({{value, valueLength}, {x - valueLength, y}}); + } else { + if (readingValue) + numbers.push_back({{value, valueLength}, {x - valueLength, y}}); + readingValue = false; + valueLength = 0; + value = 0; + } + } + } + + return numbers; +} diff --git a/src/days/03/Day03.h b/src/days/03/Day03.h index 0ff555a..3d98cdd 100644 --- a/src/days/03/Day03.h +++ b/src/days/03/Day03.h @@ -3,8 +3,11 @@ #include "../../Day.h" class Day03 : public Day { + typedef pair, pair> EngineNumber; protected: Result Task1() override; Result Task2() override; + + vector parseEngineNumbers() const; }; \ No newline at end of file diff --git a/src/util.h b/src/util.h index 12596ac..20c1636 100644 --- a/src/util.h +++ b/src/util.h @@ -39,4 +39,18 @@ inline void removeAll(string& data, const string& toRemove) { std::sort(indices.rbegin(), indices.rend()); for (size_t &i : indices) data.erase(i, toRemove.size()); +} + +inline bool isDigit(char c, uint8_t& result){ + auto val = c - '0'; + if (val >= 0 && val < 10){ + result = val; + return true; + } + return false; +} + +inline bool isDigit(char c){ + auto val = c - '0'; + return val >= 0 && val < 10; } \ No newline at end of file