# paulfioravanti's solution

## to Hexadecimal in the Elixir Track

Published at Aug 25 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.

``````defmodule HexadecimalTest do
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)``````
``````defmodule Hexadecimal do
@hex_digits '0123456789ABCDEF'
@hex_string ~r/\A[#{@hex_digits}]+\z/
@base 16
@invalid_value 0

@doc """
Accept a string representing a hexadecimal value and returns the
corresponding decimal value.
It returns the integer 0 if the hexadecimal is invalid.
Otherwise returns an integer representing the decimal value.

## Examples

0

175

"""
@spec to_decimal(binary) :: integer
def to_decimal(hex) do
hex = String.upcase(hex)

if String.match?(hex, @hex_string) do
hex
|> String.to_charlist()
|> Enum.reverse()
|> Enum.with_index()
else
@invalid_value
end
end

acc +
Enum.find_index(@hex_digits, &(&1 == hex_char)) *
:math.pow(@base, index)
end
end``````