diff options
author | June McEnroe <june@causal.agency> | 2020-12-10 00:45:17 -0500 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2020-12-10 00:45:17 -0500 |
commit | 997965d7a5a568820ec8af8d07788f3886022f1c (patch) | |
tree | 4e7a11d3db1dc727d88da0d67ed12a46d680e07e /2020 | |
parent | Solve day 10 part 1 (diff) | |
download | aoc-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.c | 14 |
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)); } |