가로세로 위치에 따라 적당한 알파벳을 출력하여 다이아몬드 모양을 만드는, 배열 인덱스 계산의 단골 문제. 어렵지는 않으나 다이아몬드의 상하부를 나눠 생각해야 하기도 하고, 중앙 기준으로도 나눠 생각해야 해서 역시 번거롭다.
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
'호두나무 공방 > Exercism in Elixir' 카테고리의 다른 글
Sieve - Exercism in Elixir (0) | 2022.10.24 |
---|---|
Scale Generator - Exercism in Elixir (0) | 2022.10.13 |
Palindrome Products - Exercism in Elixir (0) | 2022.10.11 |
Affine Cipher - Exercism in Elixir (0) | 2022.10.10 |
Tournament - Exercism in Elixir (0) | 2022.10.05 |