[go: up one dir, main page]

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2024-12-12 06:58:42 +0100
committerkdx <kikoodx@paranoici.org>2024-12-12 06:58:42 +0100
commita1805f7a1879b7a29dab7427d42451f0df28abb2 (patch)
tree23c11f219530ce3d6f7a35d3e13e76cf1ef7482c
parentb78cd13db05db22e0f73d8adce40aa2af61de918 (diff)
downloadaoc2024-main.tar.gz
-rw-r--r--12/main.cpp54
1 files changed, 32 insertions, 22 deletions
diff --git a/12/main.cpp b/12/main.cpp
index 87d0643..0c6745e 100644
--- a/12/main.cpp
+++ b/12/main.cpp
@@ -1,48 +1,57 @@
vector<string> lines;
int w, h;
-char get(int x, int y) {
+static char get(int x, int y) {
if (x < 0 || y < 0 || x >= w || y >= h)
return 0;
return lines[y][x];
}
-void set(int x, int y, char v) {
+static void set(int x, int y, char v) {
if (x < 0 || y < 0 || x >= w || y >= h)
return;
lines[y][x] = v;
}
-bool kind(int x, int y, char c) {
- return get(x, y) == c || get(x, y) == '.';
-}
-
-pair<int, int> extract(int x, int y, char c) {
+static int extract(int x, int y, char c) {
if (get(x, y) != c)
- return make_pair(0, 0);
+ return 0;
int area = 1;
- int perimeter = 0;
set(x, y, '.');
- perimeter += !kind(x - 1, y, c);
- perimeter += !kind(x + 1, y, c);
- perimeter += !kind(x, y - 1, c);
- perimeter += !kind(x, y + 1, c);
-#define X(OX,OY) \
- { \
- auto p = extract(x + OX, y + OY, c); \
- area += p.first; \
- perimeter += p.second; \
- }
+#define X(OX,OY) area += extract(x + OX, y + OY, c)
X(-1, 0);
X(1, 0);
X(0, -1);
X(0, 1);
#undef X
- return make_pair(area, perimeter);
+ return area;
+}
+
+static int csides() {
+ int sides = 0;
+#define X(OX, OY, A, B, C, D) \
+ for (auto A = 0; A < B; A++) { \
+ for (auto C = 0; C < D; C++) { \
+ bool side = false; \
+ for (;;) { \
+ if (get(x, y) != '.' || get(x + OX, y + OY) == '.') \
+ break; \
+ side = true; \
+ C += 1; \
+ } \
+ if (side) sides += 1; \
+ } \
+ }
+ X(0, 1, y, h, x, w);
+ X(0, -1, y, h, x, w);
+ X(1, 0, x, w, y, h);
+ X(-1, 0, x, w, y, h);
+#undef X
+ return sides;
}
int main() {
@@ -51,8 +60,9 @@ int main() {
for (auto y = 0; y < h; y++) {
for (auto x = 0; x < w; x++) {
if (!get(x, y)) continue;
- auto info = extract(x, y, get(x, y));
- result += info.first * info.second;
+ auto area = extract(x, y, get(x, y));
+ auto sides = csides();
+ result += area * sides;
for (auto &line : lines)
for (auto &c : line)
if (c == '.')