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.
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.
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.
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
Stack is using the 14.16-lts resolver for packages, so make sure you read the correct documentation for the packages included in it.
When you use a new package, use
stack solver
to see how the stack.yaml
file needs to change, and
stack solver --update-yaml
to implement the changes.
Build this readme file wth
pandoc -s README.md > README.html
(Using the Modest style.)