Hacker News new | past | comments | ask | show | jobs | submit login
Advent of Code 2018 (adventofcode.com)
547 points by rauhl 5 months ago | hide | past | web | favorite | 94 comments

People have been interested in this in the past so I'll post it again: Peter Norvig's satisfying Jupyter notebook solutions from AoC 2016[0].


He also did one for 2017[0]. I imagine if he does this one it will end up in the same repo.

[0] https://github.com/norvig/pytudes/blob/master/ipynb/Advent%2...

Last year I created a visualization of our private leaderboard [1], but that required same manual work to update the ranking each day.

So for this year I've converted it to a browser extension, so it fetches the data automatically :) Available for both Firefox [2] and Chrome [3].

[1] https://github.com/amochtar/aoc-ranking [2] https://addons.mozilla.org/en-US/firefox/addon/aoc-ranking/ [3] https://chrome.google.com/webstore/detail/aoc-ranking/jbnlaf...

I'm exited to dust off my Elixir skills. Jose Valim (creator of the language) is going to stream solutions on Twitch on a one-day lag.

This is a really cool thing for Jose to do. It's a unique opportunity.

If you want to pair for fun, hit me up! I love Elixir, and it's probably my strongest language. Email in profile.

I'm really excited for this year's AoC, and trying to get other devs at my work involved too!

Last year I tried to solve at least the first few days in a bunch of different languages, doing Red/Green TDD so I could learn how to set up a basic project and do tests in languages I was less familiar with. Still trying to decide if I should take that approach again this year or focus on getting every day done in a single new language.

That's what I did too and my original plan was to use 25 different languages throughout the month. However as the puzzles got harder, I found there just wasn't enough time in the day. I'm sure the puzzles remain easy for some, but for me personally they got challenging even in the languages I already know.

I've participated in this the last couple years. It is really well done. The puzzles get progressively harder as the month goes on. I usually try to use a language im interested in but don't have a lot of experience with, but thats even more of a challenge and generally by the 15th or 20th im struggling to find enough time to complete the puzzles, but I try to go back and finish everything eventually. Always learn something new; theyre generally problems different from what I work on day to day.

this is what I like to do too.... it's quite nice for learning languages.

Not quite sure what language I'm going to do this year though

Forget the code challenges for a minute, and just look at that beautiful font and text-shadow combination on the logo.

To be honest that website looks very bad to me. Fonts are too thin and that makes the text quite difficult to read. Much more than e.g. HN. And that's in my desktop PC, in mobile I went directly to close the tab.

(Update) The "high contrast" CSS style they provide is more readable, but I'm sure it should be possible to create a dark style where readability doesn't suffer that much. That font is just not the best choice.

It really is a thin font, I've pinged the author on Twitter a couple of days ago.


I use Stylus with a set of rules to increase contrast and change the font. Just changing the font (with default weight 400) has a huge effect on legibility.

Stylus - https://add0n.com/stylus.html

Excited for this year's version. I did last year's event in OCaml which was a challenging, yet very rewarding experience. Still trying to decide what language to use this year.

This is my first year participating in AoC and I am going with Elixir. I think this will be a great experience as I can try solving the problem on my own and then watch Jose Valim's approach live on Twitch. Here is more information if you are interested: http://blog.plataformatec.com.br/2018/11/lets-learn-elixir-t...

I'm going to do Rust.

Yes, Rust is my other option I'm leaning towards. In process of learning it by building a ray tracer, so doing Advent of Code would be another way to get more familiar with it.

Gonna try using rust this year as well. I have no background in rust at all so I'm a bit excited for the extra experience of trying a new language.

gonna give Rust a try also

Interesting choice. What made you want to learn Ocaml?

Always had been fascinated with functional programming, but kept stumbling with Haskell. Discovered the Real World OCaml [0] book and was instantly hooked. Sadly haven't been able to use it much outside of last year's Advent of Code and a toy ray tracer.

[0] https://dev.realworldocaml.org/

Would be cool if they asked for information after you completed a puzzle for the day - scale of 10 how hard did you consider the puzzle, did you learn something new, what language did you use to complete it - would be super interesting data I bet.

Can you expound on that? What would you wish to know?

I think the three I mentioned would be a great place to start.

- On a scale of 1-10, 1 being you could do it with your eyes closed, 10 being you thought it was nearly impossible, how difficult was this puzzle for you?

