호두나무 공방/Exercism in Elixir

Raindrops - Exercism in Elixir

2022. 6. 3. 22:49

문제 보기

FizzBuzz에서 factor가 하나 더 추가된 문제. 다른 사람들의 풀이를 보니 전부 다 제각각이라 제법 보는 재미가 있었다. 내 경우에는 이후 확장을 조금 더 자유롭게 할 수 있게끔 나누는 수와 메시지를 인자로 전달하도록 구현했다.

defmodule Raindrops do
  @spec convert(pos_integer) :: String.t()
  def convert(number) do
    {number, ""}
    |> divide(3, "Pling")
    |> divide(5, "Plang")
    |> divide(7, "Plong")
    |> then(fn
      {num, ""} -> Integer.to_string(num)
      {_, str} -> str
    end)
  end

  defp divide({number, acc}, factor, message) do
    if rem(number, factor) == 0 do
      {number, acc <> message}
    else
      {number, acc}
    end
  end
end

다 풀고 보니 Enum과 관련된 문제래서 Enum을 사용하도록 수정해봤다. 이쪽이 조금 더 깔끔해보이는 듯도 하다.

defmodule Raindrops do
  @spec convert(pos_integer) :: String.t()
  def convert(number) do
    [{3, "Pling"}, {5, "Plang"}, {7, "Plong"}]
    |> Enum.map(fn {factor, message} ->
      if rem(number, factor) == 0, do: message, else: ""
    end)
    |> Enum.join("")
    |> then(fn
      "" -> to_string(number)
      v -> v
    end)
  end
end