Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

aoc2021-d1

2021/elixir/day-1.livemd

aoc2021-d1

Setup

Mix.install([{:kino, "~> 0.4.1"}])
input = Kino.Input.textarea("input")

Part1

이전 것보다 증가하는 경우만 counting

defmodule Solver do
  def solve(input_string) do
    parse(input_string)
    |> calculate(:infinity, 0)
  end

  def parse(input_string) do
    String.split(input_string, "\n", trim: true)
    |> Enum.map(&String.to_integer/1)
  end

  def calculate(inputs, prev, acc)
  def calculate([], _, acc), do: acc

  def calculate([cur | rest], prev, acc) when cur > prev do
    calculate(rest, cur, acc + 1)
  end

  def calculate([cur | rest], _prev, acc), do: calculate(rest, cur, acc)
end

Part2: three-measurments windows

defmodule Part2 do
  def solve(input_string) do
    parse(input_string)
    |> calculate([], 0)
  end

  def parse(input_string) do
    String.split(input_string, "\n", trim: true)
    |> Enum.map(&String.to_integer/1)
  end

  def calculate(inputs, prev \\ [], acc \\ 0)

  def calculate([cur, next, next2 | _] = inputs, [], acc) do
    calculate(tl(inputs), [cur, next, next2], acc)
  end

  def calculate([cur, next, next2 | _] = inputs, prev_window, acc) do
    if cur + next + next2 > Enum.sum(prev_window) do
      calculate(tl(inputs), tl(prev_window) ++ [next2], acc + 1)
    else
      calculate(tl(inputs), tl(prev_window) ++ [next2], acc)
    end
  end

  def calculate(_inputs, _window, acc), do: acc
end
inputs = Kino.Input.read(input)
Solver.solve(inputs)
inputs2 = """
199
200
208
210
200
207
240
269
260
263
"""

Part2.solve(inputs)