- Did you learn something new because of this puzzle? Could be something about your language or a library or a new algorithm that helped you solve it.

- What language(s) did you use to solve this puzzle?

It could let you compare yourself with other developers - if you thought it was hard and most others didn't then you would know you might need to practice something more. It might be something that would best be combined with some profile level questions - like their experience level and primary languages that they use day to day.

It could tell us that people who used python found this particular puzzle easy (maybe because of some built in function in the stdlib) but people using some other language didn't.

Year over year it would be awesome to compare the languages that people use. Nobody is doing this for their job supposedly so these are either languages that people enjoy or find practical. I bet you'd find some correlations though too between language and how many puzzles they complete in a year - ie people using language x tend to finish the whole year but language y tend to drop off after day 10.

If you participated in previous editions, how much time did you have to dedicate each day, on average?

I've joined similar initiatives in the past, but I always end up giving up because of not being able to keep up the pace of sitting down _every_ day.

Yeah one could just solve the problems with some offset delay, or just skip all missed problems, but then it's not fun any more, and I'd wager that the same could be done any other time of the year too...

For others looking for their past year results, check out the URL: https://adventofcode.com/2017/leaderboard/self

Probably 15-20 minutes a day on average (edit: yep, my data from 2017 supports that), but with large spikes (and the average goes up towards the end of the month). (But I'm pretty quick — I was on the global leaderboard the last few years in a row.)

Edit: real numbers from 2017:

Excluding outliers and days I was absent at the start of the challenge: average 12.5 minutes for part 1 and 19.5 minutes for part 2.

Only excluding days where I was absent at the start of the challenge: average 16.25 minutes for part 1 and 23 minutes for part 2.

Edit2: 2016 was similar: 19-25 minutes excluding outliers, 23-35 minutes excluding days I missed the puzzle release by several hours.

If you're going for speed / leaderboard, Python is usually your best bet. Suggested libraries to be familiar with include:

stdlib: binascii, collections (especially defaultdict), fractions (gcd), itertools (combinations, combinations_with_replacement, permutations, product, izip, chain), md5, re, os/sys.

Non-std: networkx (graphs and shortest path), sympy (isprime()), numpy (efficient representation of large arrays).

It's useful to have a canned exhaustive tree search prepared (breadth/depth/"best"-first search).

You can use complex numbers to represent 2-dimensional coordinates and direction; turning the unit vector left and right involves multiplying by 1j and -1j, respectively, and movement is addition.

Oh, and sometimes pypy is faster enough that it can make a Python solution viable where otherwise it would have been too slow.

Well, I once spent about, oh, 6 hours writing and rewriting a solution and kept on getting the same wrong answer. Turned out I hadn't trimmed the input properly. Hey ho.

But, I'm slow, and I try to do it TDDish in a language I'm not so familiar with so there's that.

This year my aim is to finish all the problems by Nov 30th 2019 :) Even when I try go _as fast as I can_ (in ruby) I've only ever managed about 120th on the leaderboard. Now I just aim to have fun and learn as much as I can.

But to answer your actual question, if they're easy, within half an hour or less, hard ones, anywhere up to 5 or 6 hours (I'm slow, I'm OK with that :)

It varied a lot for me. The early ones I was generally able to do in 10 minutes or less. The middle ones generally took me 30-60 minutes - or I was blocked and it took me a lot longer. The later ones generally took an hour.

But - I wasn't just trying to solve them, I was also trying to write tests and refactoring when I was done - so ymmv. I also wasn't ever attempting to compete for the leaderboard.

I found foobar good for this reason... it's still time restricted but it's on your schedule not anyone else's. You get to choose when to start the next puzzle upon completing the current one - that said, the higher difficulty ones are on the order of weeks and those difficulty of puzzle can interfere with your work by filling your head.

Most problems are pretty quick to solve, maybe 30-60 minutes. Scheduling that time every day can be tough. Some problems are pretty tricky.

I still haven't solved all of 2017's, "some offset delay" indeed. I might not have solved all of 2016's for that matter - the closer it gets to Christmas, the less likely I am to touch a computer at all.

I have an hour-long train commute; I was able to solve most problems in that time.

