aoc2024/day02.livemd

1.3 KiB

Day02

Mix.install([
  {:kino, "~> 0.14.2"},
])

Run Me

Run in Livebook

Input

input = Kino.Input.textarea("Input")

Part One

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

%{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