호두나무 공방/Exercism in Elixir

Diamond - Exercism in Elixir

2022. 10. 12. 22:14

문제 보기

가로세로 위치에 따라 적당한 알파벳을 출력하여 다이아몬드 모양을 만드는, 배열 인덱스 계산의 단골 문제. 어렵지는 않으나 다이아몬드의 상하부를 나눠 생각해야 하기도 하고, 중앙 기준으로도 나눠 생각해야 해서 역시 번거롭다.

defmodule Diamond do
  @doc """
  Given a letter, it prints a diamond starting with 'A',
  with the supplied letter at the widest point.
  """
  @spec build_shape(char) :: String.t()
  def build_shape(letter) do
    last_index = 2 * (letter - ?A)
    center_index = last_index / 2

    0..last_index
    |> Enum.map(fn r_index ->
      0..last_index
      |> Enum.map(fn c_index ->
        cond do
          r_index < center_index and abs(c_index - center_index) == r_index ->
            ?A + r_index
          r_index == center_index and (c_index == 0 or c_index == last_index) ->
            letter
          r_index > center_index and abs(c_index - center_index) == last_index - r_index ->
            ?A + last_index - r_index
          true ->
            " "
        end
      end)
      |> to_string()
      |> Kernel.<>("\n")
    end)
    |> Enum.join("")
  end
end