diff --git a/aoc/03_part_2.cpp b/aoc/03_part_2.cpp new file mode 100644 index 0000000..06bf2f3 --- /dev/null +++ b/aoc/03_part_2.cpp @@ -0,0 +1,82 @@ +#include +#include +#include +#include + +// Advent of Code 2023, Day 3 Part 2 + +using namespace std; + +int main() { + ifstream input("input.txt"); + + vector lines; + + for (string line; getline(input, line);) { + lines.push_back("." + line + "."); + } + + map> gears; + + int sum = 0; + + for (int i = 0; i < lines.size(); i++) { + string beforeLine = i > 0 ? lines[i - 1] : ""; + string currentLine = lines[i]; + string nextLine = i > lines.size() ? "" : lines[i + 1]; + + bool buildMode = false; + string numberString; + + for (int charIndex = 0; charIndex < currentLine.size(); charIndex++) { + char current = currentLine[charIndex]; + + if (isdigit(current)) { + buildMode = true; + numberString.push_back(current); + continue; + } + + if (buildMode) { + cout << "checking " << numberString; + int start = charIndex - numberString.size() - 1; + + for (int numSize = start > 0 ? start : 0; numSize <= charIndex; numSize++) { + char currentBelow = i > 0 ? beforeLine[numSize] : '.'; + char currentNext = i > lines.size() - 2 && numSize > nextLine.size() ? '.' : nextLine[numSize]; + + bool isInCurrent = (numSize > currentLine.size() ? '.' : currentLine[numSize]) == '*'; + bool isInBelow = currentBelow == '*'; + bool isInNext = currentNext == '*'; + + if (isInCurrent || isInBelow || isInNext) { + int line = isInBelow ? i - 1 : isInNext ? i + 1 : i; + string gearId = to_string(line) + "-" + to_string(numSize); + gears[gearId].push_back(stoi(numberString)); + cout << " - adding as " << to_string(line) + "-" + to_string(numSize); + break; + } + } + + cout << "\n"; + + numberString = ""; + buildMode = false; + } + } + } + + for (const auto &item: gears) { + int temp = 1; + cout << "SEQUENCE " << item.first << endl; + if (item.second.size() != 2) continue; + for (const auto &gear: item.second) { + temp *= gear; + cout << " + " << gear; + } + cout << "\n"; + sum += temp; + } + + cout << "Sum: " << sum; +} \ No newline at end of file