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

Advent of Code 2024 - Day 2

day02.livemd

Advent of Code 2024 - Day 2

Mix.install([
  {:kino_aoc, "~> 0.1"},
])

Section

{:ok, puzzle_input} =
  KinoAOC.download_puzzle("2024", "2", System.fetch_env!("LB_AOC_SESSON_2024"))
defmodule Day02 do
  def parse(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.map(fn line ->
      split = String.split(line)
      Enum.map(split, fn s -> String.to_integer(s) end)
    end)
  end

  def part1(input) do
    Enum.count(input, &safe?/1)
  end

  def part2(input) do
    Enum.count(input, &safe_variants?/1)
  end

  defp safe?([a, a | _]), do: false

  defp safe?([a, b | rest]) do
    multiplier = if b - a > 0, do: 1, else: -1
    check_trend_consistency?([a, b | rest], multiplier)
  end

  defp check_trend_consistency?([_], _), do: true

  defp check_trend_consistency?([a, b | rest], multiplier) do
    ((b - a) * multiplier) in 1..3 && check_trend_consistency?([b | rest], multiplier)
  end

  defp safe_variants?(list) do
    subsets =
      0..length(list)
      |> Enum.map(&List.delete_at(list, &1))

    safe?(list) || Enum.any?(subsets, &safe?/1)
  end
end
Day02.parse(puzzle_input) |> Day02.part1()
Day02.parse(puzzle_input) |> Day02.part2()