Hello.
Trying to solve this problem I wrote the following algorithm:
string = "3340c9571y40m47ku49t9315mrvzqo667k36e"
# %{
# "c" => 1,
# "e" => 1,
# "k" => 2,
# "m" => 2,
# "o" => 1,
# "q" => 1,
# "r" => 1,
# "t" => 1,
# "u" => 1,
# "v" => 1,
# "y" => 1,
# "z" => 1
# }
# [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1]
# Expected result => 14
def is_numeric?(char) do
Regex.match?(~r/^\d+$/, char)
end
def total_non_numeric_chars(string) do
String.codepoints(string)
|> Enum.reduce(%{}, fn char, acc ->
cond do
!is_numeric?(char) ->
if Map.has_key?(acc, char),
do: Map.update!(acc, char, &(&1 + 1)),
else: Map.put(acc, char, 1)
true ->
acc
end
end)
|> Map.values()
|> Enum.sum()
end
I would like to know if is possible to avoid the nested cond and if with some patter matching or other technique.
Any suggestions to improve the algorithm is welcome.
Thanks.