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

Advent of Code 2024 - Day 25

2024/day-25.livemd

Advent of Code 2024 - Day 25

Mix.install([{:kino, github: "livebook-dev/kino"}])

kino_input = Kino.Input.textarea("Please paste your input file: ")

Part 1 & 2

input = Kino.Input.read(kino_input)

input
|> String.split("\n\n", trim: true)
|> Enum.map(fn schematic ->
  is_lock? = match?("#" <> _, schematic)

  converted_schematic = 
    schematic
    |> String.split("\n", trim: true)
    |> Enum.map(fn line ->
      line
      |> String.graphemes()
      |> Enum.map(fn char ->
        if char == "#" do 1 else 0 end
      end)
    end)
    |> Enum.zip_reduce([], &amp;[Enum.sum(&amp;1) - 1 | &amp;2])

  {is_lock?, converted_schematic}
end)
|> Enum.group_by(&amp;elem(&amp;1, 0), &amp;elem(&amp;1, 1))
|> then(fn %{false: keys, true: locks} ->
  locks
  |> Enum.flat_map(fn lock ->
    keys
    |> Enum.map(fn key ->
      key
      |> Enum.zip_with(lock, fn a, b -> a + b > 5 end)
      |> Enum.any?(&amp;(&amp;1))
    end)
  end)
  |> Enum.reject(&amp;(&amp;1))
  |> Enum.count()
end)