aboutsummaryrefslogtreecommitdiffstats
path: root/src/01/solve.py
blob: d23d8d50d829a4feb35f7ece48e71b075ebc2904 (plain) (blame)
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
import sys
sys.path.append("../common")
import aoc

data = [int(l) for l in aoc.data.split("\n")]

def solve1(args):
    return sum(data)

def solve2(args):
    totshift = 0
    fvals = list()
    for c in data:
        fvals.append(totshift)
        totshift += c
    aoc.debug("total shift: " + str(totshift))

    doubles = list()

    if totshift == 0:
        doubles.append([len(data), 0])

    i = 0
    while i < len(fvals):
        for j in range(len(fvals)):
            if i == j:
                continue
            dif = fvals[j] - fvals[i]
            if dif % totshift == 0:
                inds = list([i, j])
                if j > i:
                    inds = inds[::-1]
                if totshift > 0: #ends on c
                    if fvals[inds[0]] > fvals[inds[1]]:
                        inds = inds[::-1]
                else:
                    if fvals[inds[0]] < fvals[inds[1]]:
                        inds = inds[::-1]

                pos = (abs(dif) // totshift) * len(data) + inds[0]
                doubles.append([pos, fvals[inds[1]]])
        i += 1

    assert(len(doubles) != 0)

    return min(doubles, key = lambda x: x[0])[1]

aoc.run(solve1, solve2, sols=[411, 56360])