Advent of Code

Currently the yearly Advent of Code contest created by Eric Wastl is being held at adventofcode.com. That means the site is sprouting two daily programming challenges, until Christmas, to see who can solve them fastest. But it is not just about being fast of course, Advent of Code is a great way to improve your programming skills through daily clever puzzles. And because everyone gets the same puzzles it is also a great way to share and discuss results, and above all, learn.

Though I knew of Advent of Code, I hadn’t participated before, but it seems two days, and four puzzles later, I am sort of in.

Or at least, after only two days I am already fascinated by what I have seen, so I thought I’d share!

Fascinating findings

  • Python seems to be the most popular language, by far. At least judging by Github repo names, which is of course not an exact measure, but it is more or less an indicator, as a lot of people tend to share their solutions there. Python is popular, and it is not even close:

  • Browsing through the code, it once again becomes apparent that even with the exact same tools (e.g. Python) we all bring different experiences and education to the battle resulting in a colorful variation of solutions for the exact same puzzles. I’ve seen 100+ lines of Python code generate the exact same result as 10 lines. Nowhere is it more clear than a coding challenge that we are all unique individuals, and there is not a specific right way, as long as you get there (at least for the sake of this contest, don’t @ me).
  • If I had to guess I would have picked JavaScript to be the most popular language, but as you can see it comes in second. Ruby, Go and C# are also not surprising entries on this list, but Haskell and Elixir are (to me). These two functional languages seem to have quite a bit of buzz around them as people passionately seem to choose either one, which is interesting as I know very little about either. The creator of Elixir even participates himself in AoC! 
  • Very few people seem to pick PHP. Which I also find surprising, because gigantic parts of the web run PHP. But it seems to have little appeal when it comes to coding challenges?
  • Some people are fast, I mean really fast! Just look at the times on the leader board. Judging from these times, this means some people are able to read around 1000 words explaining a puzzle, and then coding up not one, but two solutions and submitting the correct answer in under four minutes!  I kid you not. This next person live-streamed it, and clocks in around 5 minutes (even without using the command-line shortcut CTRL-R), but it didn’t even put him in the top 20!

  • Of course you can use any language you like or even pen and paper, it is a puzzle after all. And people use some really crazy stuff, I love it. Anything goes (even Excel), and that is of course part of the goal of the contest: try to learn new things. There is one person who deliberately tried a new language for each challenge.

Notable entries

So it’s not all about speed, it’s also about trying new things. Here are some other unexpected examples.

    • Minecraft: This one takes the cake for me. See if you can wrap your head around what is happening here:

Learnings so far

So apart from the fascinating findings, I also got involved myself. I think because I solved the very first challenge with a simple AWK one-liner. But solving the followup challenge seemed trickier in AWK, though people seem to have done so (of course).

Being completely new to Python, and seeing how popular it is, I decided to give it a go, and I must say I think I understand a bit better now why and how Python is so popular. Yes, it is well known that it forces deliberately clean code but it also provides ways for incredibly succinct code (my favorite!). Because so far I have learned about map(), collections.counter, zip(), and cycle() Very handy, built-in functions and datatypes that I was unaware of, but which are incredibly powerful.

Some people tend to disagree (probably very few), as I found this comment on StackOverflow when researching the Counter dict.

I don’t think that’s fair, because in a sense every higher level programming language is an abstraction of differently expressed machine code. So unless you’re typing in machine code directly you are also using general purpose tools, and how narrow or general something is, who’s to say? And as long as it helps humans do things faster, programming languages are tools after all, I’m all for it. And let the computer worry about the zeros and ones.

I was very surprised and pleased with the mentioned Python functions. For example I brute-forced a solution in Bash which took probably more than 10 minutes to run, but ran in 0.07 seconds in only a couple of lines of Python. So of course the knowledge of the right functions and data structures once again proved to be the difference between 100 lines or 10, which reminded me of this quote of Linus Torvalds:

So that’s it and if you want to learn something new, go give it a try!

 


Also published on Medium.