Matthew Butterick 023d056bc8 | 5 years ago | |
---|---|---|
.. | ||
01.rkt | 5 years ago | |
01.rktd | 5 years ago | |
02.rkt | 5 years ago | |
02.rktd | 5 years ago | |
03.rkt | 5 years ago | |
03.rktd | 5 years ago | |
04.rkt | 5 years ago | |
04.rktd | 5 years ago | |
05.rkt | 5 years ago | |
05.rktd | 5 years ago | |
06.rkt | 5 years ago | |
06.rktd | 5 years ago | |
07-gen.rkt | 5 years ago | |
07.rkt | 5 years ago | |
07.rktd | 5 years ago | |
08.rkt | 5 years ago | |
08.rktd | 5 years ago | |
09.rkt | 5 years ago | |
09.rktd | 5 years ago | |
10.rkt | 5 years ago | |
10.rktd | 5 years ago | |
11.rkt | 5 years ago | |
11.rktd | 5 years ago | |
12.rkt | 5 years ago | |
12.rktd | 5 years ago | |
13.rkt | 5 years ago | |
13.rktd | 5 years ago | |
14.rkt | 5 years ago | |
14.rktd | 5 years ago | |
README.md | 5 years ago |
README.md
MB’s Advent of Code tips
-
The problems are often designed around a particular computer-y abstraction. If you notice what the abstraction is, and then find the closest analog in Racket, the solution tends to come together quickly. Otherwise, you can spend a lot of time reinventing the wheel.
-
Complex numbers are a nice way of modeling two-dimensional positions.
-
Use lists whenever feasible, because there are many useful list functions in the Racket library that don’t have vector equivalents. In particular, these list functions are very useful, especially
argmin
andargmax
. -
Vectors are better than lists in situations where you need random access to members.
-
eq?
is the fastest equality check, but it only works for symbols and fixnums (therefore, use more symbols and fixnums so you can useeq?
!) -
match
is fantastic. -
Association lists (= lists of pairs) are underrated. They’re compatible with all the usual list functions, of course, but also dictionary forms (like
dict-ref
andin-dict
). -
The
graph
library can be helpful for graph-based problems. -
It’s good to know about sets and mutable pairs.
-
Also the fancier
for
iterators, likefor/first
andfor/or
. -
let/ec
is a way of jumping out of a deeply nested computation, akin to howreturn
works in other languages.
My solutions
-
I try to write solutions that are succinct but not cryptic.
-
I don’t optimize for speed.
-
I like doing the Advent of Code problems because it forces me to use parts of Racket that I don’t ordinarily use. So I treat it as a chance to expand my awareness of the Racketverse.
-
I’m unlikely to finish every problem. Judging by past years, there is a point where the problems get sufficiently complex that I’d rather put that time into improving my other Racket projects 🤘