Advent of Code 2020

Code to solve the Advent of Code puzzles. This year, I’m using the puzzles to develop my skills in Haskell. I’m writing up a commentary on these puzzles and my solutions on my blog.

Learn you a Haskell, Introduction to Haskell 98, and Hackage are good resources.

The Stack documentation and How I Start: Haskell are good sources of using the tools.

Toolchain

I’m using the basic Haskell Platform installation, together with stack to manage the packages and dependencies (install with

$ sudo aptitude install haskell-platform haskell-stack

), then updgrade with

 stack upgrade --binary-only

as the version in the Ubuntu repos is too old to work with current Haskell Stack package sets.

Creating the repository and project

Create the repository as normal: create the project in Gitolite, clone it, and insert the .gitignore and README.md files.

There’s one package per day, with the code for each package in sub-directories of the root directory.

Create the basic stack project. This will create a new directory. Note that this new directory name can’t have a hyphen-delimited word that’s just digits, so the project will have to be advent-of-code

stack new advent-of-code --bare simple

Modify the stack.yaml file as needed, such as adding the ghc-options stanza.

Creating subsequent days

Each day lives in a separate directory, with its own package.yaml file and code in the src directory. (I based this configuration from mstksg’s setup.)

Compile with

stack build

or

stack build advent01

Run with

stack exec advent01

If you want to pass in additional RTS parameters, do it like this:

stack exec -- advent01 +RTS -K0 -RTS

Run interactively with

stack ghci advent01

or

stack ghci advent01:exe:advent01

if the first form is ambiguous.

To profile, use

stack build --executable-profiling --library-profiling --ghc-options="-fprof-auto -rtsopts" advent01

then run with

stack exec --profile -- advent01 +RTS -p -hy

Generate the profile graph with

stack exec hp2ps advent01.hp

Packages

Stack is using the 14.16-lts resolver for packages, so make sure you read the correct documentation for the packages included in it.

Readme

Build this readme file wth

pandoc -s README.md > README.html

(Using the Modest style.)