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

Advent 2024 - Day 2

day2.livemd

Advent 2024 - Day 2

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

Setup

input = Kino.Input.textarea("Please paste your input file")
reports =
  input
  |> Kino.Input.read()
  |> String.split("\n")
  |> Enum.map(fn line ->
    line
    |> String.split(" ")
    |> Enum.map(&String.to_integer(&1))
  end)

Part 1

defmodule RedNoseReports do
  def process([a | [b | t]]) do
    if a - b > 0 do
      process([a | [b | t]], :up)
    else
      process([a | [b | t]], :down)
    end
  end
  
  def process([a | [b | t]], direction) do
    correct_direction = case direction do
      :up -> a - b > 0
      :down -> a - b < 0
    end
  
    diff = abs(b - a)
    if (diff > 3 or diff == 0) or not correct_direction do
      false
    else
      process([b | t], direction)
    end
  end

  def process(report, _direction) when is_list(report) and length(report) == 1 do
    true
  end
end

for report <- reports do
  RedNoseReports.process(report)
end
|> Enum.count(&amp;(&amp;1))

Part 2

for report <- reports do
  if RedNoseReports.process(report) do
    true
  else
    for index_to_remove <- 0..length(reports) do
      modified_report = 
        report
        |> Enum.with_index()
        |> Enum.reject(fn {_value, index} -> index == index_to_remove end)
        |> Enum.map(fn {value, _index} -> value end)

      RedNoseReports.process(modified_report)
    end
    |> Enum.any?
  end
end
|> Enum.count(&amp;(&amp;1))