Sha256: 65a347b84a49ad9252ce0d30808c2fd7ddcfc2b63bbb1c0648491d1529205a3a

Contents?: true

Size: 1.21 KB

Versions: 69

Compression:

Stored size: 1.21 KB

Contents

defmodule Change do
  @doc """
    Determine the least number of coins to be given to the user such
    that the sum of the coins' value would equal the correct amount of change.
    It returns {:error, "cannot change"} if it is not possible to compute the
    right amount of coins. Otherwise returns the tuple {:ok, list_of_coins}

    ## Examples

      iex> Change.generate([5, 10, 15], 3)
      {:error, "cannot change"}

      iex> Change.generate([1, 5, 10], 18)
      {:ok, [1, 1, 1, 5, 10]}

  """

  @spec generate(list, integer) :: {:ok, list} | {:error, String.t()}
  def generate(coins, target) do
    coins |> Enum.sort(&>/2) |> generate(target, [], {:error, "cannot change"})
  end

  defp generate(_, _, current, {:ok, best}) when length(current) >= length(best) do
    {:ok, best}
  end

  defp generate(_, 0, current, _) do
    {:ok, current}
  end

  defp generate([], _, _, best) do
    best
  end

  defp generate([coin | coins], target, current, best) when coin > target do
    generate(coins, target, current, best)
  end

  defp generate([coin | coins], target, current, best) do
    first_try = generate([coin | coins], target - coin, [coin | current], best)
    generate(coins, target, current, first_try)
  end
end

Version data entries

69 entries across 69 versions & 1 rubygems

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