aboutsummaryrefslogtreecommitdiffstats
path: root/src/03/solve.py
blob: 766b00e493f91606b5531ec0f3eff2c62ec4691c (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
import sys
sys.path.append("../common")
import aoc

data = aoc.data.split("\n")

#data = "#1 @ 1,3: 4x4","#2 @ 3,1: 4x4","#3 @ 5,5: 2x2"

def parse_rect(l):
    split = l.split("@")
    id = int(split[0].replace("#",""))
    split = split[1].split(":")
    pos = [int(x) for x in split[0].split(",")]
    size = [int(x) for x in split[1].split("x")]
    return pos, size, id

def create_map():
    global rectdata
    rectdata = [parse_rect(l) for l in data]
    msize = list([0,0])
    for i in range(len(rectdata)):
        r = rectdata[i]
        xm = r[0][0] + r[1][0]
        ym = r[0][1] + r[1][1]
        if i == 0 or xm > msize[0]:
            msize[0] = xm
        if i == 0 or ym > msize[1]:
            msize[1] = ym

    map = [[list() for y in range(msize[1])] for x in range(msize[0])]
    for r in rectdata:
        sx = r[0][0]
        sy = r[0][1]
        for x in range(sx, sx + r[1][0]):
            for y in range(sy, sy + r[1][1]):
                map[x][y].append(r[2])

    return map

def solve1(args):
    map = create_map()

    overlap = 0
    for x in range(len(map)):
        for y in range(len(map[0])):
            if len(map[x][y]) > 1:
                overlap += 1

    return overlap

def solve2(args):
    map = create_map()

    overlap = set()
    for x in range(len(map)):
        for y in range(len(map[0])):
            if len(map[x][y]) > 1:
                for id in map[x][y]:
                    overlap.add(id)

    for i in range(1, len(rectdata)):
        if i not in overlap:
            return i

aoc.run(solve1, solve2, sols=[114946, 877])