전체 글 226

Rail Fence Cipher - Exercism in Elixir

문제 보기 지그재그 형식으로 문자를 흩트리는 방식의 'Rail Fence Cipher' 암호화를 구현하는 문제였다. 이를테면 'WE ARE DISCOVERED FLEE AT ONCE'를 암호화하면 W . . . E . . . C . . . R . . . L . . . T . . . E . E . R . D . S . O . E . E . F . E . A . O . C . . . A . . . I . . . V . . . D . . . E . . . N . . 와 같이 문자를 배치하고, 이것을 윗줄부터 순서대로 읽어 WECRLTEERDSOEEFEAOCAIVDEN가 되는 식이다. 문자 길이와 배치할 줄 수가 모두 유동적이어서 Stream을 아주 유용하게 사용했다. 암호화, 복호..

Markdown - Exercism in Elixir

문제 보기 마크다운 파서를 리팩토링하는 문제였다. 다른 문제와 다르게 테스트를 모두 통과하는 코드가 먼저 주어지고, 그것을 테스트를 깨트리지 않으면서 최대한 리팩하는 것이 목표. 괄호로 겹겹이 싸인 코드들이 있어서 우선 파이프라인으로 모두 고쳐주고, 단어 단위로 처리하는 부분을 줄 단위로 처리하도록 수정했다. 대충 스무 줄 정도는 줄인 것 같다. 정규식의 Lookahead, lookbehind 기능의 도움을 크게 받았다. defmodule Markdown do @doc """ Parses a given string with Markdown syntax and returns the associated HTML for that string. ## Examples iex> Markdown.parse("This..

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

List Ops - Exercism in Elixir

문제 보기 엘릭서에서 제공되는 내장 함수들(Kernel의 리스트 연산 함수들, List, Enum 등)을 쓰지 않고 리스트 연산을 구현해보는 문제였다. 리스트 연산을 공부하는 사람들이라면 한번쯤은 짜 봤을 법한 기본적인 내용. 하나하나 구현하다가, 생각해보니 엘릭서의 Enum이 그렇듯 대부분의 것을 reduce(=foldl)로 처리할 수 있음을 깨닫고 그렇게 고쳤다. 기록이 될까 싶어 고치기 전후 버전을 코드에 모두 남겨둔다. do_reverse, do_map 등 호출되지 않는 함수들이 고치기 전의 코드다. defmodule ListOps do # Please don't use any external modules (especially List or Enum) in your # implementa..

Robot Simulator - Exercism in Elixir

문제 보기 주어진 명령어에 따라 로봇을 움직이는 문제였다. 동서남북에 따라 달리 처리해야 하는 부분이 있고, 잘못된 입력에 대해 처리해야 하는 부분이 있어 코드가 자잘하게 길어졌는데, 그것 말고는 별 것이 없기도 하다. 여담이지만 이 문제의 원래 분야는 Multiple clause functions였는데, 동서남북에 따라 함수를 4개씩 만들기에는 조금 투머치인가 싶어 case로 처리했다. defmodule RobotSimulator do @type robot() :: any() @type direction() :: :north | :east | :south | :west @type position() :: {integer(), integer()} defmodule Robot do defstruct [:p..

Knapsack - Exercism in Elixir

문제 보기 각 물건의 무게와 가치가 주어졌을 때, 최대 무게 maximum_weight 안에서 가져갈 수 있는 물건의 최대 가치를 구하는 문제였다. 코딩 테스트 바닥에서 말하는 완전탐색 타입의 문제. 조금 더 최적화할 여지는 있어보이긴 하는데, 파이프라인이 제법 깔끔하게 만들어져서 만족하고 끝내기로 했다. defmodule Knapsack do @doc """ Return the maximum value that a knapsack can carry. """ @spec maximum_value(items :: [%{value: integer, weight: integer}], maximum_weight :: integer) :: integer def maximum_value(items, maximum_w..

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

Transpose - Exercism in Elixir

문제 보기 여러 줄의 문자열이 주어졌을 때 가로세로를 바꿔 반환하는 문제였다. 예를 들어 ABC DE 와 같이 주어지면 AD BE C 와 같이 반환하는 식이다. 원문의 이전 줄보다 다음 줄이 짧은 경우 문자열 끝에 해당하는 C 뒤에는 공백이 없어야 하는 등의 몇 가지 규칙이 조금 더 있다. 기본적으로 Enum.zip/1을 이용하되, 이 함수는 기본적으로 가장 짧은 리스트에 맞춰서 zip 연산을 하는 특징이 있어 패딩을 추가하고 그 패딩을 뒤에서 제거하는 처리를 추가했다. 패딩으로는 일반적인 문자에 존재하지 않을 문자인 을 골랐고, 가로세로를 뒤집은 후 뒤쪽에 오는 은 제거해야 하지만 나머지 은 공백을 유지해야 하므로 공백 문자로 바꿨다. 여담이지만 Enum.map/2을 여러 차례 이어 썼는데, 비효율적인..

Sieve - Exercism in Elixir

문제 보기 소수를 구하는 에라토스테네스의 체를 구현하는 문제였다. 개념은 쉬운데, 코드에서 나눗셈 또는 나머지 연산을 사용하지 말아야 한다는 조건이 붙었다(대신 곱셈을 사용하라는 의도). 우선 처음에 나눗셈을 사용해서 짠 간단한 코드는 이쪽. defmodule Sieve do @doc """ Generates a list of primes up to a given limit. """ @spec primes_to(non_neg_integer) :: [non_neg_integer] def primes_to(limit) do 2..limit//1 |> Enum.to_list() |> do_primes_to([]) |> Enum.reverse() end defp do_primes_to([], primes), d..

테이스티 문학상 작품집 『사건은 식후에 벌어진다』를 읽고

사건은 식후에 벌어진다 김노랑, 김태민, 한켠, 박하루, 범유진, 유사본, 전효원 지음, 황금가지, 2021년 8월 이 이야기는 경기도 광주에서 일어났던 살인 사건에 대한 지극히 개인적인 사건 보고서라 하는 것이 맞겠지만, 그 전에 자칭 한국의 유일한 강력 사건 전담 탐정이라고 떠벌리고 다니는 덜떨어진 대식가에 대한 이야기를 안 할 수 없다. - 「탐정에게는 후식이 있어야 한다」 중에서 황금가지에서 진행하는 소규모 문학상인 '테이스트 문학상' 3, 4회 수상작 작품집. 전체적으로 디저트류(특히 커피)의 비중이 높은 것이 신기하다 싶었는데, 찾아보니 3회 주제가 '디저트'였고, 4회 주제가 '커피와 차'였더라. 내 취향에 조금 더 맞는 건 당선작보다는 우수작들이었다. 먼저 「탐정에게는 후식이 있어야 한다」..