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 = (k2).to_s[0…((((k2).to_s.length) / 2) - 1)].to_i
b = (k2).to_s[(((((k2).to_s.length) / 2) -
1)+1)…(((k**2).to_s.length)-1)].to_i
k == (a+b)
end
way three
def kaprekar?(k)
k == ((k2).to_s[0…((((k2).to_s.length) / 2) -
1)].to_i)+((k2).to_s[(((((k2).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.