diff options
author | June McEnroe <june@causal.agency> | 2018-12-12 01:05:33 -0500 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2018-12-12 01:05:33 -0500 |
commit | 81f098bcb8b58f0a0d803f3e32e252f72217da3d (patch) | |
tree | e025092f4ea94780254d7f29c34fa5466e4078a2 /2018 | |
parent | Solve day 11 part 2 (diff) | |
download | aoc-81f098bcb8b58f0a0d803f3e32e252f72217da3d.tar.gz aoc-81f098bcb8b58f0a0d803f3e32e252f72217da3d.zip |
Solve day 12 part 1
Diffstat (limited to '')
-rw-r--r-- | 2018/day12.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/2018/day12.c b/2018/day12.c new file mode 100644 index 0000000..5f2f04e --- /dev/null +++ b/2018/day12.c @@ -0,0 +1,50 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +typedef unsigned uint; + +enum { Zero = 128, Len = Zero * 2 }; +struct State { + char pots[Len]; +}; + +struct Rule { + char pots[5]; + char next; +}; + +int main() { + struct State state; + memset(state.pots, '.', Len); + scanf("initial state: %s\n\n", &state.pots[Zero]); + for (uint i = 0; i < Len; ++i) { + if (!state.pots[i]) state.pots[i] = '.'; + } + + uint rulen = 0; + struct Rule rules[32]; + while (!feof(stdin)) { + scanf("%5c => %c\n", rules[rulen].pots, &rules[rulen].next); + rulen++; + } + + for (uint g = 0; g < 20; ++g) { + struct State next; + memset(next.pots, '.', Len); + for (uint i = 2; i < Len - 2; ++i) { + for (uint r = 0; r < rulen; ++r) { + if (memcmp(&state.pots[i - 2], rules[r].pots, 5)) continue; + next.pots[i] = rules[r].next; + break; + } + } + state = next; + } + + int sum = 0; + for (int i = 0; i < Len; ++i) { + if (state.pots[i] == '#') sum += i - Zero; + } + printf("%d\n", sum); +} |