# Enigmatic Code

Programming Enigma Puzzles

## Enigma 83: More letters for digits

From New Scientist #1226, 6th November 1980 [link]

Uncle Bungle has been doing a division sum with letters substituted for digits. Was it by accident or design, I wonder, that he left out the divisor?

What was left looked like this: Find the divisor and all the digits of the sum.

This puzzle is not only similar to Enigma 9, it is exactly the same puzzle.

[enigma83]

### One response to “Enigma 83: More letters for digits”

1. Jim Randell 23 April 2013 at 8:00 am

This puzzle is exactly the same as Enigma 9, so I thought I’d try a different approach to normal (see Enigma 80 and all the puzzles mentioned in my solution for my more usual approach) and used the [[ `SubstitutedSum()` ]] solver (from the enigma.py library) to attack it. It’s not the fastest way, but there are only three candidate solutions that make it through the initial check, and two of those are removed by the first check on the intermediate values, but I went ahead and put the checks in for all of the intermediate values to make sure the only viable solution is indeed correct. This Python program runs in 1.1s.

```from enigma import irange, SubstitutedSum, printf

# the divisor B is at most a 2-digit number as r x B = bp

for B in irange(2, 98):
P = SubstitutedSum(['rypyqz'] * B + ['d'], 'bdaypzb', d2i={0: 'rbpxyd'})
for S in P.solve():
# check the intermediate values
(y, r, p, d) = (S[X] for X in 'yrpd')
(bp, bd, pa, yrd, qz, rdd, rzb) = (int(P.substitute(S, X)) for X in ('bp', 'bd', 'pa', 'yrd', 'qz', 'rdd', 'rzb'))

# x only occurs in the intermediate values
# so compute it, and make sure it doesn't hit any existing values
x = (y * B) // 10
if x == 0 or x in S: continue
(xr, yx, yxy, xp) = (10 * x + r, 10 * y + x, 101 * y + x * 10, 10 * x + p)

# now check all the intermediate values
if not all((
r * B == bp,
bd - bp == p,
y * B == xr,
pa - xr == yx,
p * B == yrd,
yxy - yrd == x,
xp - xr == r,
qz * B == rdd,
rzb - rdd == d,
)): continue

printf("{A} / {B} = {D} r {d}", A=P.substitute(S, P.result), D=P.substitute(S, P.terms))
```

Solution: The correct sum is 6851496 ÷ 32 = 214109 remainder 8.

This site uses Akismet to reduce spam. Learn how your comment data is processed.