summaryrefslogblamecommitdiffstats
path: root/src/day02.exs
blob: ae7bfde016d1fca69929d7ff6ef7b95f250895f2 (plain) (tree)



































                                                                          
defmodule Day02 do
  def parse_report(line) do
    line
    |> String.trim()
    |> String.split(" ")
    |> Enum.map(&String.to_integer/1)
  end

  def is_report_safe(report) do
    diffs = report
    |> Enum.chunk_every(2, 1, :discard)
    |> Enum.map(fn [a, b] -> b - a end)

    Enum.all?(diffs, fn x -> 1 <= x and x <= 3 end) or
      Enum.all?(diffs, fn x -> -3 <= x and x <= -1 end)
  end

  def is_report_safe_with_dampener(report) do
    is_report_safe(report) or
      Enum.any?(0..Enum.count(report)-1,
                fn i -> List.delete_at(report, i) |> is_report_safe() end)
  end
end

reports = IO.stream(:stdio, :line)
|> Enum.map(&Day02.parse_report/1)

ans1 = reports
|> Enum.count(&Day02.is_report_safe/1)

IO.puts(ans1)

ans2 = reports
|> Enum.count(&Day02.is_report_safe_with_dampener/1)

IO.puts(ans2)