Powered by AppSignal & Oban Pro

🎄 Year 2024 🔔 Day 25

elixir/notebooks/2024/day25.livemd

🎄 Year 2024 🔔 Day 25

Setup

{locks, keys} =
  File.read!("#{__DIR__}/../../../inputs/2024/day25.txt")
  |> String.split("\n\n", trim: true)
  |> Enum.map(fn lock_or_key ->
    lock_or_key
    |> String.split("\n", trim: true)
    |> Enum.map(&String.graphemes/1)
    |> Enum.zip()
    |> Enum.map(&Tuple.to_list/1)
  end)
  |> Enum.reduce({[], []}, fn lock_or_key, {locks, keys} ->
    top_left_char = lock_or_key |> Enum.at(0) |> Enum.at(0)

    counts =
      lock_or_key
      |> Enum.map(fn row -> Enum.count(row, &(&1 == "#")) - 1 end)

    if top_left_char == "#" do
      {[counts | locks], keys}
    else
      {locks, [counts | keys]}
    end
  end)

Part 1

locks
|> Enum.map(fn lock ->
  Enum.count(keys, fn key ->
    Enum.zip(lock, key)
    |> Enum.all?(fn {a, b} -> a + b <= 5 end)
  end)
end)
|> Enum.sum()