D
Dr. Pastor
Attempting to learn Python; I constructed the module
listed below. I would like to make it shorter, faster,
more "Python like". (Windows XP, Pro.)
Many thanks for any advice!
....
#-------------------------------------------------------------------------------
# Name: SendMoreMoney.py
# Purpose: A solution to the SEND+MORE=MONEY puzzle.
#
# Author: Dr. Pastor
#
# Copyright: (c) Dr. Pastor 2006
#-------------------------------------------------------------------------------
#!/usr/bin/env python
#
# The solution for the puzzle of
# SEND
# +MORE
# -----
# MONEY
#
def perm(items, n=None):
if n is None:
n = len(items)
for i in range(len(items)):
v = items[i:i+1]
if n == 1:
yield v
else:
rest = items[:i] + items[i+1:]
for p in perm(rest, n-1):
yield v + p
def comb(items, n=None):
if n is None:
n = len(items)
for i in range(len(items)):
v = items[i:i+1]
if n == 1:
yield v
else:
rest = items[i+1:]
for c in comb(rest, n-1):
yield v + c
#
# S E N D M O R Y
# ['0','1','2','3','4','5','6','7','8','9']
#
print
print "Selections of 8 items from 10 then the permutation of them."
print
b=0
for s in comb([0,1,2,3,4,5,6,7,8,9],8):
for a in perm(s,None):
if (a[4]*1000+a[5]*100+a[2]*10+a[1])*10+a[7] == \
(a[0]+a[4])*1000+(a[1]+a[5])*100+(a[2]+a[6])*10+(a[3]+a[1]):
b += 1
print ' SEND', ' ',a[0],a[1],a[2],a[3]
print ' MORE', ' ',a[4],a[5],a[6],a[1]
print ' ----', ' ---------'
print 'MONEY', '',a[4],a[5],a[2],a[1],a[7]
print
print "There are ", b, " solutions."
print
....
listed below. I would like to make it shorter, faster,
more "Python like". (Windows XP, Pro.)
Many thanks for any advice!
....
#-------------------------------------------------------------------------------
# Name: SendMoreMoney.py
# Purpose: A solution to the SEND+MORE=MONEY puzzle.
#
# Author: Dr. Pastor
#
# Copyright: (c) Dr. Pastor 2006
#-------------------------------------------------------------------------------
#!/usr/bin/env python
#
# The solution for the puzzle of
# SEND
# +MORE
# -----
# MONEY
#
def perm(items, n=None):
if n is None:
n = len(items)
for i in range(len(items)):
v = items[i:i+1]
if n == 1:
yield v
else:
rest = items[:i] + items[i+1:]
for p in perm(rest, n-1):
yield v + p
def comb(items, n=None):
if n is None:
n = len(items)
for i in range(len(items)):
v = items[i:i+1]
if n == 1:
yield v
else:
rest = items[i+1:]
for c in comb(rest, n-1):
yield v + c
#
# S E N D M O R Y
# ['0','1','2','3','4','5','6','7','8','9']
#
print "Selections of 8 items from 10 then the permutation of them."
b=0
for s in comb([0,1,2,3,4,5,6,7,8,9],8):
for a in perm(s,None):
if (a[4]*1000+a[5]*100+a[2]*10+a[1])*10+a[7] == \
(a[0]+a[4])*1000+(a[1]+a[5])*100+(a[2]+a[6])*10+(a[3]+a[1]):
b += 1
print ' SEND', ' ',a[0],a[1],a[2],a[3]
print ' MORE', ' ',a[4],a[5],a[6],a[1]
print ' ----', ' ---------'
print 'MONEY', '',a[4],a[5],a[2],a[1],a[7]
print "There are ", b, " solutions."
....