Beispiel #1
0
        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)]
Beispiel #2
0
    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))