2025(06): thanks to loops, things work
2.28 ms ± 347 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
This commit is contained in:
68
2025/06/part2.py
Normal file
68
2025/06/part2.py
Normal file
@ -0,0 +1,68 @@
|
||||
debug = False
|
||||
|
||||
def do_homework(filename: str):
|
||||
# Read file as list of strings
|
||||
with open(filename, "r") as fp:
|
||||
data = fp.read().splitlines()
|
||||
|
||||
# Gimme the operators
|
||||
last_row = data[-1]
|
||||
operators = last_row.split()
|
||||
|
||||
# Use that to find the lengths
|
||||
num_of_cols = len(operators)
|
||||
|
||||
icol_prev = 0
|
||||
final_result = 0
|
||||
for icol in range(num_of_cols):
|
||||
op = operators[icol]
|
||||
|
||||
# Find the length of this column.
|
||||
col_len = len(last_row[icol_prev:]) - len(last_row[icol_prev + 1:].lstrip())
|
||||
|
||||
# For the last column, I don't have that nice column of nothing
|
||||
if icol == num_of_cols - 1:
|
||||
col_len += 1
|
||||
|
||||
# Prepare empty string for my numbers
|
||||
nums = (col_len - 1)*[""]
|
||||
|
||||
# Make the num strings by moving row by row
|
||||
for jcol in range(icol_prev, icol_prev + col_len - 1):
|
||||
for row in data[:-1]:
|
||||
nums[jcol - icol_prev] += row[jcol]
|
||||
|
||||
# Do the math
|
||||
if op == '*':
|
||||
result = 1
|
||||
if debug:
|
||||
print(1, end="")
|
||||
for num in nums:
|
||||
num = int(num)
|
||||
if debug:
|
||||
print(f" * {num}", end="")
|
||||
|
||||
result *= num
|
||||
elif op == '+':
|
||||
result = 0
|
||||
if debug:
|
||||
print(0, end="")
|
||||
for num in nums:
|
||||
num = int(num)
|
||||
if debug:
|
||||
print(f" + {num}", end="")
|
||||
|
||||
result += num
|
||||
else:
|
||||
assert False, "fuck this"
|
||||
|
||||
icol_prev += col_len
|
||||
final_result += result
|
||||
if debug:
|
||||
print(f" = {result}")
|
||||
return final_result
|
||||
|
||||
if __name__ == "__main__":
|
||||
assert do_homework("testinput") == 3263827
|
||||
|
||||
print(do_homework("input"))
|
||||
Reference in New Issue
Block a user