summaryrefslogtreecommitdiffstats
path: root/libsolve.py
diff options
context:
space:
mode:
Diffstat (limited to 'libsolve.py')
-rw-r--r--libsolve.py57
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)