1c6a5d4af3b3be64c8e9a9c71ede59bac3fc73d3
[advent-of-code-20.git] / README.md
1 ---
2 title: "Advent of Code 2019"
3 output: html_document
4 css: modest.css
5 ---
6 Code to solve the [Advent of Code](http://adventofcode.com/2019/) 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.
7
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.
9
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.
11
12 # Toolchain
13
14 I'm using the basic Haskell Platform installation, together with `stack` to manage the packages and dependencies (install with
15 ```
16 $ sudo aptitude install haskell-platform haskell-stack
17 ```
18 ), then updgrade with
19 ```
20 stack upgrade --binary-only
21 ```
22 as the version in the Ubuntu repos is too old to work with current Haskell Stack package sets.
23
24 ## Creating the repository and project
25 Create the repository as normal: create the project in Gitolite, clone it, and insert the `.gitignore` and `README.md` files.
26
27 There's one package per day, with the code for each package in sub-directories of the root directory.
28
29 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`
30
31 ```
32 stack new advent-of-code --bare simple
33 ```
34
35 Modify the `stack.yaml` file as needed, such as adding the `ghc-options` stanza.
36
37 ## Creating subsequent days
38
39 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).)
40
41 Compile with
42 ```
43 stack build
44 ```
45 or
46 ```
47 stack build advent01
48 ```
49
50 Run with
51 ```
52 stack exec advent01
53 ```
54
55 If you want to pass in additional RTS parameters, do it like this:
56 ```
57 stack exec -- advent01 +RTS -K0 -RTS
58 ```
59
60 Run interactively with
61 ```
62 stack ghci advent01
63 ```
64 or
65 ```
66 stack ghci advent01:exe:advent01
67 ```
68 if the first form is ambiguous.
69
70 To profile, use
71 ```
72 stack build --executable-profiling --library-profiling --ghc-options="-fprof-auto -rtsopts" advent01
73 ```
74 then run with
75 ```
76 stack exec --profile -- advent01 +RTS -p -hy
77 ```
78 Generate the profile graph with
79 ```
80 stack exec hp2ps advent01.hp
81 ```
82
83 # Packages
84
85 Stack is using the [14.16-lts resolver](https://www.stackage.org/lts-14.16) for packages, so make sure you read the [correct documentation for the packages included in it](https://www.stackage.org/lts-14.16/docs).
86
87 When you use a new package, use
88
89 ```
90 stack solver
91 ```
92 to see how the `stack.yaml` file needs to change, and
93 ```
94 stack solver --update-yaml
95 ```
96 to implement the changes.
97
98 # Readme
99
100 Build this readme file wth
101 ```
102 pandoc -s README.md > README.html
103 ```
104
105 (Using the [Modest style](https://github.com/markdowncss/modest).)