they are not too bad, can get a bit more involved in the later stages ( I usually get too busy right before xmas and end up completing it after new year when I've got some time off), but I often use it as an opportunity ( like quite a few others here it seems ) to learn a new language so end up spending probably more time working out the language, because even if you solve it, you really want to make sure your code is idiomatic

I have been pretty interested in ReasonML / Ocaml lately, these puzzles are a great oppertunity to get to grips with the basics of a language.

Shamelessly plug, I created a repository for storing solution written on Sketch.sh here: https://github.com/Sketch-sh/advent-of-code-2018

Huh, that's cute :) I'm using AOC to learn Reason this year too

I'm thinking of using Red this year, although it might not be ready, depending on what kinds of problems come up. Otherwise it will "just" be Prolog again. :)

Discussion from last year's AoC: https://news.ycombinator.com/item?id=15813318

The 2017 edition was the first time I participated, and I severely underestimated how much fun it would be! Am participating (and to a much lesser degree competing) again this year :D

I got a bit too invested in this last year. I even did a write up of one of the tasks. That year I did it all using JS since it's easy to write input parsers with it. This year I'll be doing it in Rust to stretch myself a little.


Depending on your skills it may stretch you a lot. I did 2016 in rust and it was a battle, I knew relatively little beforehand.

2017 I solved in kotlin and got all the way to the end. I remember closing my laptop on Christmas Day and feeling elated/tired

Looking forward to completing this year! Normally I'd grab ruby or js, but been filling gaps using C lately and tempted to keep pushing that.

I vaguely remember hearing about this last year, and I'm really excited to try my hand at it this year. I initially taught myself Python doing daily coding challenges, but it's been over 4 years since I've done any. I'm debating trying my hand at learning a new language through this, possibly Nim or Rust, but we'll have to see if they start to get too tough.

I did the AoC last year for the first time and was amazed how quickly some participants solved the puzzles, e.g. < 60 seconds. (I wrote about my experience here: http://howtowriteaprogram.blogspot.com/2017/12/advent-of-cod...)

I'm one of the people who solved problems very quickly (3rd overall last year). I'm somewhat competitive by nature, and I did ACM programming challenges in undergrad (although I was never good enough to make the local team, heh). Happy to answer any questions you might have about "competitive" AoC; it's fun in a very different way than learning new languages for the competition. I personally used Python for the last few years, and I'll probably use it again this year (assuming I try to compete).

Part of it is familiarity with the format, which of course assumes they keep things reasonably similar this year. Knowing the kinds of problems that appear (parsing, graphs, optimization, reverse engineering, etc.) helped me put together a little library of code that means I'm not spending time rewriting fundamental algorithms.

Reading problem statements is one of those skills I picked up from ACM programming competitions. The problem statements usually contain a lot of fluff - to speed-code you want to be able to pluck out the relevant bits quickly so you can start formulating the solution.

For day 3 in 2017, the spiral. Were you just aware of this concept before hand?

I’m not OP, but if I were solving this I’d just take the smallest square less than that number, figure out where it is (the top left or bottom right corner), and then “run” the algorithm from there, which should only require one “turn” at the most. You really don’t need to know anything about spirals in particular; just look for a pattern that you can take advantage of to reduce your work.

You make it sound so easy. Part 2 was the real gnarly bit.

Anyway I’m sure I won’t ever encounter that spiral as long as I live but if I do, I have code prepped for it :D

Oh, I didn't see that. The Advent of Code website is strangely annoying in that it makes it extremely difficult to find past problems…

Based on what I found online (which is abridged rewordings of the problem, something of a sequence sum?) I'd get lazy at that point and implement something that makes the spiral. Presumably, this shouldn't take to long, as the sequence grows rapidly so they can't give us a number that's too big…

>extremely difficult to find past problems…

Huh? Click [Events], click on the year, click on the day.

The second (and sometimes much harder) part of each days problem is only revealed when you complete the first part.

I was not particularly fast that day. If I recall correctly, I just bruteforced it (implemented the four-turn logic). Not elegant but it runs fast enough :)

Me too, good to know ;)

Never rule out people cheating. Solving it on one account then doing it again in another account

That doesn't help - time is counted from midnight, so if you solve the problem on one account and then another, the second account will have a strictly worse time. About all it can really do is mess with the score distribution.

