From: tamouse mailing lists Date: 2013-05-31T11:08:12+09:00 Subject: Re: Eloquent Ruby Kaprekar's Number On Thu, May 30, 2013 at 6:59 PM, Alphonse 23 wrote: > Which way is the eloquent ruby way to write this algorithm? > > Kaprekar Number > > 9 is a Kaprekar number since > 9 ^ 2 = 81 and 8 + 1 = 9 > > 297 is also Kaprekar number since > 297 ^ 2 = 88209 and 88 + 209 = 297. > > In short, for a Kaprekar number k with n-digits, if you square it and > add the right n digits to the left n or n-1 digits, the resultant sum is > k. > > !Spoiler Below! > > # way one > def kaprekar?(k) > ks = k**2 > lenf = (ks.to_s.length)-1 > lenh = (ks.to_s.length / 2) - 1 > a = ks.to_s[0..lenh].to_i > b = ks.to_s[lenh+1..lenf].to_i > k == (a+b) > end > > # way two > def kaprekar?(k) > a = (k**2).to_s[0..((((k**2).to_s.length) / 2) - 1)].to_i > b = (k**2).to_s[(((((k**2).to_s.length) / 2) - > 1)+1)..(((k**2).to_s.length)-1)].to_i > k == (a+b) > end > > # way three > def kaprekar?(k) > k == ((k**2).to_s[0..((((k**2).to_s.length) / 2) - > 1)].to_i)+((k**2).to_s[(((((k**2).to_s.length) / 2) - > 1)+1)..(((k**2).to_s.length)-1)].to_i) > end > > def simple_test(i) > if kaprekar?(i) == true then p "success on #{i}" else "fail on #{i}" > end > end > > simple_test(9) > simple_test(297) > > All three pass my tests, but which of the three would be considered the > most eloquent written ruby way? As in, which would be consider best > style-wise? The first takes up the most lines, but uses less nesting. > The last uses only one line but uses lots of nesting. > > -- > Posted via http://www.ruby-forum.com/. > This is the way I'd do it: def kaprekar?(k) n = k.to_s.length ks = (k*k).to_s l = ((n-1)-(n%2)) l = 0 if l < 0 nl = ks[0..l].to_i nr = ks[-n..-1].to_i k == nl + nr end I could not say if that's more rubyist or not, though. I imagine there is probably a way to use map/reduce and pass a block or something ;)