주어진 문자열이 유효한 ISBN에 맞는지 검증하는 문제였다. 길이 확인은 대시(-)만 빼고 하고, 값 검증은 무효한 글자를 모두 제외하고 해야 하는 부분이 약간 까다로웠다. 어렵지는 않고.
defmodule IsbnVerifier do
@doc """
Checks if a string is a valid ISBN-10 identifier
## Examples
iex> IsbnVerifier.isbn?("3-598-21507-X")
true
iex> IsbnVerifier.isbn?("3-598-2K507-0")
false
"""
@spec isbn?(String.t()) :: boolean
def isbn?(isbn) do
dash_removed = isbn |> String.replace("-", "")
only_numbers = isbn |> String.replace(~r/[^0-9X]/, "")
if String.length(dash_removed) == 10 and String.length(only_numbers) == 10 do
only_numbers
|> String.graphemes()
|> Enum.with_index()
|> Enum.map(fn
{"X", index} -> 10 * (10-index)
{d, index} -> String.to_integer(d) * (10-index)
end)
|> Enum.sum()
|> Kernel.rem(11)
|> Kernel.==(0)
else
false
end
end
end
'호두나무 공방 > Exercism in Elixir' 카테고리의 다른 글
Matching Brackets - Exercism in Elixir (0) | 2022.07.20 |
---|---|
House - Exercism in Elixir (0) | 2022.07.19 |
Grains - Exercism in Elixir (0) | 2022.07.14 |
Grade School - Exercism in Elixir (0) | 2022.07.01 |
Binary Search Tree - Exercism in Elixir (0) | 2022.06.30 |