integers 10

Change - Exercism in Elixir

문제 보기 동전의 종류들이 리스트로 주어질 때, 그 동전들을 이용해서 주어진 금액을 맞출 수 있는지 확인하고, 맞출 수 있다면 동전 개수가 최소가 되도록 하는 조합을 찾는 문제였다. Dynamic programming을 쓰면 괜찮겠다 싶어 도입해 보았다. 이를테면 다음과 같다. 1원, 5원, 10원짜리 동전이 있고, 그것으로 18원을 맞춰야 하는 경우 - Case 1) 10원짜리 동전을 하나 사용했다고 가정하고, 같은 동전으로 8원을 추가로 맞추면 됨 - Case 2) 5원짜리 동전을 하나 사용했다고 가정하고, 같은 동전으로 13원을 추가로 맞추면 됨 - Case 3) 1원짜리 동전을 하나 사용했다고 가정하고, 같은 동전으로 17원을 추가로 맞추면 됨 Case 1에서 한단계 더 나아가면 이렇게 된다. C..

Luhn - Exercism in Elixir

문제 보기 지정된 규칙에 따라 신용카드 번호가 올바른지 아닌지를 검증하는 문제였다. 오른쪽부터 세서 짝수 번째 자리에 있는 숫자에 2를 곱한 뒤, 모든 자리수를 더했을 때 10의 배수가 되면 유효한 자리수로 판정한다. 일반적인 신용카드처럼 자리수가 16자리 고정이면 참 쉬웠을텐데, 입력되는 번호의 자리수의 홀짝이 제각각이어서 자리수에 따라 달리 처리해야 하는 부분이 조금 까다로웠다. defmodule Luhn do require Integer @doc """ Checks if the given number is valid via the luhn formula """ @spec valid?(String.t()) :: boolean def valid?(number) do space_removed = Stri..

Square Root - Exercism in Elixir

문제 보기 자연수의 제곱근울 sqrt 함수 없이 구하는 문제였다. 참고용으로 링크된 문서(위키피디아)를 보니 여러 추정법이 있었는데, 막상 테스트 케이스를 보니 전부 숫자가 크지 않은 자연수 제곱근이라 그냥 적당히 구현했다. defmodule SquareRoot do @doc """ Calculate the integer square root of a positive integer """ @spec calculate(radicand :: pos_integer) :: pos_integer def calculate(radicand) do case radicand do v when v in 1..10_000 -> 1..100 |> Enum.find(fn a -> a * a == radicand end) v w..

Largest Series Product - Exercism in Elixir

문제 보기 문자열로 주어지는 수열 중, size 개짜리 부분수열의 각 항목의 곱이 가장 큰 경우를 찾는 문제였다. 큰 틀은 쉬웠는데, 빈 문자열인 경우, size가 0이거나 음수인 경우 등 몇 가지 예외 상황을 처리해야 하는 것이 조금 까다로웠다. defmodule Series do @doc """ Finds the largest product of a given number of consecutive numbers in a given string of numbers. """ @spec largest_product(String.t(), non_neg_integer) :: non_neg_integer def largest_product(_, 0), do: 1 def largest_product(number..

Armstrong Numbers - Exercism in Elixir

문제 보기 어떤 수가 암스트롱 수(각 자리의 숫자에 총 자리수를 제곱한 합이 원래 수와 같은 경우. 예: 153의 경우 1^3 + 5^3 + 3^3 = 3 + 125 + 27 = 153이므로 암스트롱 수)인지 확인하는 문제였다. 무난하게 풀 수 있는 문제였다. defmodule ArmstrongNumber do @moduledoc """ Provides a way to validate whether or not a number is an Armstrong number """ @spec valid?(integer) :: boolean def valid?(number) do digits = Integer.digits(number) exp = length(digits) Enum.map(digits, fn d ..

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

Resistor Color Trio - Exercism in Elixir

문제 보기 Register Color Duo에서 한 단계 더 나가, 저항의 세 번째 값을 10의 거듭제곱으로 해석하여 최종 저항 값을 계산하고, 1000으로 나누어 떨어지는 경우 옴 대신 킬로옴 단위로 출력하도록 하는 문제였다. 구현 자체는 쉬운데, 깔끔한 코드를 짜기가 쉽지 않았다. label과 value에서는 함수 파라미터 정의부를 바꿔 들어오는 리스트의 길이를 제한했고, format에서는 패턴 매칭을 쓰면 오히려 불필요한 코드가 늘어나는 느낌이라 if를 사용했음을 기록해둔다. defmodule ResistorColorTrio do @register_color %{ black: 0, brown: 1, red: 2, orange: 3, yellow: 4, green: 5, blue: 6, violet:..

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

Freelancer Rates - Exercism in Elixir

문제 보기 프리랜서의 시급(과 할인율)이 주어졌을 때의 일당, 월급, 예산 안에서 고용할 수 있는 최대 일수를 계산하는 산수 문제였다. 어떤 함수는 실수를 반환해야 하고, 어떤 것은 정수를 반환해야 해서 타입 변환에 대해 고민하는 경우도 있을 것 같은데 (특히 타입 개념이 강한 언어를 쓰고 있던 경우), 엘릭서의 사칙연산에서는 좌우항의 값(피연산자, operand) 중 하나라도 실수인 경우 연산 결과가 항상 실수가 된다고 생각해 두면 그다지 어렵지 않게 코드를 작성할 수 있겠다. 즉 연산할 때 값의 타입을 정수 또는 실수에서 어느 한 쪽으로 명시적으로 캐스팅할 필요가 기본적으로는 없다. 덧: 실수에서 정수로의 변환이 필요한 경우 Kernel 모듈의 round/1, trunc/1, ceil/1, floor..