Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class IntCoderBasic:
- ranges: Tuple[Tuple[T_INT_PAIR, int], ...]
- rer: TTP_INT_PAIR
- # https://pastebin.com/sUKuHSaW
- def __init__(self, *min_max_ranges: T_INT_PAIR):
- x = []
- cofactor = 1
- for mm in min_max_ranges:
- x.append((mm, cofactor))
- cofactor *= mm[1] - mm[0]
- self.ranges = tuple(x)
- self.rer = tuple(enumerate(reversed(tuple(i for _, i in x))))
- def to_int(self, xs: IB_INT) -> int:
- return sum(cofactor * (x - x_range_min) for x, ((x_range_min, x_range_max), cofactor) in zip(xs, self.ranges))
- def from_int(self, x: int) -> L_INT:
- total = x
- rer = self.rer
- result = [0] * len(rer)
- for i, (cofactor) in rer:
- q, r = divmod(total, cofactor)
- total -= q * cofactor
- result[i] = r
- return result
- class IntCoder:
- def __init__(self, *mm_ranges: Tuple[int, int]):
- self.ranges: Tuple[Tuple[Tuple[int, int], int], ...] = tuple((mm, cf) for mm, cf in zip(mm_ranges, self._cofactors(mm_ranges)))
- def to_int(self, xs: List[int]) -> int:
- return sum(cf * (x - xr_min) for (x, ((xr_min, _), cf)) in zip(xs, self.ranges))
- def from_int(self, x: int) -> List[int]:
- t, rer = x, [(i, cf) for i, (_, cf) in enumerate(reversed(self.ranges))]
- return [t // cf if (i := t % cf) == 0 else (t := t - i * cf, i)[1] for i, cf in rer]
- @staticmethod
- def _cofactors(mm_ranges: Tuple[int, int]) -> List[int]:
- cf = 1
- for mm in mm_ranges:
- yield cf
- cf *= mm[1] - mm[0]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement