diff --git a/d4/main.cxx b/d4/main.cxx index b664657..65114e8 100644 --- a/d4/main.cxx +++ b/d4/main.cxx @@ -1,15 +1,122 @@ #include -#include +#include +#include using std::cout, std::endl; -int main() { - std::ifstream file{"../d4/input.txt"}; - std::string line; +constexpr const char content[] = { + #embed "input.txt" +}; - while (std::getline(file, line)) { - +int count_xmas(const std::vector &grid, int i, int j) { + + bool up{true}, down{true}, left{true}, right{true}, up_left{true}, up_right{true}, down_left{true}, down_right{true}; + for(auto d : {std::pair{1, 'M'}, std::pair{2, 'A'}, std::pair{3, 'S'}}) { + if(up && (i - d.first < 0 || grid[i - d.first][j] != d.second)) { + up = false; + } + + if(down && (i + d.first >= grid[i].size() || grid[i + d.first][j] != d.second)) { + down = false; + } + + if(right && (j + d.first >= grid[i].size() || grid[i][j + d.first] != d.second)) { + right = false; + } + + if(left && (j - d.first < 0 || grid[i][j - d.first] != d.second)) { + left = false; + } + + if(up_right && (i - d.first < 0 || j + d.first >= grid[i].size() || grid[i - d.first][j + d.first] != d.second)) { + up_right = false; + } + + if(up_left && (i - d.first < 0 || j - d.first < 0 || grid[i - d.first][j - d.first] != d.second)) { + up_left = false; + } + + if(down_right && (i + d.first >= grid[i].size() || j + d.first >= grid[i].size() || grid[i + d.first][j + d.first] != d.second)) { + down_right = false; + } + + if(down_left && (i + d.first >= grid[i].size() || j - d.first < 0 || grid[i + d.first][j - d.first] != d.second)) { + down_left = false; + } + } + + return up + down + left + right + up_left + up_right + down_left + down_right; +} + +void part_1() { + std::istringstream input_stream(content); + std::string line; + std::vector grid; + + while (std::getline(input_stream, line)) { + grid.push_back(line); + } + + int count_acc{0}; + for(int i = 0; i < grid.size(); i++) { + for(int j = 0; j < grid[i].size(); j++) { + if(grid[i][j] == 'X') { + count_acc += count_xmas(grid, i, j); + } + } + } + + cout << count_acc << endl; +} + + +bool is_mas_cross(const std::vector& grid, int i, int j) { + char up_right_letter, up_left_letter, down_right_letter, down_left_letter; + if(i - 1 >= 0 && j + 1 < grid[i].size() && (grid[i - 1][j + 1] == 'M' || grid[i - 1][j + 1] == 'S')) { + up_right_letter = grid[i - 1][j + 1]; + down_left_letter = up_right_letter == 'M' ? 'S' : 'M'; + } else { + return false; + } + if(i - 1 >= 0 && j - 1 >= 0 && (grid[i - 1][j - 1] == 'M' || grid[i - 1][j - 1] == 'S')) { + up_left_letter = grid[i - 1][j - 1]; + down_right_letter = up_left_letter == 'M' ? 'S' : 'M'; + } else { + return false; + } + if(i + 1 >= grid[i].size() || j + 1 >= grid[i].size() || grid[i + 1][j + 1] != down_right_letter) { + return false; + } + if(i + 1 >= grid[i].size() || j - 1 < 0 || grid[i + 1][j - 1] != down_left_letter) { + return false; } + return true; +} + +void part_2() { + std::istringstream input_stream(content); + std::string line; + std::vector grid; + + while (std::getline(input_stream, line)) { + grid.push_back(line); + } + + int count_acc{0}; + for(int i = 0; i < grid.size(); i++) { + for(int j = 0; j < grid[i].size(); j++) { + if(grid[i][j] == 'A') { + count_acc += is_mas_cross(grid, i, j); + } + } + } + + cout << count_acc << endl; +} + +int main() { + part_1(); + part_2(); return 0; }