示例#1
0
def part_2(raw: str):
    ticket_rules, your_ticket, other_tickets = parse_input(raw)

    bad_tickets = set(get_bad_tickets(ticket_rules, other_tickets))
    other_tickets = set(other_tickets) - bad_tickets

    constraints = {rule: set(range(len(your_ticket))) for rule in ticket_rules}

    while any(len(indices) != 1 for indices in constraints.values()):
        for rule in ticket_rules:
            for ticket in other_tickets:
                for index, num in enumerate(ticket):
                    if not rule.matches(num):
                        constraints[rule].discard(index)

            if len(constraints[rule]) == 1:
                index = list(constraints[rule])[0]
                for other_rule in ticket_rules:
                    if rule != other_rule:
                        constraints[other_rule].discard(index)

    defined = {list(indices)[0]: rule.name for rule, indices in constraints.items()}

    return lib.product(
        [val for i, val in enumerate(your_ticket) if defined[i].startswith("departure")]
    )
def problem12(n):
    """ return first triangle number to have over n divisors. 
        where triangle number is the sum of first natural numbers.
    >>> problem12(500)
    76576500
    >>> problem12(5)
    28
    """
    divisors, count  = 1, 1
    while divisors < n:
        count += 1
        triangle = lib.sum_frist_N_numbers(count)
        primes_dict = lib.prime_factors(triangle)
        divisors = lib.product(map(lib.increment, primes_dict.values()))
    return triangle
示例#3
0
def part_2(raw: str):
    adapters = [0] + list(sorted(map(int, raw.splitlines())))

    one_differences = [0]

    for lower, higher in lib.window(adapters, 2):
        if higher - lower == 1:
            one_differences[-1] += 1
        else:
            one_differences.append(0)

    one_differences = [num for num in one_differences if num > 0]
    individual_combinations = map(count_contiguous_combinations,
                                  one_differences)
    return lib.product(individual_combinations)
示例#4
0
def part_2(raw: str):
    ints = list(map(int, raw)) + list(range(10, 1000000 + 1))

    return lib.product(Game(ints).play(10000000).arrangement(2))
示例#5
0
def part_1(raw: str) -> int:
    tiles = parse_input(raw)
    return lib.product(tile.tile_id for tile in get_corners(tiles))
def problem40():
    """
    >>> problem40()
    210
    """
    return lib.product(map(lib.nth_digit_fractional, lib.powers10_upto_6))
示例#7
0
def find_entries(entries: typing.Iterable[int], num_dimensions: int,
                 target: int) -> int:
    combinations = itertools.combinations(entries, num_dimensions)
    return lib.product(
        lib.first(combinations, lambda combo: sum(combo) == target))
示例#8
0
def part_2():
    slopes = [(1, 1), (3, 1), (5, 1), (7, 1), (1, 2)]
    return lib.product(check_slope(dx, dy) for dx, dy in slopes)