diff --git a/2015/day06.py b/2015/day06.py new file mode 100644 index 0000000..851a51b --- /dev/null +++ b/2015/day06.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 + +from typing import TextIO + + +grid: dict[tuple, bool] = {} + +newgrid: dict[tuple, int] = {} + + +def part1(instructions: TextIO) -> int: + for ins in instructions: + ins = ins.strip().split() + # print(ins) + + command = ins[0:2] + + if len(ins) == 5: + fr = tuple([int(x) for x in ins[2].split(",")]) + else: + fr = tuple([int(x) for x in ins[1].split(",")]) + + to = tuple([int(x) for x in ins[-1].split(",")]) + + if command == ["turn", "off"]: + for x in range(fr[0], to[0] + 1): + for y in range(fr[1], to[1] + 1): + if (x, y) in grid: + del grid[(x, y)] + + elif command == ["turn", "on"]: + for x in range(fr[0], to[0] + 1): + for y in range(fr[1], to[1] + 1): + if (x, y) not in grid: + grid[(x, y)] = True + + else: # Toggle + for x in range(fr[0], to[0] + 1): + for y in range(fr[1], to[1] + 1): + if (x, y) not in grid: + grid[(x, y)] = True + else: + del grid[(x, y)] + + return len(grid) + + +def part2(instructions: TextIO) -> int: + for ins in instructions: + ins = ins.strip().split() + + command = ins[0:2] + + if len(ins) == 5: + fr = tuple([int(x) for x in ins[2].split(",")]) + else: + fr = tuple([int(x) for x in ins[1].split(",")]) + + to = tuple([int(x) for x in ins[-1].split(",")]) + + if command == ["turn", "off"]: + for x in range(fr[0], to[0] + 1): + for y in range(fr[1], to[1] + 1): + if (x, y) not in newgrid: + newgrid[(x, y)] = 0 + elif newgrid[(x, y)] != 0: + newgrid[(x, y)] -= 1 + + elif command == ["turn", "on"]: + for x in range(fr[0], to[0] + 1): + for y in range(fr[1], to[1] + 1): + if (x, y) not in newgrid: + newgrid[(x, y)] = 1 + else: + newgrid[(x, y)] += 1 + + else: # Toggle + for x in range(fr[0], to[0] + 1): + for y in range(fr[1], to[1] + 1): + if (x, y) not in newgrid: + newgrid[(x, y)] = 2 + else: + newgrid[(x, y)] += 2 + + return sum(newgrid.values()) + + +if __name__ == "__main__": + with open("day06.txt", "r") as f: + print(part1(f)) + with open("day06.txt", "r") as f: + print(part2(f)) diff --git a/2015/day06.txt b/2015/day06.txt new file mode 100644 index 0000000..e915265 Binary files /dev/null and b/2015/day06.txt differ diff --git a/2015/day06_test.py b/2015/day06_test.py new file mode 100644 index 0000000..5b7d05f --- /dev/null +++ b/2015/day06_test.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 + +from day06 import * + + +def test_part1() -> None: + with open("day06.txt", "r") as f: + assert part1(f) == 400410 + + +def test_part2() -> None: + with open("day06.txt", "r") as f: + assert part2(f) == 15343601