Powered by AppSignal & Oban Pro

Day 6: Trash Compactor

2025/day06.livemd

Day 6: Trash Compactor

Mix.install([:kino])

Section

input = Kino.Input.textarea("input", monospace: true)
input
|> Kino.Input.read()
|> String.split("\n")
|> Enum.split(-1)
|> then(fn {numbers, [ops]} ->
  numbers
  |> Enum.map(fn row ->
    row
    |> String.split(" ", trim: true)
    |> Enum.map(&String.to_integer/1)
  end)
  |> Enum.zip()
  |> Enum.map(&Tuple.to_list/1)
  |> then(fn numbers ->
    ops
    |> String.split(" ", trim: true)
    |> Enum.map(fn
      "*" -> &Enum.product/1
      "+" -> &Enum.sum/1
    end)
    |> Enum.zip(numbers)
  end)
end)
|> Enum.sum_by(fn {op, numbers} -> op.(numbers) end)
input
|> Kino.Input.read()
|> String.split("\n")
|> Enum.split(-1)
|> then(fn {numbers, [ops]} ->
  numbers  
  |> Enum.map(&String.graphemes/1)
  |> Enum.zip()
  |> Enum.map(&Tuple.to_list/1)  
  |> Enum.map(&Enum.join/1)
  |> Enum.map(&String.trim/1)
  |> Enum.chunk_by(& &1 == "")
  |> Enum.take_every(2)
  |> then(fn numbers ->
    ops
    |> String.split(" ", trim: true)
    |> Enum.map(fn
      "*" -> &Enum.product/1
      "+" -> &Enum.sum/1
    end)
    |> Enum.zip(numbers)  
  end)
end)
|> Enum.sum_by(fn {op, numbers} -> 
  op.(Enum.map(numbers, &String.to_integer/1)) 
end)