Sha256: 85c2d190761a12b9140909d9204e1c810a16a070013d247e6cc6c14c31caa13a

Contents?: true

Size: 1.03 KB

Versions: 69

Compression:

Stored size: 1.03 KB

Contents

defmodule Hexadecimal do
  @base 16
  @hex_table String.split("0123456789abcdef", "", trim: true)
             |> Enum.with_index()
             |> Enum.into(%{})

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

    ## Examples

      iex> Hexadecimal.to_decimal("invalid")
      0

      iex> Hexadecimal.to_decimal("af")
      175

  """

  @spec to_decimal(binary) :: integer
  def to_decimal(hex) do
    if invalid?(hex) do
      0
    else
      hex
      |> String.downcase()
      |> String.reverse()
      |> String.split("", trim: true)
      |> hex_to_int(0, 0)
    end
  end

  defp invalid?(hex) do
    String.match?(hex, ~r/[^0-9a-fA-F]/)
  end

  defp hex_to_int([], acc, _), do: round(acc)

  defp hex_to_int([char | hex], acc, power) do
    acc = acc + Map.get(@hex_table, char) * :math.pow(@base, power)
    hex_to_int(hex, acc, power + 1)
  end
end

Version data entries

69 entries across 69 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.179 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.178 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.177 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.176 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.175 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.174 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.173 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.172 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.171 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.170 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.169 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.167 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.166 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.165 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.164 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.163 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.162 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.161 tracks/elixir/exercises/hexadecimal/example.exs
trackler-2.2.1.160 tracks/elixir/exercises/hexadecimal/example.exs