 # st3fan's solution

## to Binary in the Clojure Track

Published at Sep 19 2020 · 0 comments
Instructions
Test suite
Solution

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.

## Note

• Implement the conversion yourself. Do not use something else to perform the conversion for you.

Decimal is a base-10 system.

A number 23 in base 10 notation can be understood as a linear combination of powers of 10:

• The rightmost digit gets multiplied by 10^0 = 1
• The next number gets multiplied by 10^1 = 10
• ...
• The nth number gets multiplied by 10^(n-1).
• All these values are summed.

So: `23 => 2*10^1 + 3*10^0 => 2*10 + 3*1 = 23 base 10`

Binary is similar, but uses powers of 2 rather than powers of 10.

So: `101 => 1*2^2 + 0*2^1 + 1*2^0 => 1*4 + 0*2 + 1*1 => 4 + 1 => 5 base 10`.

## Source

All of Computer Science http://www.wolframalpha.com/input/?i=binary&a=*C.binary-_*MathWorld-

## Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

### binary_test.clj

``````(ns binary-test
(:require [clojure.test :refer [deftest is]]
binary))

(deftest binary-1-is-decimal-1
(is (= 1 (binary/to-decimal "1"))))

(deftest binary-10-is-decimal-2
(is (= 2 (binary/to-decimal "10"))))

(deftest binary-11-is-decimal-3
(is (= 3 (binary/to-decimal "11"))))

(deftest binary-100-is-decimal-4
(is (= 4 (binary/to-decimal "100"))))

(deftest binary-1001-is-decimal-9
(is (= 9 (binary/to-decimal "1001"))))

(deftest binary-11010-is-decimal-26
(is (= 26 (binary/to-decimal "11010"))))

(deftest binary-10001101000-is-decimal-1128
(is (= 1128 (binary/to-decimal "10001101000"))))

(deftest invalid-binary-is-decimal-0
(is (= 0 (binary/to-decimal "carrot"))))``````
``````(ns binary)

;; I wrote this function to split a number in its digits but then I
;; saw that the tests all use strings. So this is not used.

;; (defn digits [n]
;;   (loop [n n digits '()]
;;     (if (zero? n)
;;       digits
;;       (recur (quot n 10) (conj digits (mod n 10))))))

(defn pow [x n]
(int (Math/pow x n)))

(defn parse-digits [n]
(try
(doall (map #(Long/parseLong (str %)) n))
(catch NumberFormatException _)))

(defn to-decimal [n]
(let [digits (parse-digits n)]
(reduce + (map-indexed #(* %2 (pow 2 %1)) (reverse digits)))))``````