Guards 5

Triangle - Exercism in Elixir

문제 보기 주어진 세 변으로 만들어지는 삼각형이 정삼각형인지, 이등변삼각형인지, 일반적인 삼각형인지를 구하는 문제였다. 삼각형인 만큼 어느 한 변의 길이가 나머지 두 변의 길이의 합보다 길면 안 되고, 변의 길이는 0 이상이어야 한다는 제약 조건이 있다. 정삼각형을 별도 패턴으로 처리한 것처럼 이등변삼각형도 그렇게 하고 싶었는데, 유효성 체크를 먼저 해야 하는 것이 나을 것 같아서 나머지 로직을 모두 묶고 cond를 사용했다. defmodule Triangle do @type kind :: :equilateral | :isosceles | :scalene @doc """ Return the kind of triangle of a triangle with 'a', 'b' and..

Collatz Conjecture - Exercism in Elixir

문제 보기 입력이 짝수인 경우에는 2로 나누고, 홀수인 경우에는 3을 곱한 뒤 1을 더하기를 반복하면 언젠가는 1로 수렴한다고 한다. 어떤 입력에 대해 1이 되기까지 거친 단계의 수를 구하는 문제였다. 구현 자체가 어려운 것은 아니었는데, 홀짝만 생각하면 되겠지 하고 있었는데 음수, 0, 문자열 등의 온갖 경계 조건이 테스트에 들어가 있어서 테스트 통과에 애를 조금 먹었다. 패턴 매칭으로 작은 함수들을 여러 개 만들어 쓰고 싶었는데, 가드가 줄줄이 따라붙다보니 한 구현에 필요한 가드를 전부 붙이는 것이 낫겠다 싶어서 지금과 같은 구현이 되었다. defmodule CollatzConjecture do @spec calc(input :: pos_integer()) :: non_neg_integer() def..

Leap - Exercism in Elixir

단골 문제 중 하나인 윤년 계산. 일반적으로는 논리 연산으로 푸는 경우가 많기는 하다. @spec leap_year?(non_neg_integer) :: boolean def leap_year?(year) do rem(year, 400) == 0 or (rem(year, 4) == 0 and not(rem(year, 100) == 0)) end 엘릭서에서는 가드로 푸는 편이 훨씬 깔끔하다. 굳. defmodule Year do # 주석 생략 @spec leap_year?(non_neg_integer) :: boolean def leap_year?(year) when rem(year, 400) == 0, do: true def leap_year?(year) when rem(year, 100) == 0, d..

Guessing Game - Exercism in Elixir

문제 보기 인자 기본값, 가드 조건절, 함수 패턴 매칭 등을 연습하는 문제였다. 문제 스펙이 아니라 테스트 케이스를 보고 구현 방향을 잡아야 하는 문제가 싫다. 처음부터 뭐는 되고 뭐는 안 된다고 알려주는 게 아니라, 마음대로 하라고 해서 마음대로 해갔더니 이건 별로고 저건 안된다며 퇴짜맞는 것 같다. 아무튼지간에 처음 짠 코드는 이런 식이었다. 함수 여러 벌로 구현하려다가도 전부 is_integer 가드를 넣는 건 너무 verbose한 것 같아 제일 간단한 cond로 마무리. 테스트 케이스는 통과하나, cond를 쓰지 말라고 경고가 뜬다. defmodule GuessingGame do def compare(secret_number, guess) when is_integer(guess) do cond d..