advent of code 2025

day 3 part 2

kot.pink f40d5285 9e4fa252

verified
+12 -19
+12 -19
3.py
··· 1 1 import sys 2 - import heapq 3 2 4 3 output_two = 0 5 4 output_twelve = 0 6 5 file = '3.input' if len(sys.argv) <= 1 else sys.argv[1] 7 6 for line in open(file).readlines(): 8 - first_seen = {} # digit to first index 9 - last_seen = {} # digit to last index 10 - for i, digit in enumerate(line.strip()): 11 - first_seen.setdefault(int(digit), i) 12 - last_seen[int(digit)] = i 13 - 14 - max_all = max(first_seen.keys()) # largest digit (always included) 15 - if last_seen[max_all] > first_seen[max_all]: # if it appears twice, just use it 16 - output_two += max_all * 11 17 - continue 7 + line = line.strip() 8 + for n in [2, 12]: 9 + result = [-1] * n 10 + for it in range(n): 11 + right = list(enumerate(line[:-(n-1)+it or len(line)])) 12 + allowed = [(i, d) for i, d in right if i > max(result)] 13 + pick = max(allowed, key=lambda a: a[1]) 14 + result[it] = pick[0] 18 15 19 - try: 20 - # first search right of the max digit 21 - max_right = max(digit for digit, i in last_seen.items() if i > first_seen[max_all]) 22 - output_two += max_all * 10 + max_right 23 - except ValueError: 24 - # search left for max digit 25 - max_left = max(digit for digit, i in last_seen.items() if i < first_seen[max_all]) 26 - output_two += max_left * 10 + max_all 16 + if n == 2: 17 + output_two += int("".join(line[i] for i in result)) 18 + elif n == 12: 19 + output_twelve += int("".join(line[i] for i in result)) 27 20 28 21 print(f'p1: {output_two}') 29 22 print(f'p2: {output_twelve}')