2 title: "Advent of Code 2020"
6 Code to solve the [Advent of Code](http://adventofcode.com/2020/) puzzles. This year, I'm using the puzzles to develop my skills in [Haskell](https://wiki.haskell.org/Haskell). I'm writing up a [commentary on these puzzles and my solutions](https://work.njae.me.uk/tag/advent-of-code/) on my blog.
8 [Learn you a Haskell](http://learnyouahaskell.com/chapters), [Introduction to Haskell 98](https://www.haskell.org/tutorial/index.html), and [Hackage](https://hackage.haskell.org/) are good resources.
10 The [Stack documentation](https://docs.haskellstack.org/en/stable/README/) and [How I Start: Haskell](http://howistart.org/posts/haskell/1/) are good sources of using the tools.
15 I'm using the basic Haskell Platform installation, together with `stack` to manage the packages and dependencies (install with
17 $ sudo aptitude install haskell-platform haskell-stack
21 stack upgrade --binary-only
23 as the version in the Ubuntu repos is too old to work with current Haskell Stack package sets.
25 ## Creating the repository and project
26 Create the repository as normal: create the project in Gitolite, clone it, and insert the `.gitignore` and `README.md` files.
28 There's one package per day, with the code for each package in sub-directories of the root directory.
30 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`
33 stack new advent-of-code --bare simple
36 Modify the `stack.yaml` file as needed, such as adding the `ghc-options` stanza.
38 ## Creating subsequent days
40 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](https://github.com/mstksg/advent-of-code-2018).)
56 If you want to pass in additional RTS parameters, do it like this:
58 stack exec -- advent01 +RTS -K0 -RTS
61 Run interactively with
67 stack ghci advent01:exe:advent01
69 if the first form is ambiguous.
73 stack build --executable-profiling --library-profiling --ghc-options="-fprof-auto -rtsopts" advent01
77 stack exec --profile -- advent01 +RTS -p -hy
79 Generate the profile graph with
81 stack exec hp2ps advent01.hp
86 Stack is using the [14.16-lts resolver](https://www.stackage.org/lts-16.25) for packages, so make sure you read the [correct documentation for the packages included in it](https://www.stackage.org/lts-16.25/docs).
88 Packages I used a lot:
90 * [Containers](https://hackage.haskell.org/package/containers) (and some [better documentation](https://haskell-containers.readthedocs.io/en/latest/intro.html)); [Unordered containers](https://hackage.haskell.org/package/unordered-containers) is a mostly-equivalent alternative.
91 * [Attoparsec](https://hackage.haskell.org/package/attoparsec) (and [Megaparsec](https://hackage.haskell.org/package/megaparsec), and [ReadP](https://hackage.haskell.org/package/base-4.14.1.0/docs/Text-ParserCombinators-ReadP.html) once).
93 There are somewhat decent [tutorials on Megaparsec](https://markkarpov.com/tutorial/megaparsec.html) and [Attoparsec](https://www.schoolofhaskell.com/school/starting-with-haskell/libraries-and-frameworks/text-manipulation/attoparsec).
95 Packages I didn't use much, but need to remember:
97 * [Arithmoi](https://hackage.haskell.org/package/arithmoi) for number theory
98 * [Pointed List](https://hackage.haskell.org/package/pointedlist-0.6.1) for zipper lists (sometimes circular)
99 * [Vector](https://hackage.haskell.org/package/vector) for array-like things
100 * [Linear](https://hackage.haskell.org/package/linear) for coordinate-vector like things
101 * [Grid](https://hackage.haskell.org/package/grid) for 2-d grids
102 * [Graph-wrapper](https://hackage.haskell.org/package/graph-wrapper) for graphs
103 * [Lens](https://hackage.haskell.org/package/lens) (and a [summary of operators](https://github.com/ekmett/lens/wiki/Operators)). I didn't use these much this year, but did a lot last year.
104 * [RWS](https://hackage.haskell.org/package/mtl-2.2.2/docs/Control-Monad-RWS-Lazy.html) (Reader-Writer-State monad stack); again, used a lot last year but not this year
105 * [Monad loops](https://hackage.haskell.org/package/monad-loops-0.4.3/docs/Control-Monad-Loops.html), and [a description](https://conscientiousprogrammer.com/blog/2015/12/11/24-days-of-hackage-2015-day-11-monad-loops-avoiding-writing-recursive-functions-by-refactoring/)
106 * [Replace-Megaparsec](https://github.com/jamesdbrock/replace-megaparsec), for using Mpc for all sorts of things traditionally done with regex substitutions.
110 Build this readme file wth
112 pandoc -s README.md > README.html
115 (Using the [Modest style](https://github.com/markdowncss/modest).)