# thekeele's solution

## to Hexadecimal in the Elixir Track

Published at Nov 14 2019 · 0 comments
Instructions
Test suite
Solution

Convert a hexadecimal number, represented as a string (e.g. "10af8c"), to its decimal equivalent using first principles (i.e. no, you may not use built-in or external libraries to accomplish the conversion).

On the web we use hexadecimal to represent colors, e.g. green: 008000, teal: 008080, navy: 000080).

The program should handle invalid hexadecimal strings.

## Running tests

Execute the tests with:

\$ mix test

### Pending tests

In the test suites, all but the first test have been skipped.

Once you get a test passing, you can unskip the next one by commenting out the relevant @tag :pending with a # symbol.

For example:

# @tag :pending
test "shouting" do
assert Bob.hey("WATCH OUT!") == "Whoa, chill out!"
end

Or, you can enable all the tests by commenting out the ExUnit.configure line in the test suite.

# ExUnit.configure exclude: :pending, trace: true

If you're stuck on something, it may help to look at some of the available resources out there where answers might be found.

## Source

All of Computer Science http://www.wolframalpha.com/examples/NumberBases.html

## Submitting Incomplete Solutions

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

use ExUnit.Case

test "returns 1 when hex is 1" do
end

@tag :pending
test "returns 12 when hex is c" do
end

@tag :pending
test "hexadecimal is case insensitive" do
end

@tag :pending
test "returns 16 when hex is 10" do
end

@tag :pending
test "returns 175 when hex is af" do
end

@tag :pending
test "returns 256 when hex is 100" do
end

@tag :pending
test "returns 105_166 when hex is 19ace" do
end

@tag :pending
test "returns 0 when hex is invalid" do
end

@tag :pending
test "returns 0 when hex represents black" do
end

@tag :pending
test "returns 16_777_215 when hex represents white" do
end

@tag :pending
test "returns 16_776_960 when hex represents yellow" do
end
end

### test_helper.exs

ExUnit.start()
ExUnit.configure(exclude: :pending, trace: true)
@hex_alphabet %{
"a" => 10, "A" => 10, "b" => 11, "B" => 11, "c" => 12, "C" => 12,
"d" => 13, "D" => 13, "e" => 14, "E" => 14, "f" => 15, "F" => 15,
}

@spec to_decimal(binary) :: integer
def to_decimal(hex) do
if Regex.match?(~r/^[a-fA-F0-9]*\$/, hex), do: from_hex(hex), else: 0
end

defp from_hex(""), do: 0
defp from_hex(<<char::binary-size(1), rest::binary>> = hex) do
from_hex(rest) + (to_integer(char) * pow(String.length(hex) - 1))
end

defp to_integer(char) do
if char in Map.keys(@hex_alphabet), do: @hex_alphabet[char], else: String.to_integer(char)
end

defp pow(exp, base \\ 16), do: base |> :math.pow(exp) |> round()
end