Powered by AppSignal & Oban Pro

Day 7: Laboratories

2025/day07.livemd

Day 7: Laboratories

Mix.install([:kino])

Section

input = Kino.Input.textarea("input", monospace: true)
input
|> Kino.Input.read()
|> String.split()
|> Enum.map(&String.graphemes/1)
|> then(fn [start | rest] ->
  {Enum.map(start, fn
     "S" -> 1
     _ -> 0
   end), rest}
end)
|> then(fn {beams, reflectors} ->
  reflectors
  |> Enum.reduce({beams, 0}, fn reflectors, {beams, reflections} ->    
    reflectors
    |> Enum.zip(beams)
    |> Enum.reduce({[0], reflections}, fn
      {".", beam}, {[b | beams], reflections} -> {[0, b + beam | beams], reflections}
      {"^", 0},    {[_ | beams], reflections} -> {[0, 0 | beams], reflections}
      {"^", beam}, {[_, b | beams], reflections} -> {[beam, 0, b + beam | beams], reflections + 1}
    end)
    |> then(fn {beams, reflections} ->
      {Enum.reverse(beams), reflections}
    end)
  end)
end)
|> then(fn {beams, reflections} ->
  {Enum.sum(beams), reflections}
end)