diff --git a/2023/3/main-1.cpp b/2023/3/main-1.cpp new file mode 100644 index 0000000..90fafd6 --- /dev/null +++ b/2023/3/main-1.cpp @@ -0,0 +1,62 @@ +#include +using namespace std; + +inline bool isDigit(char ch) { + return ch >= '0' && ch <= '9'; +} + +int main() { + ios::sync_with_stdio(0); + cin.tie(0); + + vector lines; + do { + string line; + getline(cin, line); + if (line.empty()) + break; + lines.push_back(line); + } while (!cin.eof()); + + int ret = 0; + + for (int r = 0; r < lines.size(); r++) { + auto& line = lines[r]; + int cend = line.size(); + for (int c = 0; c < cend; c++) { + char ch = line[c]; + if (ch == '.' || isDigit(ch)) + continue; + vector rs = {r}, cs = {c}; + if (r > 0) { + rs.push_back(r - 1); + if (r < lines.size() - 1) + rs.push_back(r + 1); + } + if (c > 0) { + cs.push_back(c - 1); + if (c < cend - 1) + cs.push_back(c + 1); + } + for (int rr : rs) { + for (int cc : cs) { + if (r == 0 && c == 0) + continue; + auto& lo = lines[rr]; + if (isDigit(lo[cc])) { + int ci = cc, cf = cc; + while (ci > 0 && isDigit(lo[ci - 1])) + ci--; + while (cf < cend - 1 && isDigit(lo[cf + 1])) + cf++; + ret += stoi(lo.substr(ci, cf - ci + 1)); + for (int i = ci; i <= cf; i++) + lo[i] = '.'; + } + } + } + } + } + + cout << ret << '\n'; +} diff --git a/2023/3/main-2.cpp b/2023/3/main-2.cpp new file mode 100644 index 0000000..290244a --- /dev/null +++ b/2023/3/main-2.cpp @@ -0,0 +1,69 @@ +#include +using namespace std; + +inline bool isDigit(char ch) { + return ch >= '0' && ch <= '9'; +} + +int main() { + ios::sync_with_stdio(0); + cin.tie(0); + + vector lines; + do { + string line; + getline(cin, line); + if (line.empty()) + break; + lines.push_back(line); + } while (!cin.eof()); + + int ret = 0; + + for (int r = 0; r < lines.size(); r++) { + auto& line = lines[r]; + int cend = line.size(); + for (int c = 0; c < cend; c++) { + char ch = line[c]; + if (ch != '*') + continue; + vector rs = {r}, cs = {c}; + if (r > 0) { + rs.push_back(r - 1); + if (r < lines.size() - 1) + rs.push_back(r + 1); + } + if (c > 0) { + cs.push_back(c - 1); + if (c < cend - 1) + cs.push_back(c + 1); + } + int p = 1; + int n = 0; + for (int rr : rs) { + for (int cc : cs) { + if (r == 0 && c == 0) + continue; + auto& lo = lines[rr]; + if (isDigit(lo[cc])) { + int ci = cc, cf = cc; + while (ci > 0 && isDigit(lo[ci - 1])) + ci--; + while (cf < cend - 1 && isDigit(lo[cf + 1])) + cf++; + p *= stoi(lo.substr(ci, cf - ci + 1)); + for (int i = ci; i <= cf; i++) + lo[i] = '.'; + if (++n > 2) + goto rrccend; + } + } + } + rrccend: + if (n == 2) + ret += p; + } + } + + cout << ret << '\n'; +}