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 […]

  3. My Haskell solution (see for a version with comments):

    main :: IO ()
    main = print $ head [(a,b,c) | a <- [1..6550], b <- [1..a], let c = 6552 - a - b, a * b * c == 65520000]
  4. 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()
  5. Overpants said

    This is an easier version of an earlier problem ( Unlike the other problem, it seems that you can just brute force this one and still have it run fairly quickly.

  6. 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)
  7. 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)
      trips << [i, j, k]
      j += 1
    trips.each do |trip|
      trip = { |t| t / 100.0 }
      if trip.inject(:*) == dollars
        puts trip.inspect

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: