Advertisement
HasteBin0

Convert between int and list[int] β€” integer en/deconding

May 8th, 2023 (edited)
1,551
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.61 KB | Source Code | 0 0
  1. class IntCoderBasic:
  2.     ranges: Tuple[Tuple[T_INT_PAIR, int], ...]
  3.     rer: TTP_INT_PAIR
  4.  
  5.     # https://pastebin.com/sUKuHSaW
  6.  
  7.     def __init__(self, *min_max_ranges: T_INT_PAIR):
  8.         x = []
  9.         cofactor = 1
  10.         for mm in min_max_ranges:
  11.             x.append((mm, cofactor))
  12.             cofactor *= mm[1] - mm[0]
  13.         self.ranges = tuple(x)
  14.         self.rer = tuple(enumerate(reversed(tuple(i for _, i in x))))
  15.  
  16.     def to_int(self, xs: IB_INT) -> int:
  17.         return sum(cofactor * (x - x_range_min) for x, ((x_range_min, x_range_max), cofactor) in zip(xs, self.ranges))
  18.  
  19.     def from_int(self, x: int) -> L_INT:
  20.         total = x
  21.         rer = self.rer
  22.         result = [0] * len(rer)
  23.         for i, (cofactor) in rer:
  24.             q, r = divmod(total, cofactor)
  25.             total -= q * cofactor
  26.             result[i] = r
  27.         return result
  28.  
  29.  
  30. class IntCoder:
  31.     def __init__(self, *mm_ranges: Tuple[int, int]):
  32.         self.ranges: Tuple[Tuple[Tuple[int, int], int], ...] = tuple((mm, cf) for mm, cf in zip(mm_ranges, self._cofactors(mm_ranges)))
  33.  
  34.     def to_int(self, xs: List[int]) -> int:
  35.         return sum(cf * (x - xr_min) for (x, ((xr_min, _), cf)) in zip(xs, self.ranges))
  36.  
  37.     def from_int(self, x: int) -> List[int]:
  38.         t, rer = x, [(i, cf) for i, (_, cf) in enumerate(reversed(self.ranges))]
  39.         return [t // cf if (i := t % cf) == 0 else (t := t - i * cf, i)[1] for i, cf in rer]
  40.  
  41.     @staticmethod
  42.     def _cofactors(mm_ranges: Tuple[int, int]) -> List[int]:
  43.         cf = 1
  44.         for mm in mm_ranges:
  45.             yield cf
  46.             cf *= mm[1] - mm[0]
  47.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement