-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathday09sym.py
56 lines (48 loc) · 1.35 KB
/
day09sym.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from benchy import minibench
# we first solve the problem using symbolic math to get the
# direct formula that works for any input. In symbolic representation
# we'll use a k-element vector to represent k terms, with 1 at position
# i generated as follows:
def sym(k, i):
ret = [0] * k
ret[i] = 1
return ret
# addition or subtraction is just adding vectors together
def sym_add(seq1, seq2, sign):
return [seq1[i] + (seq2[i] * sign) for i in range(len(seq1))]
lines = open("day09.txt").read().split("\n")
flat = []
seqs = []
K = 0
# prepare the symbolic forumla in flat and parse inputs into seqs
def prep():
global flat, K
seqs.clear()
for l in lines:
seqs.append(list(map(int, l.split(" "))))
flat.clear()
K = len(seqs[0])
syms = [sym(K, i) for i in range(K)]
flat = [0] * K
for round in range(K):
for i in range(K - round - 1):
syms[i] = sym_add(syms[i + 1], syms[i], -1)
flat = sym_add(flat, syms[K - round - 1], 1)
return K
def part1():
sum1 = 0
for s in seqs:
for i in range(K):
sum1 += flat[i] * s[i]
return sum1
def part2():
sum2 = 0
for s in seqs:
for i in range(K):
sum2 += flat[i] * s[K - i - 1]
return sum2
prep()
print(flat)
print(part1())
print(part2())
minibench({"parse": prep, "part1": part1, "part2": part2})