In this little series, I want to write about the thought processes I have behind solving the puzzles presented in Advent of Code.
During the Advent of Code small coding puzzles are presented with varying levels of difficulty. They're always Christmas-themed text puzzles where you help elves out of some mess to save the holidays. The puzzles are deliberately ambiguous to not bias puzzlers into a certain solution, they always have an example input in the text to explain some details and an input file for each day that comes in the form of a text file you can download. The solution is a simple number or a string you enter, which is checked by the website automatically. After you finish part 1, part 2 unlocks, which is a variation on part 2. This can be a little twist on part 1 or a large twist that changes the problem formulation into a problem that would take brute force solutions to compute longer than the heat death of the universe would take.
Find my solutions here: github.com/JesperDramsch/advent-of-code
Let's start with day 1, which is usually nice and easy. These descriptions won't be a perfect narrative, but rather how I think about these problems and where I see different solutions. I apologise for the possibility of rambling!
The example input
When you hear expert solvers, they will usually look at the example input first. I don't always do this, but here it was very obvious that those numbers would be grouped in some way:
1000 2000 3000 4000 5000 6000 7000 8000 9000 10000
We already know that we can split each group by
\n\n, but in my case I split all inputs by
\n by default in my utility data loader anyways.
Instead of splitting in two newlines, I decided to use a simple loop through the list of snacks, that would append the finalised sum to a list on an empty line.
for line in data: if line == "": elves.append(calories) calories = 0 else: calories += int(line)
That causes another problem, that your last sum is missed, so I decided to append an extra empty line to the data.
Alternatively, there would've been a nice way extracting the numbers with regex, for example that doesn't need a full Python loop.
The part 2 was fairly straightforward, since I already had a list of sums of calories.
So instead of
max() I could simply change to a
if part == 1: return max(day.data) if part == 2: return sum(sorted(day.data, reverse=True)[:3])
I decided to write an error log for my 2022 Advent of Code, but I only remembered on day 3.