89 lines
2.0 KiB
Python
89 lines
2.0 KiB
Python
|
import shared
|
||
|
|
||
|
def get_sequence(values):
|
||
|
differences = []
|
||
|
for idx in range(len(values)-1):
|
||
|
x1, x2 = values[idx:idx+2]
|
||
|
differences.append(x2 - x1)
|
||
|
return differences
|
||
|
|
||
|
def print_pretty(history):
|
||
|
for idx, h in enumerate(history):
|
||
|
print((" " * idx) + " ".join(map(str, h)))
|
||
|
|
||
|
def calculate_new_value(row1, row2):
|
||
|
print(row1, row2)
|
||
|
|
||
|
|
||
|
# @shared.profile
|
||
|
def part1(rows):
|
||
|
# gather
|
||
|
history = [[shared.spl(row.split())] for row in rows]
|
||
|
for h in history:
|
||
|
vals = h[0]
|
||
|
while True:
|
||
|
vals = get_sequence(vals)
|
||
|
h.append(vals)
|
||
|
if shared.all_equal(vals) and vals[0] == 0:
|
||
|
break
|
||
|
# do calcs
|
||
|
for h in history:
|
||
|
h[-1].append(0)
|
||
|
for idx in range(1, len(h)):
|
||
|
i = (idx * -1) -1
|
||
|
me = h[i]
|
||
|
above = h[i+1]
|
||
|
#print(above,me)
|
||
|
new_val = me[-1] + above[-1]
|
||
|
h[i].append(new_val)
|
||
|
|
||
|
# totals
|
||
|
newest = [x[0][-1] for x in history]
|
||
|
print(sum(newest))
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
# @shared.profile
|
||
|
def part2(rows):
|
||
|
# gather
|
||
|
history = [[shared.spl(row.split())] for row in rows]
|
||
|
for h in history:
|
||
|
vals = h[0]
|
||
|
while True:
|
||
|
vals = get_sequence(vals)
|
||
|
h.append(vals)
|
||
|
if shared.all_equal(vals) and vals[0] == 0:
|
||
|
break
|
||
|
# do calcs
|
||
|
for h in history:
|
||
|
h[-1].insert(0, 0)
|
||
|
for idx in range(1, len(h)):
|
||
|
i = (idx * -1) -1
|
||
|
me = h[i]
|
||
|
below = h[i+1]
|
||
|
new_val = me[0] - below[0]
|
||
|
|
||
|
h[i].insert(0, new_val)
|
||
|
# totals
|
||
|
newest = [x[0][0] for x in history]
|
||
|
print(sum(newest))
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
def main():
|
||
|
rows = [row for row in shared.load_rows(9)]
|
||
|
with shared.elapsed_timer() as elapsed:
|
||
|
part1(rows)
|
||
|
print("🕒", elapsed())
|
||
|
|
||
|
rows = [row for row in shared.load_rows(9, True)]
|
||
|
with shared.elapsed_timer() as elapsed:
|
||
|
part2(rows)
|
||
|
print("🕒", elapsed())
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|