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"])
|