def _read_input(input_file: Path) -> List[Tile]: res = [] for chunk in read_chunk(input_file): img_id = int(regex.findall("[0-9]+", chunk[0])[0]) img = np.array([list(line) for line in chunk[1:]]) res.append(Tile(img_id, img)) return res
def puzzle2(input_file: Path): sum_of_all_answer_counts = 0 for group in read_chunk(input_file): answer_per_person = ({answer for answer in person} for person in group) answer_made_by_all_in_group = set.intersection(*answer_per_person) sum_of_all_answer_counts += len(answer_made_by_all_in_group) return sum_of_all_answer_counts
def puzzle1(input_file: Path): sum_of_all_answer_counts = 0 for group in read_chunk(input_file): unique_answers_in_group = { answer for person in group for answer in person } sum_of_all_answer_counts += len(unique_answers_in_group) return sum_of_all_answer_counts
def puzzle1(input_file: Path): rule_specs, messages = read_chunk(input_file) rules_specs = {} for rule_spec in rule_specs: rule_id, spec = rule_spec.split(":") rules_specs[int(rule_id)] = spec.strip() rule = re_transpiler(rules_specs[0], rules_specs) cnt = 0 for message in messages: if re.fullmatch(rule, message) is not None: cnt += 1 return cnt
def puzzle2(input_file: Path): rule_specs, messages = read_chunk(input_file) rule_id_to_spec = {} for rule_spec in rule_specs: rule_id, spec = rule_spec.split(":") rule_id_to_spec[int(rule_id)] = spec.strip() pre_compiled = {} rule_42 = re_transpiler(rule_id_to_spec[42], rule_id_to_spec) pre_compiled[42] = rule_42 pre_compiled[8] = f"{rule_42}+" rule_31 = re_transpiler(rule_id_to_spec[31], rule_id_to_spec) pre_compiled[31] = rule_31 rule_11_ors = "|".join(f"{rule_42}{{{i}}}{rule_31}{{{i}}}" for i in range(1, 72)) pre_compiled[11] = f"(?:{rule_11_ors})" rule = re_transpiler(rule_id_to_spec[0], rule_id_to_spec, pre_compiled) cnt = 0 for message in messages: if re.fullmatch(rule, message) is not None: cnt += 1 return cnt
def read_starting_hands(input_file: Path) -> List[List[int]]: return [ list(int(num.strip()) for num in chunk[1:]) for chunk in read_chunk(input_file) ]
def _read_ticket_data(input_file: Path): ticket_specs, my_ticket, nearby_tickets = read_chunk(input_file) return ticket_specs, my_ticket[1], nearby_tickets[1:]