illuminati229

AoC 2023 Day 03

Dec 6th, 2023
1,499
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.78 KB | None | 0 0
  1. from time import time
  2. import re
  3.  
  4.  
  5. def timer_func(func):
  6.     # This function shows the execution time of
  7.     # the function object passed
  8.     def wrap_func(*args, **kwargs):
  9.         t1 = time()
  10.         result = func(*args, **kwargs)
  11.         t2 = time()
  12.         print(f'Function {func.__name__!r} executed in {(t2 - t1):.4f}s')
  13.         return result
  14.  
  15.     return wrap_func
  16.  
  17.  
  18. def get_surrounding(matrix, row, col):
  19.     sv = []
  20.     if 1 < row:
  21.         sv += matrix[row - 1][max(0, col[0] - 1):min(col[1] + 1, len(matrix[0]))]
  22.     if row < len(matrix) - 1:
  23.         sv += matrix[row + 1][max(0, col[0] - 1):min(col[1] + 1, len(matrix[0]))]
  24.     sv += matrix[row][max(0, col[0] - 1):col[0]]
  25.     sv += matrix[row][col[1]:min(col[1] + 1, len(matrix[0]))]
  26.  
  27.     return sv
  28.  
  29.  
  30. def get_star_pos(matrix, row, col):
  31.     if 1 < row:
  32.         for i in range(max(0, col[0] - 1), min(col[1] + 1, len(matrix[0]))):
  33.             if matrix[row - 1][i] == '*':
  34.                 return row - 1, i
  35.     if row < len(matrix) - 1:
  36.         for i in range(max(0, col[0] - 1), min(col[1] + 1, len(matrix[0]))):
  37.             if matrix[row + 1][i] == '*':
  38.                 return row + 1, i
  39.     if col[0] > 0:
  40.         if matrix[row][col[0] - 1] == '*':
  41.             return row, col[0] - 1
  42.     if col[1] < len(matrix[0]):
  43.         if matrix[row][col[1]] == '*':
  44.             return row, col[1]
  45.  
  46.     return -1, -1
  47.  
  48.  
  49. @timer_func
  50. def day03(filepath, part2=False):
  51.     with open(filepath) as fin:
  52.         lines = [line.strip() for line in fin.readlines()]
  53.  
  54.     pn_sum = 0
  55.     if not part2:
  56.         for r, line in enumerate(lines):
  57.             for entry in re.finditer(r'\d+', line):
  58.                 pn = int(entry.group())
  59.                 sv = get_surrounding(lines, r, entry.span())
  60.                 sv = ''.join(sv)
  61.                 if re.search(r'[^0-9.]', sv):
  62.                     pn_sum += pn
  63.         return pn_sum
  64.  
  65.     gears = []
  66.     for r, line in enumerate(lines):
  67.         for entry in re.finditer(r'\d+', line):
  68.             pn = int(entry.group())
  69.             sv = get_surrounding(lines, r, entry.span())
  70.             sv = ''.join(sv)
  71.             if '*' in sv:
  72.                 sp = get_star_pos(lines, r, entry.span())
  73.                 gears.append([pn, sp, 0])
  74.     for i, gear in enumerate(gears):
  75.         if gear[2] == 1:
  76.             continue
  77.         loc = gear[1]
  78.         for j in range(i + 1, len(gears)):
  79.             if gears[j][1] == loc:
  80.                 pn_sum += gear[0] * gears[j][0]
  81.                 gears[i][2] = 1
  82.                 gears[j][2] = 1
  83.  
  84.     return pn_sum
  85.  
  86.  
  87. def main():
  88.     assert day03('test03') == 4361
  89.     print(f"Part 1: {day03('input03')}")
  90.  
  91.     assert day03('test03', True) == 467835
  92.     print(f"Part 2: {day03('input03', True)}")
  93.  
  94.  
  95. if __name__ == '__main__':
  96.     main()
  97.  
Advertisement
Add Comment
Please, Sign In to add comment