···1import sys
2-import heapq
34output_two = 0
5output_twelve = 0
6file = '3.input' if len(sys.argv) <= 1 else sys.argv[1]
7for 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
1819- 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
2728print(f'p1: {output_two}')
29print(f'p2: {output_twelve}')
···1import sys
023output_two = 0
4output_twelve = 0
5file = '3.input' if len(sys.argv) <= 1 else sys.argv[1]
6for line in open(file).readlines():
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]
001516+ 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))
00002021print(f'p1: {output_two}')
22print(f'p2: {output_twelve}')