From b0b506d60c38e4f6548eaa220c7bbb91d17e6f53 Mon Sep 17 00:00:00 2001 From: Benjamin Kraft Date: Sun, 4 Dec 2022 11:51:07 +0100 Subject: [PATCH] Day04 --- src/days/04/Day04.cpp | 55 ++++++++++++++++++++++++++++++++++++++++--- src/days/04/Day04.h | 8 +++++++ src/util.h | 2 +- 3 files changed, 61 insertions(+), 4 deletions(-) diff --git a/src/days/04/Day04.cpp b/src/days/04/Day04.cpp index 4943015..1a54055 100644 --- a/src/days/04/Day04.cpp +++ b/src/days/04/Day04.cpp @@ -1,9 +1,58 @@ #include "Day04.h" Result Day04::Task1() { - return Day::Task1(); + int count = 0; + for (const RangePair &pair : parse()){ + const Range range1 = pair.first; + const Range range2 = pair.second; + + if (contains(range1, range2) || contains(range2, range1)) + count++; + } + + return to_string(count); } Result Day04::Task2() { - return Day::Task2(); -} \ No newline at end of file + int count = 0; + for (const RangePair &pair : parse()){ + const Range range1 = pair.first; + const Range range2 = pair.second; + + if (overlap(range1, range2)) + count++; + } + + return to_string(count); +} + +bool Day04::contains(Range outer, Range inner) { + return outer.first <= inner.first && outer.second >= inner.second; +} + +bool Day04::overlap(Range r1, Range r2) { + bool R1LeftFromR2 = r1.first < r2.first && r1.second < r2.first; + bool R2LeftFromR1 = r2.first < r1.first && r2.second < r1.first; + return !(R1LeftFromR2 || R2LeftFromR1); +} + +vector Day04::parse() const { + vector parsed; + for (const string &line : input){ + const size_t comma = line.find(','); + const string range1 = line.substr(0, comma); + const string range2 = line.substr(comma + 1); + + const size_t dash1 = range1.find('-'); + const size_t dash2 = range2.find('-'); + + const int p1n1 = stoi(range1.substr(0, dash1)); + const int p1n2 = stoi(range1.substr(dash1 + 1)); + + const int p2n1 = stoi(range2.substr(0, dash2)); + const int p2n2 = stoi(range2.substr(dash2 + 1)); + + parsed.emplace_back(Range(p1n1, p1n2), Range(p2n1, p2n2)); + } + return parsed; +} diff --git a/src/days/04/Day04.h b/src/days/04/Day04.h index 8c26982..4203654 100644 --- a/src/days/04/Day04.h +++ b/src/days/04/Day04.h @@ -2,9 +2,17 @@ #include "../../Day.h" +typedef pair Range; +typedef pair RangePair; + class Day04 : public Day { protected: Result Task1() override; Result Task2() override; + + vector parse() const; + + static bool contains(Range, Range); + static bool overlap(Range, Range); }; \ No newline at end of file diff --git a/src/util.h b/src/util.h index ff8d543..1f24d6e 100644 --- a/src/util.h +++ b/src/util.h @@ -9,4 +9,4 @@ using std::stoi, std::to_string; using std::cout, std::endl; -using std::string, std::vector, std::set; \ No newline at end of file +using std::string, std::vector, std::set, std::pair; \ No newline at end of file