To solve Cryptarithmetic Problem,a CSP(Constraint Satisfaction Problem) using Python
Input and OutputInput: This algorithm will take three words.
B A S E
B A L L
----------
G A M E S
Output: It will show which letter holds which number from 0 – 9. For this case it is like this.
B A S E 2 4 6 1
B A L L 2 4 5 5
--------- ---------
G A M E S 0 4 9 1 6
Algorithm
For this problem, we will define a node, which contains a letter and its corresponding values.
isValid(nodeList, count, word1, word2, word3)
Input − A list of nodes, the number of elements in the node list and three words.
Output − True if the sum of the value for word1 and word2 is same as word3 value.
Begin
m := 1
for each letter i from right to left of word1, do
ch := word1[i]
for all elements j in the nodeList, do
if nodeList[j].letter = ch, then
break
done
val1 := val1 + (m * nodeList[j].value)
m := m * 10
done
m := 1
for each letter i from right to left of word2, do
ch := word2[i]
for all elements j in the nodeList, do
if nodeList[j].letter = ch, then
break
done
val2 := val2 + (m * nodeList[j].value)
m := m * 10
done
m := 1
for each letter i from right to left of word3, do
ch := word3[i]
for all elements j in the nodeList, do
if nodeList[j].letter = ch, then
break
done
val3 := val3 + (m * nodeList[j].value)
m := m * 10
done
if val3 = (val1 + val2), then
return true
return false
End
SEND = 9567
MORE = 1085
# Exp No 8: Solve Cryptarithmetic Problem using Python
from itertools import permutations
def solve_cryptarithmetic(word1, word2, result): # Get unique letters letters = set(word1 + word2 + result) if len(letters) > 10: print("Too many unique letters, solution impossible!") return
letters = list(letters)
# Generate all possible digit assignments
for perm in permutations(range(10), len(letters)):
mapping = dict(zip(letters, perm))
# Skip if any word starts with 0
if mapping[word1[0]] == 0 or mapping[word2[0]] == 0 or mapping[result[0]] == 0:
continue
# Convert words to numbers using the mapping
num1 = sum(mapping[ch] * (10 ** i) for i, ch in enumerate(word1[::-1]))
num2 = sum(mapping[ch] * (10 ** i) for i, ch in enumerate(word2[::-1]))
num3 = sum(mapping[ch] * (10 ** i) for i, ch in enumerate(result[::-1]))
if num1 + num2 == num3:
print(f"{word1} = {num1}")
print(f"{word2} = {num2}")
print(f"{result} = {num3}")
print(f"Letter mapping: {mapping}")
return mapping
print("No solution found")
return None
solve_cryptarithmetic("SEND", "MORE", "MONEY")
MONEY = 10652
Thus a Cryptarithmetic Problem was solved using Python successfully