## Three Wise Men

### December 28, 2012

We have a simple Christmas puzzle today:

Three wise men named Caspar, Melchior and Balthazar went to Macy’s Department Store on 34th Street to buy gifts of gold, frankincense, and myrrh. When they took their gifts to the cashier, she multiplied the prices of the items and found a total price of \$65.52, but the wise men noticed that she multiplied the numbers and asked her to compute the total price again, but this time using addition instead of multiplication. When she did, the cashier found that the total was exactly the same. What were the individual prices of the three gifts?

Your task is to solve the puzzle and find the three prices. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.

Pages: 1 2

### 11 Responses to “Three Wise Men”

1. Paul said

A Python version.

```def three_wise_men(sumabc):
prodabc = sumabc * 10000
for a in xrange(1,sumabc // 3):
if prodabc % a == 0:
prodbc = prodabc // a
sumbc =sumabc - a
for b in xrange(a, sumbc // 2):
if prodbc % b == 0:
c = prodbc // b
if b + c == sumbc:
return a, b, c

print three_wise_men(6552)
```
2. […] today’s Programming Praxis exercise, our goal is to solve a puzzle in which both the addition and […]

```main :: IO ()
main = print \$ head [(a,b,c) | a <- [1..6550], b <- [1..a], let c = 6552 - a - b, a * b * c == 65520000]
```
4. […] Pages: 1 2 […]

5. Mark Henderson said

Takes a few minutes:

```def three_wise():
r = [x for x in range(1, 6553)]
return next((a, b, c) for a in r for b in r for c in reversed(r)
if a + b + c == 6552
if a * b * c == 65520000)

print three_wise()
```
6. Overpants said

This is an easier version of an earlier problem (https://programmingpraxis.com/2009/11/27/7-11/). Unlike the other problem, it seems that you can just brute force this one and still have it run fairly quickly.

7. cosmin said

Another Python solution:

```from math import sqrt, ceil

def divisors(n):
f = [i for d in xrange(1, 1 + int(sqrt(n))) if n%d == 0 for i in [d, n/d]]
if len(f) >= 2 and f[-1] == f[-2]: f.pop()
return f

def three_wise_men(x):
s, p = int(ceil(x*100)), int(ceil(x*1000000))
return [(a, b, c) for a in divisors(p) if a <= s/3 for b in divisors(p/a) for c in [p/a/b] if a<=b<=c and a+b+c == s]

print three_wise_men(65.52)
```
8. […] Question is from here: […]

9. Heather said

My fastest Ruby solution:

\$ time ruby wisemen.rb
[0.52, 2.0, 63.0]

real 0m1.919s
user 0m1.795s
sys 0m0.120s

```dollars = 65.52
cents = (dollars * 100).to_i

trips = []

i = 1
j = 1
halfcents = cents / 2
while true
k = cents - i - j
if k < j
i += 1
j = i
if (i >= halfcents) || (k < 2)
break
else
next
end
end
trips << [i, j, k]
j += 1
end

trips.each do |trip|
trip = trip.map { |t| t / 100.0 }
if trip.inject(:*) == dollars
puts trip.inspect
break
end
end
```