On Fri, 02 May 2008 10:28:00 -0500, Matthew Moss wrote: > This is a fairly simple quiz this week, as I'm in the middle of putting > together a new website to replace the existing RQ2 website, which was > supposed to be temporary. Hopefully the new one should be in place next > week. > > -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- > > The three rules of Ruby Quiz 2: > > 1. Please do not post any solutions or spoiler discussion for this quiz > until 48 hours have passed from the time on this message. > > 2. Support Ruby Quiz 2 by submitting ideas as often as you can! (A > permanent, new website is in the works for Ruby Quiz 2. Until then, > please visit the temporary website at > > <http://matthew.moss.googlepages.com/home>. > > 3. Enjoy! > > Suggestion: A [QUIZ] in the subject of emails about the problem helps > everyone on Ruby Talk follow the discussion. Please reply to the > original quiz message, if you can. > > -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- > > Quiz #161 > Reverse Divisible Numbers > > This week's quiz is borrowed from Jon Galloway (http://tinyurl.com/ > 5jvf37). > Don't read the comments or solution there without trying this first! > > Your task is to write a bit of Ruby code that will find and report all > integers that are divisible by their reverse. For example, 9801 is > divisible by 1089. > > Your script should accept a single, optional argument to specify the > upper > limit of your search. If not provided, the default should be one > million. > > There are two extra rules for finding these "reverse divisible" numbers: > > 1. Don't count palindromes; they are obviously reverse-divisible. 2. > Don't count numbers ending with zero. Reversing such numbers forces you > to drop leading zeros on the divisor, and that's not as much fun. Everyone's posted benchmarks, but nobody's posted code yet. It's been more than 48 hours, so I guess I'll start. MAX=1_000_000 #we want pairs of reverse,num where num.to_s==reverse.to_s.reverse and #num*multiplier == reverse for some integer multiplier where #multiplier >= 2 # #if multiplier is a fraction, then we would swap num and reverse to get an #integer, so we'll do it in one direction only # #if multiplier is 1, then num is a palindrome # #if the most significant digit of num > 4 then all num*multiplier #have more digits than reverse has, so we need not check those DIGITS=(Math.log10(MAX)).to_i ranges=(0..DIGITS).collect{ |digits| 10**digits ... 5*10**digits} ranges[-1]=ranges[-1].begin..MAX if MAX < ranges[-1].end ranges.each do |range| range.each do |num| ns=num.to_s reverse=ns.reverse.to_i next if num==reverse next if ns[-1,1]=='0' next unless (reverse/num)*num==reverse puts "#{num} * #{reverse/num} = #{reverse}" end end -- Ken (Chanoch) Bloom. PhD candidate. Linguistic Cognition Laboratory. Department of Computer Science. Illinois Institute of Technology. http://www.iit.edu/~kbloom1/