# Day02 ```elixir Mix.install([ {:kino, "~> 0.14.2"}, ]) ``` ## Run Me [![Run in Livebook](https://livebook.dev/badge/v1/blue.svg)](https://livebook.dev/run?url=https%3A%2F%2Fgit.kev.pub%2Fkev%2Faoc2024%2Fraw%2Fbranch%2Fmain%2Fday01.livemd) ## Input ```elixir input = Kino.Input.textarea("Input") ``` ## Part One ```elixir defmodule PartOne do def differences([_]), do: [] def differences([a, b|t]), do: [a - b| differences([b|t])] def parse(input) do input |> Kino.Input.read |> String.split("\n") |> Enum.map(fn l -> l |> String.split(" ")|> Enum.map(&String.to_integer/1) end) end def pass_diffs(l) do fail = l |> PartOne.differences |> Enum.any?(fn y -> (abs(y) > 3 || y == 0) end) !fail end def pass_direction(l) do l = l |> PartOne.differences |> Enum.map(fn x -> x > 0 end) |> Enum.dedup |> length l == 1 end def passes(x), do: pass_diffs(x) && pass_direction(x) end input |> PartOne.parse |> Enum.count(&PartOne.passes/1) ``` ## Part Two ```elixir %{false: fails, true: passes} = input |> PartOne.parse |> Enum.group_by(&PartOne.passes/1) fail_count = Enum.map(fails, fn l -> 0..length(l) |> Enum.map(fn x -> List.delete_at(l,x) end) |> Enum.any?(&PartOne.passes/1) end) |> Enum.count(fn x -> x end) length(passes) + fail_count ```