pipe operator 6

Affine Cipher - Exercism in Elixir

문제 보기 고대 중동의 암호화 알고리즘을 간단하게 구현하는 문제였다. 이런 치환암호(substitution cipher) 방식의 알고리즘은 엘릭서에서는 문자 리스트로 바꿔서 처리하는 것이 간단하다. 배경 지식인 건지 내가 텍스트에서 못 찾은 건지, 설명에 몇 가지 내용이 빠져 있어서 테스트 케이스를 더듬어가며 답을 찾아야 하는 과정이 조금 번거로웠다. MMI(나머지 연산의 역원)를 구하는 과정에 스트림을 쓴 것이 내심 만족스럽다. defmodule AffineCipher do @typedoc """ A type for the encryption key """ @type key() :: %{a: integer, b: integer} @doc """ Encode an encrypted message usin..

Word Count - Exercism in Elixir

문제 보기 주어진 문장의 단어 빈도를 구하는 문제였다. 보통같았으면 공백 기준으로 나눈 뒤 Enum.frequencies/1를 쓰면 금방이었겠지만... 아포스트로피나 하이픈, 일반 알파벳이 아닌 문자(독일어 철자 등...)도 테스트 케이스에 포함되어 있어서, 범용성을 확보하면서 테스트 케이스를 통과시키는 것이 약간 까다로운 문제였다. defmodule WordCount do @doc """ Count the number of words in the sentence. Words are compared case-insensitively. """ @spec count(String.t()) :: map def count(sentence) do regex = ~r/[0-9\pL-']+/iu Regex.sc..

Series - Exercism in Elixir

문제 보기 주어진 문자열 s에서 만들 수 있는 size 크기의 연속된 부분 문자열을 모두 찾는 문제였다. Enum.chunk_every/4 함수가 아주 딱 들어맞는 문제. defmodule StringSeries do @spec slices(s :: String.t(), size :: integer) :: list(String.t()) def slices(s, size) when size > 0 do s |> String.graphemes() |> Enum.chunk_every(size, 1, :discard) |> Enum.map(&(Enum.join(&1, ""))) end def slices(_, _), do: [] end

Scrabble Score - Exercism in Elixir

문제 보기 각 영문자마다 점수가 정해져 있을 때, 주어진 문자열의 점수(각 문자의 점수의 합)를 구하는 문제였다. case do; v when v in ["A", "E", "I", "O", "U", ...] -> ...와 같이 구현할 수도 있었는데(예외적인 문자가 들어왔을 때 0점 처리하기에는 이쪽이 조금 더 쉽긴 하다), 코드와 데이터를 분리하자는 의도도 있고 해서 지금과 같은 구현이 되었다. defmodule Scrabble do @score %{ "A" => 1, "B" => 3, "C" => 3, "D" => 2, "E" => 1, "F" => 4, "G" => 2, "H" => 4, "I" => 1, "J" => 8, "K" => 5, "L" => 1, "M" => 3, "N" => 1, "O"..

Acronym - Exercism in Elixir

문제 보기 영문 구(phrase)의 약어 표현을 찾는 문제였다. 구현 자체는 스트레이트하나, 중간에 하이픈(-)이 들어가거나 단어 양옆에 언더스코어(_)가 있는 등 여러 예외적인 경우가 있어 테스트 케이스 통과에 매번 애를 먹는 문제. String.split시 빈 문자열을 제거하고 반환하는 trim 옵션이 참 유용하게 쓰인다. defmodule Acronym do @doc """ Generate an acronym from a string. "This is a string" => "TIAS" """ @spec abbreviate(String.t()) :: String.t() def abbreviate(string) do string |> String.split(~r/[\s-_]+/, trim: true)..

High School Sweetheart - Exercism in Elixir

문제 보기 문자열(String 모듈의 주요 함수, 멀티라인 문자열)과 파이프 연산자를 사용하는 문제였다. 스펙을 조금 더 파고들면 문제가 되는 상황이 꽤 많이 나올 수 있었는데(미들네임이 있는 경우라거나), 테스트 케이스를 보니 기본적인 동작만 잘 구현하면 되는 것 같아 러프하게 구현했다. defmodule HighSchoolSweetheart do def first_letter(name) do name |> String.trim() |> String.first() end def initial(name) do # first_letter(name) |> String.upcase() |> Kernel.(".") 도 되겠다 "#{first_letter(name) |> String.upcase()}." end ..