From d6b9c49402932dfeb2c7a8ce190ab7592a8d95a0 Mon Sep 17 00:00:00 2001 From: Mikael Fangel <34864484+MikaelFangel@users.noreply.github.com> Date: Sun, 13 Oct 2024 14:04:39 +0200 Subject: [PATCH 1/3] Simplify digits --- lib/elixir/lib/integer.ex | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/elixir/lib/integer.ex b/lib/elixir/lib/integer.ex index 40b0232a28a..6a7f3ff7b95 100644 --- a/lib/elixir/lib/integer.ex +++ b/lib/elixir/lib/integer.ex @@ -189,13 +189,14 @@ defmodule Integer do @spec digits(integer, pos_integer) :: [integer, ...] def digits(integer, base \\ 10) when is_integer(integer) and is_integer(base) and base >= 2 do - do_digits(integer, base, []) + digits(integer, base, []) end - defp do_digits(integer, base, acc) when abs(integer) < base, do: [integer | acc] + defp digits(0, _base, []), do: [0] + defp digits(0, _base, acc), do: acc - defp do_digits(integer, base, acc), - do: do_digits(div(integer, base), base, [rem(integer, base) | acc]) + defp digits(integer, base, acc), + do: digits(div(integer, base), base, [rem(integer, base) | acc]) @doc """ Returns the integer represented by the ordered `digits`. From 1a97884821d7e42a2861d38bff049febf355bd97 Mon Sep 17 00:00:00 2001 From: Mikael Fangel <34864484+MikaelFangel@users.noreply.github.com> Date: Sun, 13 Oct 2024 14:06:59 +0200 Subject: [PATCH 2/3] Simplify undigits --- lib/elixir/lib/integer.ex | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/elixir/lib/integer.ex b/lib/elixir/lib/integer.ex index 6a7f3ff7b95..42612b5e03f 100644 --- a/lib/elixir/lib/integer.ex +++ b/lib/elixir/lib/integer.ex @@ -218,16 +218,16 @@ defmodule Integer do """ @spec undigits([integer], pos_integer) :: integer def undigits(digits, base \\ 10) when is_list(digits) and is_integer(base) and base >= 2 do - do_undigits(digits, base, 0) + undigits(digits, base, 0) end - defp do_undigits([], _base, acc), do: acc + defp undigits([], _base, acc), do: acc - defp do_undigits([digit | _], base, _) when is_integer(digit) and digit >= base, + defp undigits([digit | _], base, _) when is_integer(digit) and digit >= base, do: raise(ArgumentError, "invalid digit #{digit} in base #{base}") - defp do_undigits([digit | tail], base, acc) when is_integer(digit), - do: do_undigits(tail, base, acc * base + digit) + defp undigits([digit | tail], base, acc) when is_integer(digit), + do: undigits(tail, base, acc * base + digit) @doc """ Parses a text representation of an integer. From b25e35b6edcb2f192210a1da595e066b0054e04e Mon Sep 17 00:00:00 2001 From: Mikael Fangel <34864484+MikaelFangel@users.noreply.github.com> Date: Sun, 13 Oct 2024 15:03:10 +0200 Subject: [PATCH 3/3] Check for base case in digits/2 instead of digits/3 --- lib/elixir/lib/integer.ex | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/elixir/lib/integer.ex b/lib/elixir/lib/integer.ex index 42612b5e03f..b371459aa62 100644 --- a/lib/elixir/lib/integer.ex +++ b/lib/elixir/lib/integer.ex @@ -189,10 +189,12 @@ defmodule Integer do @spec digits(integer, pos_integer) :: [integer, ...] def digits(integer, base \\ 10) when is_integer(integer) and is_integer(base) and base >= 2 do - digits(integer, base, []) + case integer do + 0 -> [0] + _integer -> digits(integer, base, []) + end end - defp digits(0, _base, []), do: [0] defp digits(0, _base, acc), do: acc defp digits(integer, base, acc),