master
Benjamin Kraft 2 years ago
parent c092f805fe
commit 8178a8e7a3
  1. 94
      src/days/08/Day08.cpp
  2. 2
      src/days/08/Day08.h

@ -1,9 +1,97 @@
#include "Day08.h"
Result Day08::Task1() {
return Day::Task1();
size_t w, h;
vector<vector<int>> grid = parseGrid(w, h);
size_t count = w * 2 + (h - 2) * 2;
auto checkVisible = [grid, w, h](size_t rIdx, size_t cIdx) -> bool {
auto checkDir = [grid, w, h, rIdx, cIdx](int rV, int cV){
set<int> values;
if (rV != 0)
for (int rLook = int(rIdx) + rV; rLook >= 0 && rLook < h; rLook += rV)
values.insert(grid[rLook][cIdx]);
if (cV != 0)
for (int cLook = int(cIdx) + cV; cLook >= 0 && cLook < w; cLook += cV)
values.insert(grid[rIdx][cLook]);
return *std::max_element(values.begin(), values.end()) < grid[rIdx][cIdx];
};
return checkDir(1, 0) ||
checkDir(-1, 0) ||
checkDir(0, 1) ||
checkDir(0, -1);
};
for (size_t rIdx = 1; rIdx < h - 1; rIdx++)
for (size_t cIdx = 1; cIdx < w - 1; cIdx++)
if (checkVisible(rIdx, cIdx)) count++;
return to_string(count);
}
Result Day08::Task2() {
return Day::Task2();
}
size_t w, h;
vector<vector<int>> grid = parseGrid(w, h);
auto look = [grid, w, h](size_t rIdx, size_t cIdx, int rV, int cV){
int dist = 0;
if (cV != 0){
for (int cLook = int(cIdx) + cV; 0 <= cLook && cLook < w; cLook += cV){
dist++;
if (grid[rIdx][cLook] >= grid[rIdx][cIdx])
break;
}
}
if (rV != 0){
for (int rLook = int(rIdx) + rV; 0 <= rLook && rLook < h; rLook += rV){
dist++;
if (grid[rLook][cIdx] >= grid[rIdx][cIdx])
break;
}
}
return dist;
};
auto lookVertical = [look](size_t rIdx, size_t cIdx, int dir) -> int {
return look(rIdx, cIdx, dir, 0);
};
auto lookHorizontal = [look](size_t rIdx, size_t cIdx, int dir) -> int {
return look(rIdx, cIdx, 0, dir);
};
set<int> scores;
for (size_t rIdx = 1; rIdx < h - 1; rIdx++){
for (size_t cIdx = 1; cIdx < w - 1; cIdx++){
int up = lookVertical(rIdx, cIdx, -1);
int down = lookVertical(rIdx, cIdx, 1);
int left = lookHorizontal(rIdx, cIdx, -1);
int right = lookHorizontal(rIdx, cIdx, 1);
scores.insert(up * down * left * right);
}
}
int max = *std::max_element(scores.begin(), scores.end());
return to_string(max);
}
vector<vector<int>> Day08::parseGrid(size_t &w, size_t &h) {
vector<vector<int>> grid;
for (const string &line : input){
vector<int> row;
for (const char &item: line)
row.emplace_back(item - '0');
grid.push_back(row);
}
w = input[0].size();
h = input.size();
return grid;
}

@ -7,4 +7,6 @@ protected:
Result Task1() override;
Result Task2() override;
vector<vector<int>> parseGrid(size_t&, size_t&);
};
Loading…
Cancel
Save