Types and parsers, then using a library for the hard bit.
Diving into ST and monad loop control, all in the pursuit of speed
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