Also, the input data for each problem is randomized per user, so you really do need a proper programmatic solution (i.e. simply copying another person's answer is unlikely to work).

You could hurt other people's scores though right? Like if you and one other competitor traded wins on different days, but you had a second account that you posted the same solution to, your competitor would get third place on your winning days (and thus fewer points).

(Please don't do this!)

Aside from the other responses mentioning why cheating wouldn’t work, I don’t think it’s out of the question that people can solve these that quickly. The “trick”, from my experience, has been to quickly skim the problem, extract useful information (which you can “learn” to do if you do it enough), and try to figure out how to solve the problem while you are writing boilerplate to set up the problem. Using Python or a similarly high-level language often helps.

I vaguely remember something from last year or the year before one of them was pretty quick because I could just ask wolfram alpha to solve it:)

You cannot cheat that way. It tracks time since the question became live.

I love AoC and gladly donate to it :) I have been looking forward to it for some time now!

I have also made a discord bot to show the leaderboard, if anyone is interested : https://github.com/DylanMeeus/Advent_Of_Code_Bot

I'm stuck on question 1. As in "I don't think I understand the question"

Is there a list of frequencies I starring me in the face, that I am failing to see, which needs to apply to zero?

Am I supposed to suss out the pattern for how frequency change occur as a function of current frequency from the two examples?

You're not given frequencies, you're given offsets/errors which affect the overall drift.

If you sum all the numbers in your input do you get the right answer?

The last few years I used Go, but I’d like to learn Rust. This seems like a good excuse to dabble in a new language.

I am going to use this year similarly, but with Go and Lisp instead of Python and Haskell :)

It is such a fun way to pick up new langs

Here is my blog post for when I did this in D:


Hey, maybe it's an idea if everyone who plans to do the exercises in a specific language posts a link to a github repo? Then we could compare the solutions :)

You can check out last years challenges while you wait right now.


AZPCS is in full swing at the moment.


I’ve been wanting to learn scheme. I think this would be a good opportunity!

Question: should I go with Racket or Chicken Scheme?

I'm considering doing Racket because it has a lot of good resources for people who aren't necessarily experts in Scheme.

Coming across this for the first time, very cool!

Going to do this in Scala, if anybody wants to join my email is in my bio.

Is "Dec 1st midnight" at the beginning of the day or the end of the day?

The beginning of the day. The 2018 page [1] has a countdown which is currently at about 11 hours remaining.

[1]: https://adventofcode.com/2018

k/q programmers, unite!

How is it going? FOr advent 2018 I use scheme but after 4 stars I think that kdb+/q actually quite suitable for such kind of tasks (at least so far). I'm not very good at it but now I'm thinking about trying to redo the exercises in it.

I dig the little Easter egg. I don't remember that in previous years.

What's the Easter egg?

is there a way to get an email reminder to do the task every day?

Let writing an email reminder program be your Day 0 task for tomorrow ;)

Is it really that hard to provide an email based login?

I mean, it is additional work. Not only do you need to store the emails/passwords securely, which while it isn't _that_ hard, it is a needed consideration, but you also need to now:

- provide a password reset service

- find a way to send emails to this many people for low cost, it is a free service after all, so all of the confirmation/reset emails are an additional cost

- etc

Firebase has ergonomic free auth that does all this out of the box.

If you store an email, you're liable for GDPR controls, IIRC. Why expose yourself to that liability if you don't need to?

It'd be nice to have a no-login localstorage-based option. I guess you wouldn't get on the leaderboard, but does anything else need an identity?

ask for a refund

It would be cool if auth0 (https://auth0.com/) would offer free usage of their service, given the fact that they would only use basic features.


that's such a baseless accusation. I think it's more likely Eric just wanted to spend his time working on the problems and not setting up password resets and building forms.

Onec you implement your own Auth you are liable for the all the risks storing personal information comes with.

And accusing someone of storing personal data without any substance is something that I don't consider to be in the HN spirit.

Looks like a cool project.

I'm just curious about why this is billed as an Advent calendar, when really the only thing it has in common with an Advent calendar is that it terminates on Christmas.

Is there anything about it that has anything to do with Advent, i.e. the Christian liturgical season that precedes Christmas?

With an Advent calendar, you open a surprise, tiny gift every day of December until Christmas. With Advent of Code, you open a surprise, tiny code puzzle every day of December until Christmas.

It's a pretty common thing to call something "Advent of x" or "x Advent calendar" nowadays, if it involves something happening once each day between 1st and 25th of December. For example: https://24ways.org/

More here: https://www.creativebloq.com/web-design/advent-calendars-des...

Look at https://adventofcode.com/2015 :) A lovely Christmas tree!

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact