May 04, 2017 • 2 min read
This week I wrote a small algorithm in Ruby to convert binary numbers into decimal numbers. Here’s the problem description, from Exercism.io:
Convert a binary number, represented as a string (e.g. ‘101010’), to its decimal equivalent using first principles. Implement binary to decimal conversion. Given a binary input string, your program should produce a decimal output. The program should handle invalid inputs.
And here is my code:
class Binary def self.to_decimal(string) raise ArgumentError if string.match?(/[^01]/) string.reverse.chars.map.with_index do |digit, index| digit.to_i * 2**index end.sum end end
What’s going on here? Examining each line:
Binary, a container for our code.
ArgumentErrorif the string does not match the binary format we expect.
I like that my solution matches for
ArgumentError positively, covering a
range of bad inputs not specified by the test cases. I like that it reverses
the string so that
index can be used as the incrementing exponent. And, I
like that it uses
.map to return a result without an accumulator variable.
I do not love that my solution takes an argument called
that’s the type the method expects, it doesn’t tell the reader a lot about what
this method does. If I could rewrite it, I’d name that variable something like
My solution is also a bit clever; I may have golfed this down a little too much. In general, I think mathematical functions can get away with terser syntax than ordinary functions, because the mathematical principles are easy to learn about with a quick Google search.
Thanks Exercism.io for this fun challenge, and thanks for reading! Here’s the permalink to my solution:
Did you enjoy this post? Follow me on Twitter for more.