[Tutor] making math problems mmmm fun

max baseman dos.fool at gmail.com
Tue Sep 11 05:02:09 CEST 2007


wow this is a bit over my range of knowledge im impressed :) ill be  
happy to look at it but i think  i will see if i can end up writing  
my own :) worse case ill do it by hand will not take long hmm wow  
thanks :)


On Sep 10, 2007, at 8:47 PM, John Fouhy wrote:

> #######
> import operator
>
> binops = { 'add':operator.add,
>            'sub':operator.sub,
>            'mul':operator.mul,
>            'div':operator.truediv,
>            'pow':operator.pow,
>            'join':lambda x, y: int(str(x)+str(y))
>            }
>
> patterns = { 'add':'(%s) + (%s)',
>              'sub':'(%s) - (%s)',
>              'mul':'(%s) * (%s)',
>              'div':'(%s) / (%s)',
>              'pow':'(%s)^(%s)',
>              'join':'%s%s'
>              }
>
> def combine(digits):
>     """ digits :: set(int)
>
>     output :: [ (value, expression) ]
>       value :: int
>       expression :: str -- string representation of math expression
>     """
>
>     # We're going to solve this instance in terms of the solution
>     # for a list with one fewer digit.
>
>     # Because of non-commutativity, we have to do this twice for each
>     # possible start digit.
>
>     res = []
>
>     # Base case.
>     if len(digits) == 1:
>         return [(digit, str(digit)) for digit in digits]
>
>     # Otherwise..
>     for digit in digits:
>         remainder = digits - set([digit])
>
>         for val, exp in combine(remainder):
>             for binop in binops:
>                 if binop == 'join':
>                     # Ensure we only join numbers, not expressions.
>                     try:
>                         int(exp)
>                     except ValueError:
>                         continue
>
>                 try:
>                     newval1 = binops[binop](digit, val)
>                     pattern1 = patterns[binop] % (str(digit), exp)
>                     res.append((newval1, pattern1))
>                 except ZeroDivisionError:
>                     pass
>
>                 try:
>                     newval2 = binops[binop](val, digit)
>                     pattern2 = patterns[binop] % (exp, str(digit))
>                     res.append((newval2, pattern2))
>                 except ZeroDivisionError:
>                     pass
>
>     return res
>
> if __name__ == '__main__':
>     res = combine(set(range(1, 4)))

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/tutor/attachments/20070910/0e66d30b/attachment-0001.htm 


More information about the Tutor mailing list