looping through possible combinations of McNuggets packs of 6, 9 and 20

News123 news1234 at free.fr
Thu Aug 12 22:35:12 CEST 2010


One more small tip to verify whether your code is working:


On 08/12/2010 10:28 PM, News123 wrote:
> Hi Baba,
Your code, but returning the result as  suggested in my preious post:


> def can_buy(n_nuggets):
>    for a in range (1,n_nuggets):
>        for b in range (1,n_nuggets):
>            for c in range (1,n_nuggets):
>                 print "trying for %2d: %2d %2d %2d" % (n,a,b,c)
>                if 6*a+9*b+20*c==n_nuggets:
>                    return [a,b,c]
>                else:
>                    return []


>
# show the results for the first 50 numbers.
# and verify whether it's true

for n in xrange(50):
    result = can_buy(n) # get the result (see Brian's commen
    print("result of can_buy(%2d) is %s" % (n,result))
    if result:
        a,b,c = result
        if a*6+b*9+c*12 != n:
            print "ERROR: can_buy() gives wrong result"

Alternatively you can use a nice python feature called asserts

assert statements can be used to vrify whether your code works as expected.
Nothing will be printed if the assertion is correct otherwise your
program will abort and print the assertion error:


Example:
for n in xrange(50):
    result = can_buy(n) # get the result (see Brian's commen
    print("result of can_buy(%2d) is %s" % (n,result))
    if result:
        a,b,c = result
        assert  a*6+b*9+c*12 == n




> 
> 
> with the print statement in can_buy() you should immediately see some
> issues.
> as soon as can_buy seems to work, you could comment the print statement.
> 
> 
> Additionally:
> I would return [a,b,c] if you got a result
> and [] if you got no result.
> 
> So you don't only seem whether you can buy n nuggets, but you can also
> see how (AND even verify the solution)
> 
> 
> the print statement should show you what Peter said.
> You just make one test and return immediately in the else statement
> 
> Instead you should continue until you found a solution or until you
> tried all possibilities.
> 
> After having fixed the fact, that you don't try all options, you'll see
> that your first success would be with 6+9+12 = 27 nuggets es you never
> try with 0 boxes of a kind. (as Peter mentioned)
> 
> Finally as Roald says.
> 
> if you can reduce the upper limit of your search ranges.
> if you have for example 13 nuggets you do not have to try 3 boxes of 6
> as this is already 18, so trying only 0,1 or two boxes is enough
> 
> 
> 
> 
> 
> 
> 
> You will now also see, what
> On 08/12/2010 09:42 PM, Roald de Vries wrote:
>>
>> On Aug 12, 2010, at 9:02 PM, Peter Otten wrote:
>>
>>> Baba wrote:
>>>
>>>
>>>> Thank You for helping me out. Indeed i am not looking for the code but
>>>> rather for hints that direct my reasoning as well as hints as to how
>>>> to write basic programs like this.
>>>>
>>>> You have broken down the approach into 2 parts. I have tried to solve
>>>> part 1 but i'm not quite there yet. Here's my code:
>>>>
>>>> def can_buy(n_nuggets):
>>>>    for a in range (1,n_nuggets):
>>>>        for b in range (1,n_nuggets):
>>>>            for c in range (1,n_nuggets):
>>>>                if 6*a+9*b+20*c==n_nuggets:
>>>>                    #print a,b,c,'n_nuggets=',n_nuggets
>>>>                    return True
>>>>                else:
>>>>                    return False
>>>>
>>>>
>>>> can_buy(55)
>>>>
>>>> as you can see i am trying to loop through all combinations of values
>>>> bewtween 1 and n_nuggets and when the equation resolves it should
>>>> return True, else it should return False.
>>>>
>>>> I was hoping that when i then call my function and ask it to test a
>>>> value nothing happens. What is wrong? My syntax? My semantic? Both?
>>>
>>> First, the function gives up too early; it should only return False
>>> when all
>>> combinations of a, b, c (technically: the product of the ranges) have
>>> been
>>> tried.
>>>
>>> Second, can_buy(0) should return True, but the solution 0*6 + 0*9 +
>>> 0*20 is
>>> never tried; fix your ranges accordingly.
>>
>> Moreover: a, b and c can range over n_nuggets/6, n_nuggets/9 and
>> n_nuggets/20 respectively. This will work, but does too much work.
>>
>> Cheers, Roald
>>
> 




More information about the Python-list mailing list