#include #include #include #include enum Cucumber { NONE, RIGHT, DOWN, }; std::vector> getMap(const std::string &file_name) { std::ifstream file(file_name); std::vector> result{}; int tmp = 0; std::string str; while (std::getline(file, str)) { result.emplace_back(); for(auto &c : str) { switch(c) { case 'v': result.back().push_back(DOWN); break; case '>': result.back().push_back(RIGHT); break; default: result.back().push_back(NONE); break; } } } return result; } std::vector> createEmptyMap(size_t height, size_t width) { std::vector> res{}; res.resize(height); for(size_t i = 0; i < height; i++) { res[i].resize(width); for(size_t j = 0; j < width; j++) { res[i][j] = NONE; } } return res; } bool mapsAreEqual(const std::vector> &a, const std::vector> &b) { for(size_t i = 0; i < a.size(); i++) { for(size_t j = 0; j < a[0].size(); j++) { if(a[i][j] != b[i][j]) { return false; } } } return true; } void printMap(const std::vector> &input) { for(size_t i = 0; i < input.size(); i++) { for(size_t j = 0; j < input[0].size(); j++) { char print = '.'; switch(input[i][j]) { case DOWN: print = 'v'; break; case RIGHT: print = '>'; default: break; } std::cout << print; } std::cout << std::endl; } std::cout << std::endl; } uint64_t part1(const std::vector> &input) { auto cur_map = input; auto next_map = input; uint64_t rounds = 0; do { cur_map = next_map; next_map = createEmptyMap(cur_map.size(), cur_map[0].size()); rounds++; for(size_t i = 0; i < input.size(); i++) { for(size_t j = 0; j < input[0].size(); j++) { size_t next_i = i; size_t next_j = j; switch(cur_map[i][j]) { case RIGHT: next_j += 1; if(next_j >= cur_map[0].size()) { next_j = 0; } break; case DOWN: default: continue; break; } if(cur_map[next_i][next_j] == NONE) { next_map[next_i][next_j] = cur_map[i][j]; } else { next_map[i][j] = cur_map[i][j]; } } } for(size_t i = 0; i < input.size(); i++) { for(size_t j = 0; j < input[0].size(); j++) { size_t next_i = i; size_t next_j = j; switch(cur_map[i][j]) { case DOWN: next_i += 1; if(next_i >= cur_map.size()) { next_i = 0; } break; case RIGHT: default: continue; break; } if(cur_map[next_i][next_j] != DOWN && next_map[next_i][next_j] == NONE) { next_map[next_i][next_j] = cur_map[i][j]; } else { next_map[i][j] = cur_map[i][j]; } } } } while(!mapsAreEqual(cur_map, next_map)); return rounds; } int main(int argc, char **argv) { if (argc < 2) { std::cerr << "You must provide input file!" << std::endl; return 1; } auto map = getMap(argv[1]); std::cout << "The see cucumbers stop moving after \033[91;1m" << part1(map) << "\033[0m steps." << std::endl; return 0; }