From 233addac521b60dedad512ed856d271b20b14670 Mon Sep 17 00:00:00 2001 From: Benjamin Kraft Date: Wed, 14 Dec 2022 10:08:40 +0100 Subject: [PATCH] Day14 --- src/days/14/Day14.cpp | 112 ++++++++++++++++++++++++++++++++++++++++-- src/days/14/Day14.h | 5 ++ 2 files changed, 114 insertions(+), 3 deletions(-) diff --git a/src/days/14/Day14.cpp b/src/days/14/Day14.cpp index 89e4558..ce7df3e 100644 --- a/src/days/14/Day14.cpp +++ b/src/days/14/Day14.cpp @@ -1,9 +1,115 @@ #include "Day14.h" Result Day14::Task1() { - return Day::Task1(); + size_t lowestY; + Cave cave = parseCave(lowestY); + + uint64 sandUnits = 0; + Point start = {500, 0}; + while (true){ + Point pos = start; + while (true){ + if (cave[{pos.first, pos.second + 1}]){ + if (cave[{pos.first - 1, pos.second + 1}]){ + if (cave[{pos.first + 1, pos.second + 1}]){ + cave[{pos}] = true; + break; + } else { + pos.first++; + pos.second++; + } + } else { + pos.first--; + pos.second++; + } + } else { + pos.second++; + } + if (pos.second > lowestY) + break; + } + if (pos.second > lowestY) + break; + + sandUnits++; + } + + return to_string(sandUnits); } Result Day14::Task2() { - return Day::Task2(); -} \ No newline at end of file + size_t lowestY; + Cave cave = parseCave(lowestY); + lowestY += 2; + + uint64 sandUnits = 0; + Point start = {500, 0}; + while (true){ + Point pos = start; + while (true){ + if (pos.second + 1 == lowestY){ + cave[pos] = true; + break; + } + if (cave[{pos.first, pos.second + 1}]){ + if (cave[{pos.first - 1, pos.second + 1}]){ + if (cave[{pos.first + 1, pos.second + 1}]){ + cave[{pos}] = true; + break; + } else { + pos.first++; + pos.second++; + } + } else { + pos.first--; + pos.second++; + } + } else { + pos.second++; + } + } + sandUnits++; + + if (pos == start) + break; + } + + return to_string(sandUnits); +} + +Day14::Cave Day14::parseCave(size_t &low) { + Cave cave; + low = 0; + + for (const string &line : input){ + size_t pos = 0; + size_t lastX, lastY; + while (pos < line.size()){ + size_t commaPos = line.find(',', pos); + size_t minusPos = line.find('-', pos); + size_t newX = stoi(line.substr(pos, commaPos - pos)); + size_t newY = stoi(line.substr(commaPos + 1, minusPos - 2 - commaPos)); + if (minusPos == string::npos){ + newY = stoi(line.substr(commaPos + 1)); + minusPos = line.size(); + } + + using std::min, std::max; + if (pos > 0){ + for (size_t x = min(lastX, newX); x <= max(lastX, newX); x++) + for (size_t y = min(lastY, newY); y <= max(lastY, newY); y++) + cave[{x, y}] = true; + } + + if (newY > low) + low = newY; + + lastX = newX; + lastY = newY; + + pos = minusPos + 3; + } + } + + return cave; +} diff --git a/src/days/14/Day14.h b/src/days/14/Day14.h index cc9cd29..fec9315 100644 --- a/src/days/14/Day14.h +++ b/src/days/14/Day14.h @@ -3,6 +3,11 @@ #include "../../Day.h" class Day14 : public Day { + + typedef pair Point; + typedef map Cave; + Cave parseCave(size_t&); + protected: Result Task1() override;