示例#1
0
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
示例#2
0
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
示例#3
0
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
示例#4
0
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
示例#5
0
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
示例#6
0
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)
    ]
示例#7
0
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:]