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
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)
def part_2(raw: str): ints = list(map(int, raw)) + list(range(10, 1000000 + 1)) return lib.product(Game(ints).play(10000000).arrangement(2))
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))
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))
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)