호두나무 공방/Exercism in Elixir

ISBN Verifier - Exercism in Elixir

2022. 7. 18. 22:38

문제 보기

주어진 문자열이 유효한 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