summary refs log tree commit diff homepage
path: root/2021
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2021-12-05 11:55:04 -0500
committerJune McEnroe <june@causal.agency>2021-12-05 11:55:04 -0500
commit381a24b9cb0e1877d0cf33d216b4dfc24985e221 (patch)
tree9a827c1ec59f767bf6b2ceedd52c5e1f1d3b8232 /2021
parentSolve day 5 part 1 (diff)
downloadaoc-381a24b9cb0e1877d0cf33d216b4dfc24985e221.tar.gz
aoc-381a24b9cb0e1877d0cf33d216b4dfc24985e221.zip
Solve day 5 part 2
Diffstat (limited to '')
-rw-r--r--2021/day05.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/2021/day05.c b/2021/day05.c
index a51bfc0..93d6dfd 100644
--- a/2021/day05.c
+++ b/2021/day05.c
@@ -1,22 +1,22 @@
 #include <stdio.h>
 #include <stdlib.h>
-static void swap(int *x1, int *y1, int *x2, int *y2) {
-	int t = *x1;
-	*x1 = *x2;
-	*x2 = t;
-	t = *y1;
-	*y1 = *y2;
-	*y2 = t;
+static int sign(int x) {
+	return (x > 0 ? 1 : x < 0 ? -1 : 0);
 }
 int main(void) {
 	static int grid[1024][1024];
+	static int grid2[1024][1024];
 	int x1, y1, x2, y2;
 	while (4 == scanf("%d,%d -> %d,%d\n", &x1, &y1, &x2, &y2)) {
-		if (x1 != x2 && y1 != y2) continue;
-		if (x2 < x1 || y2 < y1) swap(&x1, &y1, &x2, &y2);
-		for (int y = y1; y <= y2; ++y)
-		for (int x = x1; x <= x2; ++x) {
-			grid[y][x]++;
+		int dx = sign(x2 - x1);
+		int dy = sign(y2 - y1);
+		for (
+			int y = y1, x = x1;
+			(dy > 0 ? y <= y2 : y >= y2) && (dx > 0 ? x <= x2 : x >= x2);
+			x += dx, y += dy
+		) {
+			if (x1 == x2 || y1 == y2) grid[y][x]++;
+			grid2[y][x]++;
 		}
 	}
 	int points = 0;
@@ -25,4 +25,10 @@ int main(void) {
 		if (grid[y][x] > 1) points++;
 	}
 	printf("%d\n", points);
+	points = 0;
+	for (int y = 0; y < 1024; ++y)
+	for (int x = 0; x < 1024; ++x) {
+		if (grid2[y][x] > 1) points++;
+	}
+	printf("%d\n", points);
 }