Advertisement
HexTree

Advent of Code 2023 (Python) - Day 3

Dec 3rd, 2023
1,058
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.37 KB | Source Code | 0 0
  1. from collections import defaultdict
  2.  
  3. grid = []
  4.  
  5. with open('input.txt', 'r') as f:
  6.     for line in f.readlines():
  7.         grid.append(line.strip())
  8.  
  9. n = len(grid)
  10. m = len(grid[0])
  11.  
  12. def get_nbrs(i, j1, j2):
  13.     nbr_set = set()
  14.     for j in range(j1, j2):
  15.         for di in [-1, 0, 1]:
  16.             for dj in [-1, 0, 1]:
  17.                 if (di, dj) == (0, 0):
  18.                     continue
  19.                 nbri, nbrj = i + di, j + dj
  20.                 if 0 <= nbri < n and 0 <= nbrj < m:
  21.                     nbr_set.add((nbri, nbrj))
  22.     return nbr_set
  23.  
  24. def is_symbol(char):
  25.     return (not char.isdigit()) and char != '.'
  26.  
  27. total = 0
  28. table = defaultdict(list)
  29. for i in range(n):
  30.     j = 0
  31.     while j < m:
  32.         if not grid[i][j].isdigit():
  33.             j += 1
  34.             continue
  35.         j2 = j + 1
  36.         while j2 < m and grid[i][j2].isdigit():
  37.             j2 += 1
  38.         if any(is_symbol(grid[nbri][nbrj]) for nbri, nbrj in get_nbrs(i, j, j2)):
  39.             num = int(grid[i][j:j2])
  40.             total += num
  41.             # part 2
  42.             for nbri, nbrj in get_nbrs(i, j, j2):
  43.                 if grid[nbri][nbrj] == '*':
  44.                     table[(nbri, nbrj)].append(num)
  45.         j = j2
  46.  
  47. # part 1
  48. print(total)
  49.  
  50. # part 2
  51. gear_ratio_sum = 0
  52. for v in table.values():
  53.     if len(v) == 2:
  54.         gear_ratio_sum += (v[0]*v[1])
  55. print(gear_ratio_sum)
  56.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement