parent
002d023c65
commit
233addac52
2 changed files with 114 additions and 3 deletions
@ -1,9 +1,115 @@ |
|||||||
#include "Day14.h" |
#include "Day14.h" |
||||||
|
|
||||||
Result Day14::Task1() { |
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() { |
Result Day14::Task2() { |
||||||
return Day::Task2(); |
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; |
||||||
} |
} |
Loading…
Reference in new issue