diff --git a/2024/day-02/main.cpp b/2024/day-02/main.cpp index c218b71..2ac1e4a 100644 --- a/2024/day-02/main.cpp +++ b/2024/day-02/main.cpp @@ -17,22 +17,50 @@ void readInput(vector> &list) } } -int calculateNumberOfSafeReports(const vector> &list) +int getIndexOfUnsafeValue(const vector &report) +{ + const int MAX_SAFE_DIFFERENCE = 3; + + int directionOfChange = (report.front() < report.back()) ? 1 : -1; + for (size_t i = 0; i < report.size() - 1; i++) { + int levelDifference = (report[i + 1] - report[i]) * directionOfChange; + if (levelDifference <= 0 || levelDifference > MAX_SAFE_DIFFERENCE) { + return i; + } + } + + return -1; +} + +bool isSafeReport(const vector &report, const bool applyDampener) +{ + int indexOfUnsafeValue = getIndexOfUnsafeValue(report); + + if (indexOfUnsafeValue == -1) { + return true; + } + + if (!applyDampener) { + return false; + } + + vector tempReport = report; + int unsafeValue = report[indexOfUnsafeValue]; + tempReport.erase(tempReport.begin() + indexOfUnsafeValue); + if (getIndexOfUnsafeValue(tempReport) == -1) { + return true; + } + + tempReport.insert(tempReport.begin() + indexOfUnsafeValue, unsafeValue); + tempReport.erase(tempReport.begin() + indexOfUnsafeValue + 1); + return getIndexOfUnsafeValue(tempReport) == -1; +} + +int calculateNumberOfSafeReports(const vector> &list, const bool applyDampener) { int numberOfSafeReports = 0; - for (vector report : list) { - bool safe = true; - - int directionOfChange = (report[0] < report[1]) ? 1 : -1; - for (size_t i = 0; i < report.size() - 1; i++) { - int levelDifference = (report[i + 1] - report[i]) * directionOfChange; - - if (levelDifference <= 0 || levelDifference > 3) { - safe = false; - break; - } - } - numberOfSafeReports += safe; + for (const vector &report : list) { + numberOfSafeReports += isSafeReport(report, applyDampener); } return numberOfSafeReports; } @@ -43,5 +71,9 @@ int main() readInput(list); // Part one - cout << "Number of safe reports: " << calculateNumberOfSafeReports(list) << endl; + cout << "Number of safe reports: " << calculateNumberOfSafeReports(list, false) << endl; + + // Part two + cout << "Number of safe reports (when taking the dampener into account): " + << calculateNumberOfSafeReports(list, true) << endl; }