Wednesday, April 04, 2007

Brain Teaser: Solve This Math Word Puzzle

I came across this piece of puzzle today and then I decided to abandon my project and write a solution for it:

Each letter stands for a 1-digit number. No two letters may stand for the same number. Find a value for each letter from the following set: 0, 1, 4, 5, 6, 7, 8, 9.

'' ASK




The answer can be found here.

The concept is simple but the code is more verbose than what I thought... here is my python solution. Can anyone achieve one that is less verbose?

def permutation(num_list):

if (len(num_list) == 1 or len(num_list) == 0):
return [num_list];
permutation_list = [];

for i in range(len(num_list)):
list_copy = num_list * 1 # deep copy
item = list_copy.pop(i)
one_less_perm_list = permutation(list_copy)
for j in range(len(one_less_perm_list)):
permutation_list.append([item]+ one_less_perm_list[j])
return permutation_list

def solve_puzzle():

combination = permutation([0, 1, 4, 5, 6, 7, 8, 9])
var_list = ['A', 'S', 'K', 'G', 'V', 'E', 'D', 'U']

for i in range(len(combination)):
assignment = combination[i]
set_of_answer = dict([(var_list[j], assignment[j]) for j in range(len(var_list))])
if set_of_answer['G'] + 1 != set_of_answer['U']:
if (set_of_answer['A']*2)%10 != set_of_answer['S'] and (set_of_answer['A']*2)%10 != set_of_answer['S']-1 :
if set_of_answer['K']==0 or set_of_answer['E']==0:
ret = set_of_answer['K'] + set_of_answer['E']
if (ret%10 != set_of_answer['D']):

carryover = ret/10
ret = set_of_answer['S'] + set_of_answer['V'] + carryover
if (ret%10 != set_of_answer['E']):

carryover = ret/10
ret = set_of_answer['A']*2 + carryover
if (ret%10 != set_of_answer['S']):
print set_of_answer

print solve_puzzle()

But amazingly the PowerShell solution is so elegant! Too bad that it's not yet available to Vista and...wouldn't be open-sourced to Unix. Or else we can get ride of Bash or C-shell! Guess that this day won't come in near future...

No comments: