I want to share a small code kata I did tonight.
The kata
Transform a roman number "MCMLXXIV" into a decimal number: 1974. This kata is extracted from the XP french website (here).
What! Ruby is not perfect ?!
Another example of DiD,... In my implementation, I wanted to get access to all the characters of a string: "CIV" to ["C", "I", "V"].
So I grab the ruby doc and after a few searches on the web, I realize that no nice method such as String#chars or String#each allows to get the characters in an array (here's a ticket for that issue).
I had to resolve to my_string.split(//) which is not quite natural and expressive.
TDD of course
I used TDD to progress with my development:
assert_equal(1, r_to_i("I"))
then
assert_equal(2, r_to_i("II"))
...
and I was quite glad to get the right code fast enough. Ok, agreed, it is not rocket science. But small successes make a happy day.
Lessons learned
The interesting thing about code kata is the time to consider what has been done and how it has been done. Specifically I wondered about the possible use of an injecter to reduce the code (which was a question on the web site):
def r_to_i r
result = last = 0
r.reverse!.split(//).each{|n|
T[n] >= last ? result += T[n] : result -= T[n]
last = T[n]
}
result
end
[funny thing : copying-and-pasting the code on the blog, I found several ways to reduce the code size. However, I feel a comment is necessary on the algorithm. I may not be understandable at first sight,...]
But I don't how it is possible since injectors are repeatedly cumulating the same operation on elements of a collection. Anyway, it was a good pretext to re-read the paragraph on the subject in ProgrammingRuby.
Ok, back to hiraganas now (I am currently learning japanese,...)
No comments:
Post a Comment