Skip to content
Snippets Groups Projects
rtree.py 1.48 KiB
Newer Older
  • Learn to ignore specific revisions
  • from dataclasses import dataclass
    
    
    @dataclass
    class ReducePath:
        path: list[bool]
    
    chrg's avatar
    chrg committed
        reasons: list[str]
    
        @classmethod
        def empty(cls):
            return cls([], [])
    
    
        def explore(self, choice):
    
    chrg's avatar
    chrg committed
            self.reasons = []
    
            self.path.append(choice)
            return self
    
    
    chrg's avatar
    chrg committed
        def left(self):
    
    chrg's avatar
    chrg committed
            return len(self.reasons) - len(self.path)
    
    chrg's avatar
    chrg committed
        def check(self, reason: str):
            self.reasons.append(reason)
    
            try:
    
    chrg's avatar
    chrg committed
                return self.path[len(self.reasons) - 1]
    
            except IndexError:
                return False
    
    
    
    chrg's avatar
    chrg committed
    def reduce(predicate, reducer, i):
        r = ReducePath.empty()
        j = i
        ix = reducer(i, r.explore(True))
    
    chrg's avatar
    chrg committed
        # While we don't consume all choices going down the true branch
        while r.left() >= 0:
    
    chrg's avatar
    chrg committed
            print(r.reasons[len(r.path) - 1], "...", end="")
            if predicate(ix):
    
    chrg's avatar
    chrg committed
                # If true update the valid input
    
    chrg's avatar
    chrg committed
                print(" Yes")
                j = ix
    
    chrg's avatar
    chrg committed
            else:
                # If false we have to go down the left branch.
    
    chrg's avatar
    chrg committed
                print(" No")
    
    chrg's avatar
    chrg committed
                r.path[-1] = False
    
    chrg's avatar
    chrg committed
            ix = reducer(i, r.explore(True))
        return j
    
    
    
    def debug(predicate):
        def newpred(i):
            t = predicate(i)
    
    chrg's avatar
    chrg committed
            print(" test", i, "...", end="")
    
            return t
    
        return newpred
    
    
    
    chrg's avatar
    chrg committed
    def reduce_set(i: set, r) -> set:
        result: set = set()
        for e in sorted(i):
            if not r.check(f"remove {e}?"):
                result.add(e)
        return result
    
    
    
    if __name__ == "__main__":
    
    chrg's avatar
    chrg committed
        reduce(debug(lambda a: "a" in a), reduce_set, {"a", "b", "c"})