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()
|