Bit-twiddling, until it wasn't.
Reusing number theory
Day 12 was fairly straighforward: apply a bunch of rules to update a state. The two parts are so similar, I'll treat them together here. I started with some data definitions, for Directions,
Cellular automata, and being inefficient
Dynamic programming done quickly.
Playing to Haskell's strengths