Benjamin Kraft 9 months ago
parent ee36ea57db
commit 14ff577615
  1. 99
      src/days/03/Day03.cpp
  2. 3
      src/days/03/Day03.h
  3. 14
      src/util.h

@ -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();
}
uint32_t sum = 0;
map<pair<size_t, size_t>, set<EngineNumber>> 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::EngineNumber> Day03::parseEngineNumbers() const {
vector<EngineNumber> 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;
}

@ -3,8 +3,11 @@
#include "../../Day.h"
class Day03 : public Day {
typedef pair<pair<uint32_t, uint8_t>, pair<int32_t, int32_t>> EngineNumber;
protected:
Result Task1() override;
Result Task2() override;
vector<EngineNumber> parseEngineNumbers() const;
};

@ -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;
}
Loading…
Cancel
Save