kupuguy

Advent Of Code 2024 Day 10

Dec 10th, 2024 (edited)
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.58 KB | Source Code | 0 0
  1. from pathlib import Path
  2.  
  3. TEST = """89010123
  4. 78121874
  5. 87430965
  6. 96549874
  7. 45678903
  8. 32019012
  9. 01329801
  10. 10456732"""
  11.  
  12.  
  13. def parse(input: str) -> dict[complex, int]:
  14.     trailmap: dict[complex, int] = {}
  15.     for y, row in enumerate(input.splitlines()):
  16.         for x, height in enumerate(row):
  17.             trailmap[complex(x, y)] = int(height)
  18.     return trailmap
  19.  
  20.  
  21. def part1(input: str) -> int:
  22.     trailmap = parse(input)
  23.     starts = [k for k in trailmap if trailmap[k] == 0]
  24.     score = 0
  25.     for s in starts:
  26.         points = {s}
  27.         for height in range(1, 10):
  28.             points = {
  29.                 p
  30.                 for q in points
  31.                 for p in (q + 1, q - 1, q + 1j, q - 1j)
  32.                 if p in trailmap and trailmap[p] == height
  33.             }
  34.         score += len(points)
  35.     return score
  36.  
  37. assert part1(TEST) == 36
  38.  
  39. INPUT = Path("input/day10.txt").read_text()
  40. part1_total = part1(INPUT)
  41. print(f"{part1_total=:,}")
  42.  
  43. def part2(input: str) -> int:
  44.     trailmap = parse(input)
  45.     starts = [k for k in trailmap if trailmap[k] == 0]
  46.     score = 0
  47.     for s in starts:
  48.         points = {s: 1}
  49.         for height in range(1, 10):
  50.             new: dict[complex, int] = {}
  51.             for q in points:
  52.                 for p in (q + 1, q - 1, q + 1j, q - 1j):
  53.                     if p in trailmap and trailmap[p] == height:
  54.                         new[p] = new.get(p, 0) + points[q]
  55.             points = new
  56.         score += sum(points.values())
  57.     return score
  58.  
  59. assert part2(TEST) == 81
  60.  
  61. part2_total = part2(INPUT)
  62. print(f"{part2_total=:,}")
  63.  
Advertisement
Add Comment
Please, Sign In to add comment