#!/usr/bin/env python3 import re lines = (x.strip() for x in open("input.txt")) result = 0 nums = [dict(), dict(), dict()] signals = [] DIGIT = re.compile("\d+") for idx, line in enumerate(lines): next_num_items = [(idx, match.start(), match.end(), int(line[match.start():match.end()])) for match in DIGIT.finditer(line)] next_num_items = {i: val for val in next_num_items for i in range(val[1], val[2])} next_char_idxs = [j for j, char in enumerate(line) if char in "*"] nums = nums[1:] + [next_num_items] # check for signal in signals: found = set() for i in range(signal-1, signal+2): for j in range(0, 3): if i in nums[j]: found.add(nums[j][i]) if len(found) == 2: result += found.pop()[3] * found.pop()[3] signals = next_char_idxs print(result)