On 08/12/2010 10:51 PM, John Posner wrote:
> On 8/12/2010 9:22 AM, Dave Angel wrote:
>>>
>>> Now you have to find the largest number below 120, which you can
>>> easily do with brute force
> 
> Dept of overkill, iterators/generators division ...
> 
> -John
> 
> #------------------
> from itertools import imap, product, ifilter
> from operator import mul
> 
> box_sizes = (6, 9, 20)
> 
> def sum_product(s1, s2):
>     """
>     return "scalar product" of two sequences
>     """
>     return sum(imap(mul, s1, s2))
> 
> def reachables(target):
>     """
>     return generator of numbers that are <= target
>     and are valid linear combos of McNuggets
>     """
>     candidate_box_counts = product(
>         xrange(target/box_sizes[0] + 1),
>         xrange(target/box_sizes[1] + 1),
>         xrange(target/box_sizes[2] + 1),
>     )

Couldn't this be rewritten as:
    candidate_box_counts = product(
         * [ xrange(target/sizes + 1) for size in box_sizes ]
     )

> 
>     gen = (sum_product(box_sizes, tup)
>               for tup in candidate_box_counts)
> 
>     return (ifilter(lambda val, tgt=target: val < tgt,
>                     gen))
> 
> if __name__ == "__main__":
>     tgt = 120 # thanks, Dave Angel
>     unreachables = set(xrange(tgt)) - set(reachables(tgt))
>     print "Max unreachable:", max(unreachables)

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to