Hi,

I read this xkcd strip the other day (http://www.xkcd.com/c287.html)  
and, of course, had to solve it. So I whipped up a quick bit of Ruby  
code that gave me the answers. Took about 5 minutes and then I was  
happy. Except I wasn't, because I looked at what I'd written. Ugly  
and not dry at all, sopping wet even; basically six nested loops.  
I'll try to reproduce it below.

Trouble is, I then spend the best part of an afternoon (don't tell my  
boss ;-) trying to solve it elegantly, but couldn't. I did come up  
with other ways that worked, but they were pretty cumbersome and slow.

There has to be a 'ruby way' to do this. Any suggestions?

Cheers,
Dave

here's a rough approximation of the code I wrote:

menu= [2.15, 2.75, 3.35, 3.55, 4.20, 5.80]
target= 15.05
0.upto(target/menu[0].to_i) do |a|
   0.upto(target/menu[1].to_i) do |b|
     0.upto(target/menu[2].to_i) do |c|
       0.upto(target/menu[3].to_i) do |d|
         0.upto(target/menu[4].to_i) do |e|
           0.upto(target/menu[5].to_i) do |f|
             if ((total= a*menu[0] +
               b*menu[1] +
               c*menu[2] +
               d*menu[3] +
               e*menu[4] +
               f*menu[5]) - target).abs<0.01 then
               puts "\n#{a} * $#{menu[0]}"
               puts "#{b} * $#{menu[1]}"
               puts "#{c} * $#{menu[2]}"
               puts "#{d} * $#{menu[3]}"
               puts "#{e} * $#{menu[4]}"
               puts "#{f} * $#{menu[5]}"
               puts "---------------\n    $#{total}"
             end
           end
         end
       end
     end
   end
end