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