advent-of-code-2025/day03.py

91 lines
2.3 KiB
Python

#!/usr/bin/env python
# https://adventofcode.com/2025/day/3
f = open("day03input.txt", "r")
#f = open("testinput.txt", "r")
d = [l.strip() for l in f.readlines()]
def part1(data: list[str]) -> int:
if isinstance(data, str):
data = [data]
total = 0
for l in data:
# print(f"l ist {l}")
# get index of highest digit (tens)
tens_index = 0
# print("tens_index\tl[i]")
# print(f"{tens_index}\t{l[0]}")
for i in range(1, len(l) - 1):
if int(l[i]) > int(l[tens_index]):
tens_index = i
# print(f"{tens_index}\t{l[i]}")
# get index of highest digits after the tens (ones)
ones_index = tens_index + 1
# print("ones_index\tl[i]")
# print(f"{ones_index}\t{l[0]}")
for i in range(tens_index + 1, len(l)):
if int(l[i]) > int(l[ones_index]):
ones_index = i
# print(f"{ones_index}\t{l[i]}")
# print(f"{l}\t{int(l[tens_index]) * 10 + int(l[ones_index])}")
total += int(l[tens_index]) * 10 + int(l[ones_index])
return total
def part2(data: list[str], banks: int = 2) -> int:
if isinstance(data, str):
data = [data]
total = 0
# loop over data lines
for l in data:
# print(f"l ist {l}")
# loop over number of banks
for bank in range(banks):
# calculate new index
if bank == 0:
indices = [0]
else:
indices.append(indices[bank - 1] + 1)
# print(f"bank is {bank} and indices are {indices}")
# exit loop if only one digit is viable anymore
# (technically I'm not exiting but skipping ahead)
if indices[bank] == bank + len(l) - banks:
continue
# loop over data line
# print("i\tl[i]")
# print(f"{indices[bank]}\t{l[indices[bank]]}")
# print(f"using range({indices[bank]+1}, {len(l)-banks+bank+1})")
for i in range(indices[bank] + 1, len(l) - banks + bank + 1):
# print(f"{i}\t{l[i]}")
if int(l[i]) > int(l[indices[bank]]):
indices[bank] = i
# for i in range(banks):
# print("i\tbanks-i-1\t10^(b-i-1)\tindices[i]\tl[indices[i]]")
# print(f"{i}\t{banks-i-1}\t{10**(banks-i-1)}\t{indices[i]}\t{l[indices[i]]}")
psum = sum([int(l[indices[i]]) * 10 ** (banks - i - 1) for i in range(banks)])
# print(psum)
total += psum
return total
print(part1(d)) # equal to print(part2(d, 2))
print(part2(d, 12))