diff options
author | tanyaionova <isaqtm@gmail.com> | 2019-11-21 20:57:37 +0300 |
---|---|---|
committer | tanyaionova <isaqtm@gmail.com> | 2019-11-21 20:57:37 +0300 |
commit | ea43333d6af8f30c63ff49baaa9911011c3b695b (patch) | |
tree | 6b4c2ada01b524732f09b8f16e3338fdd327f2a3 /libsolve.py | |
parent | 7360c0ae23653ff0fddec16f91f5eaed88529dfb (diff) | |
download | alg2-ea43333d6af8f30c63ff49baaa9911011c3b695b.tar.gz |
Extract renderer
Diffstat (limited to 'libsolve.py')
-rw-r--r-- | libsolve.py | 57 |
1 files changed, 14 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) |