# [Tutor] Ingenious script (IMO)

Kent Johnson kent37 at tds.net
Mon Aug 6 15:49:44 CEST 2007

```Dick Moores wrote:
> http://www.rcblue.com/Python/changeMaker_revised_for_US_denominations.py
>
> I'm still working at Python--been at it a while--and thought the
> script was ingenious. Do the Tutors agree? Or is it just
> run-of-the-mill programming? Could it have been more simply written?

I don't find it either ingenious or well-written. The algorithm is the
same one you would use to count out an amount by hand so it doesn't seem
so unusual. IMO the code relies too much on indices. If you rewrite it
using a dict (or, even better, defaultdict(int)) for coinCount, there is
no need for indices at all. Even with coinCount as a list, it could be
better written.

coinCount = []
for d in denominations:
coinCount.append(0)

=>

coinCount = [0] * ndenominations

The main loop could be
for deno in range(ndenominations):
if not remaining:
break

or
for i, deno in enumerate(denominations):
# i is now the index, deno is the actual denomination

but I would write it this way and avoid the use of the index completely:

from collections import defaultdict
coinCount = defaultdict(int)
remaining = change

#   Loop until either we have given all the change or we have
#   run out of coin denominations to check.
for deno in denominations:
if not remaining:
break

#   For one denomination, count out coins of that denomination
#   as long as the remaining amount is greater than the denomination
#   amount.

while remaining >= deno:
coinCount[deno] += 1
print "remaining =", remaining
remaining -= deno

#   Report the results.
print "Your change is \$%.02f"% (float(change) / CPD)
for deno in denominations:
if coinCount[deno] > 0:
if deno >= 100:
print "\$%d bills:\t" % (deno / CPD), coinCount[deno]
else:
print "%d-cent coins:\t" % (deno), coinCount[deno]

Kent
```