#include #include #include #include #include #include #include #include #include #include #include using namespace aocpp; namespace { using Dir = Coord(*)(Coord); Dir directions[4] {Up, Down, Left, Right}; auto Part1(Grid const& grid) -> std::int64_t { std::int64_t result {0}; for (auto [c, v] : grid) { result += std::any_of( std::begin(directions), std::end(directions), [&](Dir const dir) { for (auto x = dir(c); grid.contains(x); x = dir(x)) { if (grid[x] >= v) { return false; } } return true; }); } return result; } auto Part2(Grid const& grid) -> std::int64_t { std::int64_t result {0}; for (auto [c, v] : grid) { auto score = std::transform_reduce( std::begin(directions), std::end(directions), std::int64_t{1}, std::multiplies(), // product [&](Dir const dir) { std::int64_t count {0}; for (auto x = dir(c); grid.contains(x); x = dir(x)) { count++; if (grid[x] >= v) break; } return count; }); if (result < score) result = score; } return result; } } // namespace TEST_SUITE("2022-08 examples") { TEST_CASE("example") { std::istringstream in { "30373\n" "25512\n" "65332\n" "33549\n" "35390\n"}; auto grid = aocpp::Grid::Parse(in); CHECK(Part1(grid) == 21); CHECK(Part2(grid) == 8); } } auto Main(std::istream & in, std::ostream & out) -> void { auto const grid = Grid::Parse(in); out << "Part 1: " << Part1(grid) << std::endl; out << "Part 2: " << Part2(grid) << std::endl; }