#!/usr/bin/env python
import numpy as np
import re
num_parse = re.compile(r'(toggle|off|on) (\d+,\d+) through (\d+,\d+)$')
with open('day6.txt') as data:
instructions = [num_parse.search(line).groups((1, 2, 3)) for line in data]
lights = np.zeros((1000, 1000), dtype=bool)
for inst in instructions:
x1, y1 = map(int, inst[1].split(','))
x2, y2 = map(int, inst[2].split(','))
match inst[0]:
case 'toggle':
lights[x1:x2+1, y1:y2+1] = np.logical_not(lights[x1:x2+1, y1:y2+1])
case 'on':
lights[x1:x2+1, y1:y2+1] = True
case 'off':
lights[x1:x2+1, y1:y2+1] = False
print(np.count_nonzero(lights))
lights = np.zeros((1000, 1000), dtype=int)
for inst in instructions:
x1, y1 = map(int, inst[1].split(','))
x2, y2 = map(int, inst[2].split(','))
match inst[0]:
case 'toggle':
lights[x1:x2+1, y1:y2+1] += 2
case 'on':
lights[x1:x2+1, y1:y2+1] += 1
case 'off':
region = lights[x1:x2+1, y1:y2+1]
region -= 1
region[region < 0] = 0
print(np.sum(lights))