summary refs log tree commit diff homepage
path: root/2018
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2018-12-20 16:12:48 -0500
committerJune McEnroe <june@causal.agency>2018-12-20 16:12:48 -0500
commit18366944d0a3b4c0968a4ef098282cdf0bbeb0ad (patch)
tree82fb5637d91e536cf4eaba5ce003045f8c180fee /2018
parentSolve day 16 part 2 (diff)
downloadaoc-18366944d0a3b4c0968a4ef098282cdf0bbeb0ad.tar.gz
aoc-18366944d0a3b4c0968a4ef098282cdf0bbeb0ad.zip
Solve day 18 part 1
Diffstat (limited to '2018')
-rw-r--r--2018/day18.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/2018/day18.c b/2018/day18.c
new file mode 100644
index 0000000..686ae70
--- /dev/null
+++ b/2018/day18.c
@@ -0,0 +1,72 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef unsigned uint;
+
+struct Map {
+	char acres[50][50];
+};
+
+static uint adjacent(struct Map map, uint y, uint x, char type) {
+	uint count = 0;
+	if (y > 0) {
+		count += (type == map.acres[y - 1][x]);
+		if (x > 0)  count += (type == map.acres[y - 1][x - 1]);
+		if (x < 49) count += (type == map.acres[y - 1][x + 1]);
+	}
+	if (x > 0)  count += (type == map.acres[y][x - 1]);
+	if (x < 49) count += (type == map.acres[y][x + 1]);
+	if (y < 49) {
+		count += (type == map.acres[y + 1][x]);
+		if (x > 0)  count += (type == map.acres[y + 1][x - 1]);
+		if (x < 49) count += (type == map.acres[y + 1][x + 1]);
+	}
+	return count;
+}
+
+static struct Map step(struct Map prev) {
+	struct Map next;
+	for (uint y = 0; y < 50; ++y) {
+		for (uint x = 0; x < 50; ++x) {
+			if (prev.acres[y][x] == '.') {
+				if (adjacent(prev, y, x, '|') > 2) {
+					next.acres[y][x] = '|';
+				} else {
+					next.acres[y][x] = '.';
+				}
+			} else if (prev.acres[y][x] == '|') {
+				if (adjacent(prev, y, x, '#') > 2) {
+					next.acres[y][x] = '#';
+				} else {
+					next.acres[y][x] = '|';
+				}
+			} else {
+				if (adjacent(prev, y, x, '#') && adjacent(prev, y, x, '|')) {
+					next.acres[y][x] = '#';
+				} else {
+					next.acres[y][x] = '.';
+				}
+			}
+		}
+	}
+	return next;
+}
+
+int main(void) {
+	struct Map map;
+	for (uint y = 0; y < 50; ++y) {
+		scanf("%50c\n", map.acres[y]);
+	}
+
+	for (uint i = 0; i < 10; ++i) {
+		map = step(map);
+	}
+	uint wood = 0, lumber = 0;
+	for (uint y = 0; y < 50; ++y) {
+		for (uint x = 0; x < 50; ++x) {
+			if (map.acres[y][x] == '|') wood++;
+			if (map.acres[y][x] == '#') lumber++;
+		}
+	}
+	printf("%u\n", wood * lumber);
+}