Advent of Code 2023. Solutions in Julia.
(an idea copied from Fergus's Advent of Code 2023)
- 01: Can
matchregular expressions. - 02: A dictionary,
Dict, was helpful. - 03:
checkboundsto check array bounds. Can use∉which is nice. - 04: CSV reader has a boolean option
ignorerepeated. - 05: It can be annoying doing part A before part B - ha ha. Need to get better at using the "!" convention in function names that mutate their arguments. This one was tricky!
- 06: Shameless brute force solution as an antidote to 05. Used
replaceto get rid of the spaces. - 07: Sorting.
- 08: Mapping file didn't start at AAA.
lcm- yay! Andfalses. - 09:
pushfirst! - 10: Part A bit more awkward than anticipated. Part B forgot to replace the starting point when looking for enclosed spaces.
- 11:
reverse.countcan be used to count numberstrue's in an array. - 12: Strings are immutable. Who knew? Also
Threads.@threads(but don't need this with an efficient code!). Memoization. Lots to learn with this one! - 13:
transpose. - 14: Easy to be out of phase by ±1 if not careful.
- 15: Comprehensions and generators.
- 16:
countsyntax for counting elements in an array that satisfy some condition. - 17: Learn linear programming! JuMP. Tried lazy constraints which was an interesting exercise. However, redefining the nodes to have different directional states was a better approach and reduced the number of additional constraints.
- 18: Shoelace formula - wish I'd known about this before! "Obvious" result that makes the computation much easier.
parsecan takebaseargument. - 19:
eval(Meta.parse(expression)). Haven't done part B yet. - 20: Use arrays to "allow" mutable elements in dictionary.
- 21: I wonder what part B will bring. Ug - this one is tricky! Haven't done part B yet.
- 22: Intersections.
- 23: Part A took longer than expected given that code was recycled. Part B - need to eliminate sub-tours.
- 24: Overkill for part A but thought I'd investigate how to solve a set of linear equations in Julia. SciML/LinearSolve.jl. Also for part B, NonlinearSolve.jl, even though I didn't end up using this.