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:
Each week, I write an email about React. It's a collection of quotes, news, conference talks, and documentation curated be me to help you get up to speed on this exploding ecosystem. Join my subscribers today by subscribing to React Explained.