def edge_split(left_self: int, right_self: int, left_other: int, right_other: int) -> list[tuple[int, int]]: split_points = [left_self] if left_self < left_other <= right_self: # oooo... # ss|ssss... split_points.append(left_other) if left_self <= right_other < right_self: # ...oooo # ...ssss|ss split_points.append(right_other + 1) split_points.append(right_self + 1) return [(left, right - 1) for left, right in zip1(split_points)]
def exploded(self, level_limit: int = 4) -> Optional['Number']: try: left_index, right_index, level, left_value, right_value = next( (index, index + 1, l1, v1, v2) for index, ((v1, l1), (v2, l2)) in enumerate(zip1(self.value_levels)) if l1 == l2 > level_limit) except StopIteration: return None new_vls = list(self.value_levels) def adjust_new_vls(index: int, value_diff: int): if index in range(len(new_vls)): value_1, level_1 = new_vls[index] new_vls[index] = value_1 + value_diff, level_1 adjust_new_vls(left_index - 1, left_value) adjust_new_vls(right_index + 1, right_value) new_vls[left_index] = (0, level - 1) new_vls.pop(right_index) return type(self)(new_vls)
def generate_routes(distances: Distances) -> Iterable[Route]: places = sorted(set(p for ps in distances.keys() for p in ps)) return ((sum(distances[ps] for ps in zip1(route_places)), route_places) for route_places in permutations(places))
def is_nice(string: str) -> bool: return (sum(1 for char in string if char in set('aeiou')) >= 3 and any(c1 == c2 for c1, c2 in zip1(string)) and not any(string[k:k + 2] in {'ab', 'cd', 'pq', 'xy'} for k in range(len(string) - 1)))
def diffs(items: Iterable[int]) -> Iterable[int]: return (b - a for a, b in zip1(items))
def arrangement_happiness(arrangement: list[str], rules: Rules) -> int: return sum(rules[p1, p2] + rules[p2, p1] for p1, p2 in zip1(arrangement, wrap=True))