master
Benjamin Kraft 2 years ago
parent 002d023c65
commit 233addac52
  1. 112
      src/days/14/Day14.cpp
  2. 5
      src/days/14/Day14.h

@ -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;
}

@ -3,6 +3,11 @@
#include "../../Day.h"
class Day14 : public Day {
typedef pair<size_t, size_t> Point;
typedef map<Point, bool> Cave;
Cave parseCave(size_t&);
protected:
Result Task1() override;

Loading…
Cancel
Save