import sys from typing import Literal, cast import numpy as np import parse # type: ignore lines = sys.stdin.read().splitlines() lights_1 = np.zeros((1000, 1000), dtype=bool) lights_2 = np.zeros((1000, 1000), dtype=int) for line in lines: action, sx, sy, ex, ey = cast( tuple[Literal["turn on", "turn off", "toggle"], int, int, int, int], parse.parse("{} {:d},{:d} through {:d},{:d}", line), # type: ignore ) ex, ey = ex + 1, ey + 1 match action: case "turn on": lights_1[sx:ex, sy:ey] = True lights_2[sx:ex, sy:ey] += 1 case "turn off": lights_1[sx:ex, sy:ey] = False lights_2[sx:ex, sy:ey] = np.maximum(lights_2[sx:ex, sy:ey] - 1, 0) case "toggle": lights_1[sx:ex, sy:ey] = ~lights_1[sx:ex, sy:ey] lights_2[sx:ex, sy:ey] += 2 answer_1 = lights_1.sum() print(f"answer 1 is {answer_1}") answer_2 = lights_2.sum() print(f"answer 2 is {answer_2}")