My college freshman son and I competed in this year’s Advent of Code coding competition. It was a battle of youthful energy against wisdom & experience. I am somewhat chastened to report that we scored about the same.😅
My son used Python, and didn’t even use any of the fancier Python libraries or language techniques. He also eschewed the debugger, doing all his debugging using print() statements.
I used Swift & Xcode, and tended to use every feature of the language and libraries.
That we scored similarly probably shows that the two languages are evenly matched for the kinds of problems that were given in this contest.
The Advent of Code puzzles typically come in two parts: The first part is usually easier, the second part usually adds a twist that requires extending the original solution.
In looking back on the month, I think that, compared to my son, I typically over-engineered my solutions. I introduced enums and structs and helper functions where he used the built-in data types and copy-and-paste. This usually gave him a signficant edge on the time to solve the first, “easier” problem.
My over-engineering sometimes paid off. I usually had easier debugging (due to more typechecking), and sometimes it was easier to refactor my code for the “twist” in problem two. Plus occasionally having a compiled language helped. Althoght not that often. The AoC problems are designed to be solvable in short run times in Python, even on old hardware.
My edge, the reason that I was competitive, was that I have enough experience that I could usually figure out how to solve a given problem. In later days of the contest, when the problems got harder, I felt that this was an unfair advantage, so I would give my son a hint about what web searches to use to figure out a good way of approaching the problem.
Overall we had fun. Shout out to the excellent r/adventofcode subreddit. Each day, after we solved the puzzles ourselves, we would check in with the subreddit to see other solutions.
Improving my Swift skills
Using Swift to compete in AOC has encouraged me to explore parts of Swift that I hadn’t had a need to or chance to learn before.
- String processing, and the relationship between String, Substring, and Character.
- Regular expressions
map
,reduce
,filter
,forEach
,compactMap
and occasionalyflatMap
.- Classic Algorithms
- SIMD for points.
typealias
for briefer code.- Generics for reusable algorithms.
- NSCountedSet
ArraySlice
and the various Ranges.- Creating Sets and Dictionaries the functional way rather than imperatively.
- Identifiable, RawRepresentable, Hashable, CaseIterable, CustomStringConvertible.
- Sorting
- Using value types as much as possible.
Room for Improvement
Swift is a good language for coding contests. Certainly much less verbose than many other Java-like languages. However, there are still some speed-bumps compared to Python or F#.
- String processing is verbose.
- Regular expressions are very verbose.
- No automated synthesis of Comparable.
- Tuples can’t conform to Hashable, limiting their use as a general value type.
- The Swift standard library is missing many useful algorithms and collection classes.
- These can be added via third party libraries, but that takes time during a contest.
- The tradeoff between debug builds and release builds.
- Debug builds are slow.
- Release builds are difficult to debug.
Previous AoC contests
The old Advent of Code contests are all still “live”. You can’t get a timed score, but you can still enter and complete any contest.
I first did Advent of Code last year, but this year in addition to entering the 2020 contest I also completed all the earlier years’ contests. r/adventofcode was a handy resource for this task. There are archived posts for discussing the solutions to each day’s puzzles for every year’s contest.