parent
002d023c65
commit
233addac52
2 changed files with 114 additions and 3 deletions
@ -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(); |
||||
} |
||||
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