Ordering Products
Ron Adam
rrr at ronadam.com
Mon Jul 18 21:15:06 EDT 2005
Kay Schluehr wrote:
> Here might be an interesting puzzle for people who like sorting
> algorithms ( and no I'm not a student anymore and the problem is not a
> students 'homework' but a particular question associated with a
> computer algebra system in Python I'm currently developing in my
> sparetime ).
>
> For motivation lets define some expression class first:
This works for (simple) expressions with mixed multiplication and addition.
class F(list):
def __init__(self,*x):
#print '\nF:',x
list.__init__(self,x)
def __add__(self, other):
return A(self,other)
def __radd__(self, other):
return A(other,self)
def __mul__(self, other):
return M(self,other)
def __rmul__(self, other):
return M(other,self)
def __repr__(self):
return str(self[0])
def __order__(self):
for i in self:
if isinstance(i,A) \
or isinstance(i,M):
i.__order__()
self.sort()
class A(F):
def __init__(self, *x):
#print '\nA:',x
list.__init__(self, x)
def __repr__(self):
self.__order__()
return "+".join([str(x) for x in self])
class M(F):
def __init__(self,*x):
#print '\nM:',x
list.__init__(self,x)
def __repr__(self):
self.__order__()
return "*".join([str(x) for x in self])
a = F('a')
b = F('b')
c = F('c')
d = F('d')
print '\n a =', a
print '\n b+a+2 =', b+a+2
print '\n c*b+d*a+2 =', c*b+d*a+2
print '\n 7*a*8*9+b =', 7*a*8*9+b
>>>
a = a
b+a+2 = 2+a+b
c*b+d*a+2 = 2+a*d+b*c
7*a*8*9+b = 9*8*7*a+b <-- reverse sorted digits?
>>>
The digits sort in reverse for some strange reason I haven't figured out
yet, but they are grouped together. And expressions of the type a*(c+b)
don't work in this example.
It probably needs some better logic to merge adjacent like groups. I
think the reverse sorting my be a side effect of the nesting that takes
place when the expressions are built.
Having the digits first might be an advantage as you can use a for loop
to add or multiply them until you get to a not digit.
Anyway, interesting stuff. ;-)
Cheers,
Ron
More information about the Python-list
mailing list