#!/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))