#include #include #include #include using Grid = std::pair, std::vector>; std::vector parse(const char* file) { if (std::ifstream input{ file }; input.is_open()) { std::vector rows, cols; std::vector grids; std::string line; while (not std::getline(input,line).eof()) { if (cols.size() < line.size()) { cols.resize(line.size(), 0); } if (line.empty()) { grids.push_back(std::make_pair(std::move(cols), std::move(rows))); rows = cols = std::vector{}; continue; } int num{}; for (int i = 0; i < line.size(); ++i) { num *= 2; num += line[i] == '#'; cols[i] *= 2; cols[i] += line[i] == '#'; } rows.push_back(num); } grids.push_back(std::make_pair(std::move(cols), std::move(rows))); return grids; } return {}; } int find_symmetry(const std::vector& v) { for (int i = 1; i < v.size(); ++i) { if (v[i-1] == v[i]) { bool sim{true}; for (int j = 1; j < std::min(i, (int)v.size() - i); ++j) { sim = sim && v[i-1-j] == v[i+j]; } if (sim) return i; } } return 0; } int main(int argc, char* argv[]) { int answer{}; for (const auto& grid : parse(argv[1])) { answer += find_symmetry(grid.first); answer += 100 * find_symmetry(grid.second); } std::cout << answer << std::endl; return 0; }