Advent of Code 2024-Day 1: Historian Hysteria
from advent import ints, parse, Counter
left, right = zip(*parse(1, ints))
def part1():
return sum([ abs(l - r) for l, r in zip(sorted(left), sorted(right)) ])
def part2():
c = Counter(right)
return sum([ n * c[n] for n in left ])
# ---------------------------------------------------------------------------------------------
assert part1() == 1189304
assert part2() == 24349736
Parsing
The input for Day 1 consists of two columns of integers with each line containing an integer from the left column and one from the right column:
----------------------------------------------------------------------------------------------------
day01.txt ➜ 14000 chars, 1000 lines; first 7 lines:
----------------------------------------------------------------------------------------------------
58789 28882
27059 23721
86784 91527
72958 13217
95228 20832
77437 82573
33685 76537
----------------------------------------------------------------------------------------------------
parse(1) ➜ 1000 entries:
----------------------------------------------------------------------------------------------------
((58789, 28882), (27059, 23721), (86784, 91527), (72958, 13217), (9522 ... , 52806), (83116, 82954))
----------------------------------------------------------------------------------------------------
Above, we see that parse has parsed the input into a tuple of 2-tuples, with each 2-tuple containing
an integer from the left and right columns. Now we need to convert the parsed input from:
to:
We accomplish that on line 3 with zip(*((left1, right1), (left2, right2), ... , (leftN, rightN))). This is
a Python trick to essentially convert a list of rows into a list of columns. zip returns a tuple of two lists
which we unpack into left and right.
Part 1
The algorithm for part one is:
- Sort the left and right columns
- Compute the delta between each successive pair of numbers (left1, right1), (left2, right2), etc.
- Sum all of the deltas
Part 2
The algorithm for part two is:
- Count the number of occurrences of each integer in the right column
- For each integer in the left column, multiply the integer by the number of occurrences in the right column
- Sum all of those products
New Python Concepts
assertabs()Counterimportsorted()sum()zip()- List comprehensions
- Parallel assignment
- Unpacking with *
Conclusion
It's nice to warm up on these early, easy puzzles - much harder ones are sure to come!