summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortanyaionova <isaqtm@gmail.com>2019-11-21 20:57:37 +0300
committertanyaionova <isaqtm@gmail.com>2019-11-21 20:57:37 +0300
commitea43333d6af8f30c63ff49baaa9911011c3b695b (patch)
tree6b4c2ada01b524732f09b8f16e3338fdd327f2a3
parent7360c0ae23653ff0fddec16f91f5eaed88529dfb (diff)
downloadalg2-ea43333d6af8f30c63ff49baaa9911011c3b695b.tar.gz
Extract renderer
-rw-r--r--libsolve.py57
-rw-r--r--render.py45
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))