Begin forwarded message: > From: James Koppel <darmaniiii / yahoo.com> > Date: June 15, 2007 11:37:34 AM CDT > To: submission / rubyquiz.com, submission / rubyquiz.com > Subject: Please Forward: Ruby Quiz Submission > > Here is my solution to Ruby Quiz #128. It simply brute-forces the > problem, and thus is O(n!), where n is the number of distinct > letters. It took a little bit to output the correct (well, besides > being in a different order due to the hash) solution to send > +more=money, although on smaller problems it completed > (practically) instantaneously. > > Since eval does much of the work for it, it was trivial to make > this solution work for any mathematical expression. > > One significant speed improvement that occurred to me is to have > the base case be one level of recursion higher and calculate the > value of the last letter using simple algebra. However, that would > yield more complex code. > > def find_solution(expr) > expr = expr.sub('=','==') > chars = [] > expr.scan(/./){|c| chars |= [c] unless "*/%+-()=".include? c} > solution_helper chars, expr > end > > def solution_helper(rem_chars, expr, rem_nums=(0..9).to_a, > char_reps={}) > if rem_chars.empty? > return eval(expr.gsub(/./){|c| > (char_reps.keys.include? c) ? char_reps[c] : c}) ? > char_reps : nil > end > > rem_nums.each do |n| > next if n==0 && expr =~ /(^|[*\/%+\-(=])#{rem_chars[0]}/ > s = solution_helper(rem_chars[1..-1], expr, rem_nums - [n], > char_reps.merge({rem_chars[0]=>n})) > return s if s > end > nil > end > > find_solution(ARGV[0]).each_pair do |k,v| > puts "#{k}: #{v}" > end > > Choose the right car based on your needs. Check out Yahoo! Autos > new Car Finder tool.