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.
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)[…] today’s Programming Praxis exercise, our goal is to solve a puzzle in which both the addition and […]
My Haskell solution (see http://bonsaicode.wordpress.com/2012/12/28/programming-praxis-three-wise-men/ for a version with comments):
[…] Pages: 1 2 […]
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()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.
Another Python solution:
[…] Question is from here: […]
My java solution here
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[…] The task: […]