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)