Begin forwarded message: > From: James Koppel <darmaniiii / yahoo.com> > Date: April 1, 2007 8:04:18 PM CDT > To: submission / rubyquiz.com, submission / rubyquiz.com > Subject: Solution to #118 > > Following is a solution to Ruby Quiz #118. It implements the basic > requirement, time-tolerance, and changeable button dimensions (by > changing $w and $h in the source code). Note that some of its > answers are different from the examples, as I am used to microwaves > that only allow two digits for the seconds... > > $buttons = ['1','2','3', > '4','5','6', > '7','8','9', > nil,'0','*'] > > $w = 1 > $h = 1 > > def microwave(seconds, tolerance) > combinations = [] > low = [seconds - tolerance, 0].max > high = seconds + tolerance > Range.new(low,high).each do |t| > combinations << ((t / 60).floor.to_s + (t % 60).to_s.sub(/^ > ([0-9])$/, '0\1') + '*') > combinations << ((t / 60 - 1).floor.to_s + (t % 60 + 60).to_s + > '*') if t % 60 < 40 > end > combinations.collect! {|c| c.gsub(/^0/,"")} > efficiency = combinations.collect {|comb| computeTotalDistance > (comb)} > combinations[efficiency.index(efficiency.min)] > end > > def computeTotalDistance(comb) > distance = 0 > lastChar = nil > comb.each_char do |c| > distance += computeDistance(lastChar + c) if lastChar > lastChar = c > end > distance > end > > def computeDistance(comb) > c1, c2 = comb[0,1], comb[1,1] > x1, y1 = $buttons.index(c1) % 3 * $w, ($buttons.index(c1) / > 3).floor * $h > x2, y2 = $buttons.index(c2) % 3 * $w, ($buttons.index(c2) / > 3).floor * $h > ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5 > end > > puts "Enter number of seconds to microwave, followed by the tolerance" > puts "The most efficient key-pattern is " + microwave > (gets.chomp.to_i, gets.chomp.to_i) > > Don't be flakey. Get Yahoo! Mail for Mobile and > always stay connected to friends.