Project website: Advent of Code 2017.
Previous years:
2015,
2016.
I use Perl for all the solutions.
Most assume the input data is in a file called input.txt
in the same
directory as the file. Some require extra modules from CPAN.
A note on scoring
I score my problems to mark where I’ve finished a solution myself or
given up and looked for hints. A score of 2 means I solved both the
daily problems myself, a score of 1 means I looked up a hint for one
of the problems, and a zero score means I didn’t solve any of the
problems myself.
The times are hours and minutes from the time of the puzzle release
(00:00 EST) until I posted an announcement on
Twitter.
My goals for this year (in descending order of priority):
- match or beat last year’s score of 49/50.
- solve all problems within 24 hours of release
- be among the first 750 on each day’s leaderboard
Final score
- Problems solved by myself: 47/50. Not really happy with this. I got caught up in the hunt for keeping my place on the local leaderboard, instead of taking the time to actually solve the problems.
- 3 parts not solved within 24 hours.
- Average finishing place: 1,801 for part 1, 2,151 for part 2.
Day 1 - Day 2 - Day 3 - Day 4 - Day 5 - Day 6 - Day 7 - Day 8 - Day 9 - Day 10 - Day 11 - Day 12 - Day 13 - Day 14 - Day 15 - Day 16 - Day 17 - Day 18 - Day 19 - Day 20 - Day 21 - Day 22 - Day 23 - Day 24 - Day 25
Day 1 - complete solution
A nice little warmup problem. Eric pulls his usual trick of making you
assume something in part 1 that you have to unassume in part 2.
Score: 2
Time: 47m
Leaderboard placement: 783 / 748
Day 2 - complete solution
My suspicion that there’s going to be a lot of functional list-munging
in this year’s edition is strengthening.
Score: 2
Time: 2h40m (it’s a Saturday, so I slept in!)
Leaderboard placement: 2,676 / 2,318
My solution for day 3: part 1, part 2
A nice headfake again. Of course you’re not going to brute-force the
spiral, keeping track of the coordinates for each element, then taking
the Manhattan distance of the element you want when you reach it!
Instead you use a solution from Project Euler to segment the
search space and find the solution nice and quick.
Then you get to part 2 and discover you need to generate the spiral
after all…
Score: 2
Time: 8h23m (first Advent Sunday, shopping for Christmas)
Leaderboard: 2,578 / 3,249
Day 4 - complete solution
A stark contrast to yesterday’s problem. Perl’s text processing
features usually make parsing input a breeze but in this case it was
almost too easy. I guess I have to be careful for what I wish for in
the future.
Score: 2
Time: 37m
Leaderboard: 1,544 / 1,314
Day 5 - complete solution
Ah, the list of instructions! An AoC classic.
Wise to previous problems I decided to incorporate test input from the
get-go, and to include a debug output. This was a nice addition for
part 2, as I could just run the test input and instantly confirm my
changes worked.
Runtime for part 2 is around 17.5s, which, as the answer is around 25M
steps leads to a “MIPS” value of 1.4.
Score: 2
Time: 41m
Leaderboard: 1,865 / 1,712
Day 6 - complete solution
I liked this puzzle, even if it was a bit on the easy side.
An interesting algorithm for detecting cycles was pointed out in the
daily solutions thread: Floyd’s Tortoise and
Hare. I don’t think it will give better
performance for the limited data set of the puzzle, but part of the
fun of AoC is learning new things.
TODO
If I get some time in the future I’d like to rework this problem using
an iterator for generate the states and using the Floyd algorithm.
Score: 2
Time: 51m
Leaderboard: 1,553 / 1,433
Day 7 - complete solution
I was sure my lack of CS knowledge would bite me, but after 10 hours
I’m not seeing any comments like “actually this is just algorithm X”
on the subreddit daily thread. I guess most people solved this like I
did.
A fun problem, all in all.
Score: 2
Time: 5h22m - solved part one before leaving for work, but part two was
delayed by meetings and a reinstalled work computer.
Leaderboard: 1,518 / 2,406
Day 8 - complete solution
As this is not my first register rodeo, I ran a quick check to make
sure the input values were what I expected (comparison operators,
whether a field was an integer or not). After that it was simply a
matter of encoding the rules.
I could have used Perl’s eval
to evaluate the expressions, but I’m
not 100% comfortable with it so I just used a giant if/else statement
instead.
I chose to write a specific function to read values from the register
hash, which made inserting a statement to capture part 2 very simple.
TODO
Implement using dispatch table?
Score: 2
Time: 1h15m
Leaderboard: 1,667 / 1,639
Day 9 - complete solution
This was a fun one!
After perusing other solutions for day 8 I decided to implement a
dispatch table for handling the characters. I’m glad I did because it
made adding further checks quite easy.
Part 2 threw me for a loop. I got the wrong answer for the number of
garbage characters, and trying to find where my assumptions were wrong
in the giant puzzle input felt impossible. However, there are a number
of example inputs, and after running my code on them I found where I
was mistaken…
Score: 2
Time: 5h35m (I’m not gonna get up at 6AM on a Saturday…)
Leaderboard: 2,604 / 2,850
My solution for day 10: part 1, part 2
Difficulty is ramping up.
The biggest issue I had with this was the @#%&*! array manipulation in
part 1.
Score: 2
Time: 5h09m
Leaderboard: 2,149 / 1,867
Day 11 - complete solution
A fun problem. I didn’t know anything about hex grids but like
everyone and their mom I googled and found this excellent
site that explains them
well.
Score: 2
Time: 1h02m
Leaderboard: 1,110 / 1,007
Day 12 - complete solution
I could probably have solved this in a more Perlish way but here I at
least understand what’s going on.
Score: 2
Time: 2h47m
Leaderboard: 2,108 / 2,038
My solution for day 13: part 1, part 2
This was the first problem that has a significant runtime (without
optimization). Even after some work I have a ~10m runtime for part 2.
TODO
Optimize for faster runtime.
Score: 2
Time: 13h23m
Leaderboard: 2,462 / 4,224
Day 14 - complete solution
A nice mix of difficulty and entertainment. Unreasonably proud of
independently finding the four-way flood fill algorithm.
Score: 2
Time: 4h51m
Leaderboard: 1,096 / 1,636
Day 15 - complete solution
Brute force, baby!
I used an iterator for part 2, then wrangled both solutions into one
using that technique.
The generators are well known.
Score: 2
Time: 3h06m
Leaderboard: 1,130 / 1,929
Day 16 - complete solution
After the usual struggles with Perl’s lists I got this working.
I decided to go with a dispatch table from the start, which made part
2 easier to implement.
Score: 2
Time: 4h34m
Leaderboard: 1,682 / 1,370
My solution for day 17: part 1, part 2
Solving part 1 gave some data for how to solve part 2. It took some
fiddling though!
Score: 2
Time: 8h52m
Leaderboard: 2,067 / 2,990
Day 18 — Duet
My solution for day 18: part 1, part 2
So far the most entertaining problem. Bravo!
Score: 2
Time: 4h33m
Leaderboard: 1,015 / 1,057
Day 19 - complete solution
This was supposed to be a “breather” problem, instead it stymied me
something fierce.
Score: 2
Time: 8h36m
Leaderboard: 2,744 / 2,688
My solution for day 20: part 1, part 2
Gratified to finally be among the first 1,000 to solve this problem, especially considering how relatively easy it was.
Update Day 20 - alternative part 1 - closed form
Score: 2
Time: 2h29m
Leaderboard: 913 / 984
Day 21 - complete solution
What a fiddly problem!
Score: 2
Time: > 24h
Leaderboard: 2,426 / 3,035
My solution for day 22: part 1, part 2
This puzzle is based on Langton’s ant which I’ve grappled with for Project Euler. I chose not to re-use any code though.
Runtime for part 2 is 31s which is just barely acceptable
Score: 2
Time: 2h47m
Leaderboard: 1,094 / 1,022
My solution for day 23: part 1, part 2
I had to give up on part 2, it wasn’t interesting enough to power
through. Credt for part 2 in source.
Score: 1
Time: 11h31m
Leaderboard: 1,287 / 1,826
Day 24 - complete solution
I just couldn’t get this to work so had to bail. Credit in source!
Score: 0
Time: >24h
Leaderboard: 3,057 / 3,012
Day 25 - complete solution
My solution runs in 30s which can surely be improved.
Score: 2 (really 1)
Time: 3h31m for part 1
Leaderboard: 1,197 / 2,340