예제 #1
0
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
예제 #2
0
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
예제 #3
0
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
예제 #4
0
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
예제 #5
0
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
예제 #6
0
def _parse_passport(passport):
    return dict(pattern_extract_all("([a-z]{3}):(\S+)", passport, str, str))