JonathanGupton

Advent of Code 2024 - Day 02 - Python

Dec 2nd, 2024
256
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.04 KB | None | 0 0
  1. from pathlib import Path
  2.  
  3.  
  4. def get_data(filepath: Path) -> str:
  5.     with open(filepath, "r") as f:
  6.         data = f.read()
  7.     return data
  8.  
  9.  
  10. def parse_data(data: str) -> list[list[int]]:
  11.     output = []
  12.     for row in data.strip().split("\n"):
  13.         output.append(list(map(int, row.split())))
  14.     return output
  15.  
  16.  
  17. def is_part_a_safe(row) -> bool:
  18.     asc = row[0] < row[1]
  19.     for i, n in enumerate(row[1:], start=1):
  20.         diff = abs(n - row[i - 1])
  21.         if (diff >= 4) or (diff == 0):
  22.             return False
  23.         if asc:
  24.             if row[i - 1] > n:
  25.                 return False
  26.         else:
  27.             if row[i - 1] < n:
  28.                 return False
  29.     return True
  30.  
  31.  
  32. def is_safe_removing_one_level(row) -> bool:
  33.     for i in range(len(row)):
  34.         new_row = row[:i] + row[i + 1:]
  35.         if is_part_a_safe(new_row):
  36.             return True
  37.     return False
  38.  
  39.  
  40. def part_a_example_1():
  41.     ex1 = Path(r"example/day02-example-01.txt")
  42.     data_str = get_data(ex1)
  43.     data = parse_data(data_str)
  44.     safe = 0
  45.     for r in data:
  46.         if is_part_a_safe(r):
  47.             safe += 1
  48.     print(safe)
  49.  
  50.  
  51. def part_b_example_1():
  52.     ex1 = Path(r"example/day02-example-01.txt")
  53.     data_str = get_data(ex1)
  54.     data = parse_data(data_str)
  55.     safe = 0
  56.     for r in data:
  57.         if is_part_a_safe(r):
  58.             safe += 1
  59.         else:
  60.             if is_safe_removing_one_level(r):
  61.                 safe += 1
  62.     print(safe)
  63.  
  64.  
  65. def part_a():
  66.     fp = Path(r"data/day02.txt")
  67.     data_str = get_data(fp)
  68.     data = parse_data(data_str)
  69.     safe = 0
  70.     for r in data:
  71.         if is_part_a_safe(r):
  72.             safe += 1
  73.     print(safe)
  74.  
  75.  
  76. def part_b():
  77.     fp = Path(r"data/day02.txt")
  78.     data_str = get_data(fp)
  79.     data = parse_data(data_str)
  80.     safe = 0
  81.     for r in data:
  82.         if is_part_a_safe(r):
  83.             safe += 1
  84.         else:
  85.             if is_safe_removing_one_level(r):
  86.                 safe += 1
  87.     print(safe)
  88.  
  89.  
  90. if __name__ == '__main__':
  91.     part_a()
  92.     part_b()
  93.  
Advertisement
Add Comment
Please, Sign In to add comment