JonathanGupton

Advent of Code 2024 - Day 01 - Python

Dec 1st, 2024
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.40 KB | None | 0 0
  1. from collections import Counter
  2. from pathlib import Path
  3. import re
  4.  
  5.  
  6. def get_data(filepath: Path) -> str:
  7.     with open(filepath, "r") as f:
  8.         data = f.read()
  9.     return data
  10.  
  11.  
  12. def parse_data(data: str) -> tuple[list[int], list[int]]:
  13.     l_vals, r_vals = [], []
  14.     for row in data.strip().split("\n"):
  15.         matches = re.match(r"(\d*)\s+(\d*)", row)
  16.         l_vals.append(int(matches.group(1)))
  17.         r_vals.append(int(matches.group(2)))
  18.     l_vals.sort()
  19.     r_vals.sort()
  20.     return l_vals, r_vals
  21.  
  22.  
  23. def difference_of_two_lists(list_a: list[int], list_b: list[int]) -> int:
  24.     dist = 0
  25.     for x, y in zip(list_a, list_b):
  26.         dist += abs(x - y)
  27.     return dist
  28.  
  29.  
  30. def calculate_similarity(list_a: list[int], weights: dict[int, int]) -> int:
  31.     similarity = 0
  32.     for n in list_a:
  33.         similarity += n * weights.get(n, 0)
  34.     return similarity
  35.  
  36.  
  37. def part_one():
  38.     fp = "data/day01.txt"
  39.     data_src = Path(fp)
  40.     data = get_data(data_src)
  41.     l_vals, r_vals = parse_data(data)
  42.     dist = difference_of_two_lists(l_vals, r_vals)
  43.     print(dist)
  44.  
  45.  
  46. def part_two():
  47.     fp = "data/day01.txt"
  48.     data_src = Path(fp)
  49.     data = get_data(data_src)
  50.     l_vals, r_vals = parse_data(data)
  51.     r_counts = Counter(r_vals)
  52.     similarity = calculate_similarity(l_vals, r_counts)
  53.     print(similarity)
  54.  
  55.  
  56.  
  57. if __name__ == '__main__':
  58.     part_one()
  59.     part_two()
Advertisement
Add Comment
Please, Sign In to add comment