summary refs log tree commit diff homepage
path: root/2020
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-12-10 00:45:17 -0500
committerJune McEnroe <june@causal.agency>2020-12-10 00:45:17 -0500
commit997965d7a5a568820ec8af8d07788f3886022f1c (patch)
tree4e7a11d3db1dc727d88da0d67ed12a46d680e07e /2020
parentSolve day 10 part 1 (diff)
downloadaoc-997965d7a5a568820ec8af8d07788f3886022f1c.tar.gz
aoc-997965d7a5a568820ec8af8d07788f3886022f1c.zip
Solve day 10 part 2
Much tougher than part 1. I got tripped up on using an int where I
needed a long again. That number is huge!
Diffstat (limited to '2020')
-rw-r--r--2020/day10.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/2020/day10.c b/2020/day10.c
index 789f2b1..261d96b 100644
--- a/2020/day10.c
+++ b/2020/day10.c
@@ -5,9 +5,18 @@ static int compar(const void *_a, const void *_b) {
 	const int *b = _b;
 	return *a - *b;
 }
+static int list[256];
+static int len;
+static long tail[256];
+static long chains(int i) {
+	if (i == len - 1) tail[i] = 1;
+	if (tail[i]) return tail[i];
+	for (int j = i + 1; j <= i + 3 && j < len; ++j) {
+		if (list[j] - list[i] <= 3) tail[i] += chains(j);
+	}
+	return tail[i];
+}
 int main(void) {
-	int list[256];
-	int len = 0;
 	while (EOF != scanf("%d\n", &list[len])) {
 		len++;
 	}
@@ -21,4 +30,5 @@ int main(void) {
 		if (list[i] - list[i-1] == 3) j3++;
 	}
 	printf("%d\n", j1 * j3);
+	printf("%ld\n", chains(0));
 }