Completed all puzzles on 2020-12-30
Project website: Advent of Code 2020.
Previous years: 2015, 2016, 2017, 2018. 2019.
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.
Ratings (new for 2020)
I’m giving each puzzle a subjective rating between 1 and 5. This is based on difficulty, “fiddliness” and how happy I am with my own solution.
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.
My goals for this year (in descending order of priority):
- get 40 stars or more (75%)
- solve all problems up until day 15 without any external input
- solve all problems within 24 hours of release
Final score: 48/50
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 - Report Repair
Not much to say about this. I used a hash to keep track of the “rest” of the values when comparing.
Apparently this (or at least part 2) is the 3SUM problem which is considered “hard”. I accidentally implemented the standard solution in part 1 so props for that I guess.
I still believe firing up the Perl interpreter and loading the actual file takes longer than just solving part 2 with two nested loops.
Beginning programmer example: loops and hashes/dicts/maps.
Puzzle rating: 3/5
Score: 2
Day 2 - Password Philosophy
Despite actually being awake and caffienated when the puzzle dropped, I still managed to mess this up. Extra annoying when it’s basically tailor-made for Perl.
Here’s a partial list
- messed up the initial regex
- assigned
$min
and$max
to the same value - messed up the comparison range in part 1
- off-by-one error in the indexing in part 2
- in part 2, tried to use the
sum()
function fromList::Utils
but forgot to use parentheses around the array
Beginning programmer example: parsing input, exclusive OR.
Puzzle rating: 3/5
Score: 2
Day 3 - Toboggan Trajectory
Day 3 - complete solution Day 3 - alternative solution
Veterans of previous AoC’s will get pathfinding flashbacks from this problem’s description, but it turns out it’s a bit simpler - as can be expected for day 3.
I decided before coding to not store the map explicitely as individual
coordinates, instead just storing the rows as a text string and
unpacking via split
when needed.
Another decision was to work with the test input first to confirm my algorithm. That way it would be easier to, for example, print out the rows in case I needed to visually debug.
Beginning programmer example: dealing with infinite repeats using mod.
Puzzle rating: 4/5
Score: 2
Day 4 - Passport Processing
This is a “M4P” problem - Made for Perl.
Nothing really to say about this. Set the $/
variable to an empty string to import the records as paragraphs.
I used a dispatch table to avoid a giant if/then/else statement.
Beginning programmer example: regexps! (and handling mult-line input).
Puzzle rating: 3/5
Score: 2
Day 5 - Binary Boarding
I have a massive binary blind spot, so I just knew there was going to be a CS-appropriate simple solution to this. But I just followed the instructions and got the right answer in the end anyway.
Beginning programmer example: binary.
Puzzle rating: 3/5
Score: 2
Day 6 - Custom Customs
Another easy problem, and during the weekend too! <anxiety intensifies>
My first stab at part 1 contained one specific data structure, that I had to tear out for part 2. After submitting the solution I realized the first solution could work for both.
Puzzle rating: 4/5
Score: 2
Day 7 - Handy Haversacks
As was expected, difficulty has ramped up a bit.
Can’t really explain what I did here … the main idea was using BFS to scan the “table”, but part 2 was basically me fiddling around with terms until the test cases passed.
Puzzle rating: 4/5
Score: 2
Day 8 - Handheld Halting
This year’s register rodeo, but with a fun twist.
Part 2 was solved by brute forcing every solution, it still took only ~0.3s to find the answer.
Puzzle rating: 4/5
Score: 2
Day 9 - Encoding Error
An ok puzzle. It pays to read what’s sought carefully…
Puzzle rating: 4/5
Score: 2
Day 10 - Adapter Array
This was a tough one! I was too impatient to really start to optimize after making a solution that solved the two example files, so I “cheated” and looked for inspiration. Full credit in source.
As a bonus I learned about postfix dereferencing in Perl.
Puzzle rating: 4/5
Score: 1.
Day 11 - Seating System
Day 11 - complete solution Day 11 - part 1 Day 11 - part 2
Ugh, got burned by Perl’s negative indices on arrays which messed up part 2. I rewrote it using hashrefs instead.
Puzzle rating: 2/5, mostly because we’ve seen this sort of puzzle before and I don’t enjoy them that much.
Score: 2
Day 12 - Rain Risk
Day 12 - complete solution Day 12 - part 1 Day 12 - part 2
A not too taxing problem.
I don’t like having to re-write the guts of part 1 to solve part 2, however.
Update: after some perusal of the subreddit I realized it was easy enough to run both solutions in one pass, so I rewrote part 2 to handle that.
Puzzle rating: 3/5.
Score: 2
Day 13 - Shuttle Search
A tough Sunday problem.
Everyone on the internet figured out that this was an implementation of the Chinese Remainder Theorem, but I followed the logic of a commenter on Reddit (credit in source) and I’m quite proud of the solution.
Puzzle rating: 4/5
Score: 2
Day 14 - Docking Data
Day 14 - complete solution Day 14 - part 1 Day 14 - part 2
A bit of a fiddly problem, which I solved by only dealing with strings and arrays. Bit manipulation is for CS weenies.
I got good help from today’s solutions megathread in the AoC subreddit.
Puzzle rating: 3/5
Score: 2
Day 15 - Rambunctious Recitation
Day 15 - part 1 Day 15 - part 2
This looked complicated at first glance but wasn’t hard to implement.
My part 1 code solves part 2, given a powerful enough computer (I had to use my Raspberry Pi 4). However it takes very long on my standard VPS, so I re-implemented a solution from /u/musifter on Reddit. Credit in source.
Puzzle rating: 3/5
Score: 2
Day 16 - Ticket Translation
I realized this was basically the same as 2018D16, but I had a hard time wrapping my head around how to lay out the gathering of required info. A bit of a slog.
Puzzle rating: 3/5
Score: 2
Day 17 - Conway Cubes
Day 17 - part 1 Day 17 - part 2
What if Conway’s game of life - but in more dimensions?!
Not too hard, but not too entertaining either.
Puzzle rating: 3/5
Score: 2
Day 18 - Operator Order
A CS staple. So I didn’t feel bad for googling “shunting-yard algorithm” and cribbing a solution from Rosettacode.org. Same for the RPN evaluation algorithm, but I found a much more straightforward implementation on Perlmonks. Credits in source.
I wonder how many CS grads nowadays have even seen a shunting-yard. The nerds in the MIT model railroad society had, of course, and Djikstra too.
Puzzle rating: 3/5
Score: 2
Day 19 - Monster Messages
For part 1, I tried using
Parse::RecDescent
and
managed to get a kludgy solution, but without really knowing what I
was doing.
Skipped part 2 for this one.
Puzzle rating: 3/5
Score: 1
Day 20 - Jurassic Jigsaw
This year’s most involved problem. In the end it’s not that difficult, but there are a lot of moving parts.
I’m happy that the code I wrote first (to manipulate grids for part 1) was useful for part 2 too.
Puzzle rating: 4/5
Score: 2
Day 21 - Allergen Assessment
Not my favorite puzzle this year. I had the right idea on how to go about it but had to look around for practical solutions.
Puzzle rating: 2/5, mostly because I’m cranky today.
Score: 2
Day 22 - Crab Combat
I took a “free card” for part 2 today. Credit in source.
Puzzle rating: 3/5
Score: 1
Day 23 - Crab Cups
Day 23 - part 1 Day 23 - part 2
Part one saw me getting very fiddly with splice
, an effort that was
not appropriate for part 2…
Score: 2
Day 24 - Lobby Layout
A fun little problem. I reused my hex grid logic from 2017D11 and the technique from this year’s day 17 to find the solution.
Puzzle rating: 4/5
Score: 2
Day 25 - Combo Breaker
Nice and simple Christmas day puzzle.
I love the denoument of our hero’s journey. Luckily for him, I don’t have all the stars, so I guess I’ll have to stay in the resort until I can finish all the puzzles!
Puzzle rating: 3/5
Score: 2