#!/usr/bin/env python3 import re import numpy as np lines = (x.strip() for x in open("input.txt")) REGEX_RANGES = re.compile(r"^([a-z ]+): (\d+)-(\d+) or (\d+)-(\d+)$") groups = [] tickets = [] for line in lines: match = REGEX_RANGES.match(line) if match: m_groups = match.groups() groups.append(list(map(int, m_groups[1:]))) if "," in line: tickets.append(tuple(map(int, line.split(',')))) groups = np.array(groups) tickets = np.array(tickets, dtype=np.int32) ranges = np.concatenate((groups[:, :2], groups[:, 2:]), axis=0) valids = np.full(tickets.shape, False) for idx, elem in np.ndenumerate(tickets): valids[idx] = np.any(np.logical_and(ranges[:, 0] <= elem, elem <= ranges[:, 1])) print(np.ma.array(tickets, mask=valids).sum())