diff options
-rw-r--r-- | libsolve.py | 57 | ||||
-rw-r--r-- | render.py | 45 |
2 files changed, 59 insertions, 43 deletions
diff --git a/libsolve.py b/libsolve.py index d932dd6..61d7f40 100644 --- a/libsolve.py +++ b/libsolve.py @@ -7,31 +7,28 @@ from itertools import zip_longest def is_scalar(obj): return isinstance(obj, (Fraction, int)) + POLY_COLOR = None # POLY_COLOR = '36' # Uncomment to have color -# may not work. see -# https://en.wikipedia.org/wiki/Unicode_subscripts_and_superscripts -# to test with your font -superscripts = '⁰¹²³⁴⁵⁶⁷⁸⁹' # must be <sup>0123456789</sup> - +class PolyRenderBase: + def render(self, poly: Poly) -> str: + raise NotImplementedError() -def int2sup(n): - res = [] - while n > 0: - res.append(superscripts[n % 10]) - n //= 10 - return ''.join(reversed(res)) + def hint(self, poly: Poly) -> int: + raise NotImplementedError() class Poly: - def __init__(self, vec: Iterable, letter='x'): + def __init__(self, vec: Iterable, letter='x', renderer=None): ''' vec: big-endian coefficients ''' + from render import UnicodeRender self.vec = list(vec) self.letter = letter + self.renderer = renderer or UnicodeRender() self._trim_zeros() def _trim_zeros(self): @@ -106,36 +103,10 @@ class Poly: del self.vec[0] def __repr__(self): - return self.get_hint() + return self.renderer.render(self) - def get_hint(self): - ''' - Get raw text hints for outer structures to align items - ''' - rev = list(reversed(self.vec)) - if all(r == 0 for r in rev): - return '0' - d = self.deg() - res = [] - for i in range(len(rev)): - if rev[i] == 0: - continue - if i == 0: - if rev[i] < 0: - res.append('-') - else: - if rev[i] < 0: - res.append(' - ') - else: - res.append(' + ') - - if abs(rev[i]) != 1 or i == d: - res.append(str(abs(rev[i]))) - if i != d: - res.append(self.letter) - if d - i != 1: - res.append(int2sup(d - i)) - return ''.join(res) + def hint(self): + return self.renderer.hint(self) class Row: @@ -197,7 +168,7 @@ class Row: ''' Get hints for other structures to align items ''' - return [len(el.get_hint()) for el in self.lst] + return [el.hint() for el in self.lst] def set_hints(self, hints): ''' @@ -274,7 +245,7 @@ class Matrix: raise e return res - + def __sub__(self, oth): return self + (-oth) diff --git a/render.py b/render.py new file mode 100644 index 0000000..6cd3c7d --- /dev/null +++ b/render.py @@ -0,0 +1,45 @@ +from libsolve import Poly, PolyRenderBase + + +class UnicodeRender(PolyRenderBase): + def __init__(self): + # may not work. see + # https://en.wikipedia.org/wiki/Unicode_subscripts_and_superscripts + # to test with your font + self.sup = '⁰¹²³⁴⁵⁶⁷⁸⁹' # must be <sup>0123456789</sup> + + def render(self, poly: Poly) -> str: + rev = list(reversed(poly.vec)) + if all(r == 0 for r in rev): + return '0' + d = poly.deg() + res = [] + for i in range(len(rev)): + if rev[i] == 0: + continue + if i == 0: + if rev[i] < 0: + res.append('-') + else: + if rev[i] < 0: + res.append(' - ') + else: + res.append(' + ') + + if abs(rev[i]) != 1 or i == d: + res.append(str(abs(rev[i]))) + if i != d: + res.append(poly.letter) + if d - i != 1: + res.append(self._int2sup(d - i)) + return ''.join(res) + + def hint(self, poly: Poly) -> int: + return len(self.render(poly)) + + def _int2sup(self, n): + res = [] + while n > 0: + res.append(self.sup[n % 10]) + n //= 10 + return ''.join(reversed(res)) |