Multiple Clause Functions 7

OCR Numbers - Exercism in Elixir

문제 보기 7-세그먼트 방식으로 기록된 숫자가 담긴 문자열이 들어왔을 때 이를 숫자로 바꿔 반환하는 문제였다. 한 줄에 여러 숫자가 담기고, 그것이 또 여러 줄 있을 수 있어서(또 행과 열이 맞지 않을 때의 유효성 검사도 해야 해서) 어느 쪽으로 먼저 문자열을 나눠야 할지 시행착오가 많았던 문제였다. Early return이 있으면 참 편했을텐데 하는 생각이 들었다. defmodule OcrNumbers do @doc """ Given a 3 x 4 grid of pipes, underscores, and spaces, determine which number is represented, or whether it is garbled. """ @spec convert([String.t()]) :: {:ok..

Yacht - Exercism in Elixir

문제 보기 일정한 점수 계산 규칙(풀하우스, 스트레이트 등등...)이 있을 때, 주어진 주사위 숫자가 특정 규칙에 들어맞는지, 맞는다면 몇 점인지 계산하는 문제였다. cond로 계산하기에는 조금 양이 많아서 카테고리별로 구현을 나눠 구현했다. 코드가 다소 길 뿐, 어렵지는 않았다. defmodule Yacht do @type category :: :ones | :twos | :threes | :fours | :fives | :sixes | :full_house | :four_of_a_kind | :little_straight | :big_straight | :choice | :yacht @doc """ Calculate the score of 5 dice using the given category&#3..

Prime Factors - Exercism in Elixir

문제 보기 자연수를 소인수분해하는 문제였다. 재귀를 이용하는 이런 방식은 아마 성능이 그닥 좋지 않을 것 같긴 하지만... defmodule PrimeFactors do @doc """ Compute the prime factors for 'number'. The prime factors are prime numbers that when multiplied give the desired number. The prime factors of 'number' will be ordered lowest to highest. """ @spec factors_for(pos_integer) :: [pos_integer] def factors_for(number) do do_factors_f..

Beer Song - Exercism in Elixir

문제 보기 범위를 순서대로 처리하며 그 값에 따라 적당한 문자열을 반환하는 함수를 작성하는 문제였다. 더 머리를 쓰면 중복되는 문자열을 조금 더 줄일 수도 있었겠지만, 지나치면 코드를 알아보기 어렵게 만들 수도 있을 것 같아 약간의 중복을 허용하는 선에서 마무리했다. defmodule BeerSong do @doc """ Get a single verse of the beer song """ @spec verse(integer) :: String.t() def verse(0) do """ No more bottles of beer on the wall, no more bottles of beer. Go to the store and buy some more, 99 bottles of beer on the..

All Your Base - Exercism in Elixir

문제 보기 진법 변환 문제였다. 일단 10진법으로 바꾼 뒤에 목표 진법으로 바꾸는 2단계 변환. 로직도 제법 되고 유효성 체크 로직도 있어 코드 길이는 조금 길지만, 메인 코드는 to_decimal |> from_decimal 호출만으로 끝나도록 구성해봤다. defmodule AllYourBase do @spec convert(list, integer, integer) :: {:ok, list} | {:error, String.t()} def convert(_, _, output_base) when output_base = 2"} end def convert(_, input_base, _) when input_base < 2 do {:e..

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..