def _get_start_tiles(file_name): tiles = defaultdict(lambda: False) for line in read_line_separated_list(file_name): pos = (0, 0) for ins in map(first, pattern_extract_all("(se|sw|ne|nw|e|w)", line, str)): pos = add_tuples(pos, directions[ins]) tiles[pos] = not tiles[pos] return tiles
def _read_and_parse_data(file_name): data = read(file_name).split("\n\n") your_ticket = _parse_ticket_str(data[1].split("\n")[1]) nearby_tickets = list( map(_parse_ticket_str, data[2].split("\n", maxsplit=1)[1].splitlines())) rules = pattern_extract_all("([a-z ]+): (\d+)\-(\d+) or (\d+)\-(\d+)", data[0], str, int, int, int, int) return your_ticket, nearby_tickets, rules
def solve_part2(file_name): text = read_line_separated_list(file_name) contains = defaultdict(list) for line in text: head, tail = line.split(" bags contain ") contains[head].extend( pattern_extract_all("(\d+) (\w+ \w+) bags?", tail, int, str)) return _cost_of_bag("shiny gold", 1, contains) - 1
def solve_part1(file_name): schedule = read_line_separated_list(file_name) earlist_ts = int(schedule[0]) buses = list(flatten(pattern_extract_all("(\d+)", schedule[1], int))) ts = earlist_ts while 1: for b in buses: if ts % b == 0: return (ts - earlist_ts) * b ts += 1
def solve_part1(file_name): text = read_line_separated_list(file_name) contained_by = defaultdict(list) for line in text: head, tail = line.split(" bags contain ") for rule in pattern_extract_all("\d+ (\w+ \w+) bags?", tail, str): contained_by[rule[0]].append(head) seen = set() q = ["shiny gold"] while q: node = q.pop() seen.add(node) for other_node in contained_by.get(node, []): if other_node not in seen: q.append(other_node) return len(seen) - 1
def _parse_passport(passport): return dict(pattern_extract_all("([a-z]{3}):(\S+)", passport, str, str))