aboutsummaryrefslogtreecommitdiffstats
path: root/src/11/solve.py
blob: 66fc9565ec2cfd540c29ddc74c557899e1380fb9 (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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import sys
sys.path.append("../common")
import aoc

gridserial = int(aoc.data)

# rack ID = x + 10
# intial power = rackID * y
# power += gridserial
# power *= rackID
# power = str(power)[2]
# power -= 5

def get_power(x,y):
    id = x + 10
    power = id * y
    power += gridserial
    power *= id
    spower = str(power)
    if len(spower) > 2:
        power = int(spower[-3])
    else:
        power = 0
    power -= 5
    return power

def solve1(args):
    maxpower = None
    coords = None
    for x in range(300-2):
        for y in range(300-2):
            power = 0;
            for i in range(3):
                for j in range(3):
                    power += get_power(x+i,y+j)
            if maxpower == None or power > maxpower:
                maxpower = power
                coords = (x, y)

    return f"{coords[0]},{coords[1]}"

def gen_map():
    vmap = [[0 for y in range(300)] for x in range(300)]
    for x in range(300):
        for y in range(300):
            vmap[x][y] = get_power(x,y)
    return vmap

def solve2(args):
    maxpower = None
    res = None
    pmap = gen_map()
    vmap = [[list() for y in range(300)] for x in range(300)]
    for s in range(1, 301):
        aoc.debug(f"\rTrying: {s}", end="")
        cmaxpower = None
        cres = None
        for x in range(300-(s-1)):
            for y in range(300-(s-1)):
                vmap[x][y] += [pmap[x+(s-1)][y+i] for i in range(s)]
                vmap[x][y] += [pmap[x+i][y+(s-1)] for i in range(s-1)]
                power = sum(vmap[x][y]);
                if cmaxpower == None or power > cmaxpower:
                    cmaxpower = power
                    cres = (x, y, s)
        if maxpower == None or cmaxpower > maxpower:
            maxpower = cmaxpower
            res = cres
        elif cmaxpower < maxpower:
            break

    aoc.debug("\r" + " " * 50 + "\r", end="")

    return f"{res[0]},{res[1]},{res[2]}"

aoc.run(solve1, solve2, sols=["21,93", "231,108,14"])