diff --git a/src/days/06/Day06.cpp b/src/days/06/Day06.cpp index 7b48c8f..8019275 100644 --- a/src/days/06/Day06.cpp +++ b/src/days/06/Day06.cpp @@ -1,9 +1,41 @@ #include "Day06.h" Result Day06::Task1() { - return Day::Task1(); + return to_string(findMarker(4)); } Result Day06::Task2() { - return Day::Task2(); -} \ No newline at end of file + return to_string(findMarker(14)); +} + +int Day06::findDuplicate(string value, char* dOut, int mSize) { + map charPos; + for (int i = 0; i < mSize; i++){ + char c = value[i]; + if (charPos.contains(c)){ + *dOut = c; + return charPos[c]; + } + charPos.insert({c, i}); + } + return -1; +} + +int Day06::findMarker(int markerSize) const{ + string signal = input[0]; + + int pos = 0; + do{ + string marker = signal.substr(pos, markerSize); + + char d; + int dPos = findDuplicate(marker, &d, markerSize); + if (dPos == -1) + return pos + markerSize; + + pos += dPos + 1; + } + while (pos < signal.size() - markerSize + 1); + + return -1; +} diff --git a/src/days/06/Day06.h b/src/days/06/Day06.h index 785fc5d..7da72f2 100644 --- a/src/days/06/Day06.h +++ b/src/days/06/Day06.h @@ -7,4 +7,7 @@ protected: Result Task1() override; Result Task2() override; + + static int findDuplicate(string, char*, int); + int findMarker(int markerSize) const; }; \ No newline at end of file diff --git a/src/util.h b/src/util.h index 1f24d6e..571d82e 100644 --- a/src/util.h +++ b/src/util.h @@ -6,7 +6,8 @@ #include #include #include +#include using std::stoi, std::to_string; using std::cout, std::endl; -using std::string, std::vector, std::set, std::pair; \ No newline at end of file +using std::string, std::vector, std::set, std::pair, std::map; \ No newline at end of file