호두나무 공방/Advent of Code

Advent of Code 2021 Day 1 in Elixir - Sonar Sweep

2021. 12. 2. 01:13

매년 12월 1일부터 25일까지 매일 두 문제씩, 총 50문제의 프로그래밍 퍼즐이 공개되는 개발자 이벤트. (홈페이지) 나는 2년 전에 처음 시작했는데, 그때는 10일차 즈음까지 뒤쫓아가며 풀다가 코드가 점점 스파게티가 되어간 탓에 더 풀지 못하고 하차했었고, 작년에는 여러 일로 정신이 없어 한다는 것도 모르고 지나쳐 버렸다. 올해는 마음에 조금 여유가 생겨 리얼타임으로 따라가 보려 한다. 조금 늦더라도 어떻게든 완주할 수 있었으면 좋겠다. 올해도 어김없이 엘릭서를 사용하여 풀 예정.

첫날 퍼즐은 (나름 스토리가 있지만 생략하고 문제만 정리하면) 연속된 숫자들 중 이전 숫자보다 증가한 것이 몇 번인지를 찾는 문제였다. 첫날이라서 그런지 비교적 간단하게 풀 수 있었다.

경험상 전에 작성했던 코드를 뒤에서 확장해서 사용하기도 해서, 일단 돌아가도록 푸는 것도 중요하지만 나중에 재활용할 수도 있도록 하는 것도 중요하다 싶다.

defmodule Day1 do
  def parse_input do
    path = "input_day1q1.txt"

    File.read!(path)
    |> String.split("\n")
    |> Enum.map(&String.to_integer/1)
  end

  def run_q1 do
    parse_input()
    |> count_increase()
    |> elem(1)
  end

  def run_q2 do
    parse_input()
    |> Enum.chunk_every(3, 1, :discard)
    |> Enum.map(&Enum.sum/1)
    |> count_increase()
    |> elem(1)
  end

  defp count_increase(numbers) do
    numbers
    |> Enum.reduce(
      {nil, 0},
      fn
        element, {nil, cnt} ->
          {element, cnt}

        element, {before, cnt} ->
          if element > before do
            {element, cnt + 1}
          else
            {element, cnt}
          end
      end
    )
  end
end