advent of code 2025

day 3 part 2

kot.pink f40d5285 9e4fa252

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