Powered by AppSignal & Oban Pro

Day 5

elixir/day05.livemd

Day 5

Setup

Mix.install([
  {:kino, "~> 0.4.1"}
])
input = Kino.Input.textarea("Problem input")
input
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Stream.map(fn x ->
  x
  |> String.split(" -> ", trim: true)
  |> Enum.flat_map(&String.split(&1, ",", trim: true))
  |> Enum.map(&String.to_integer/1)
end)
|> Enum.flat_map(fn
  [x, y1, x, y2] -> Enum.zip(Stream.cycle([x]), y1..y2)
  [x1, y, x2, y] -> Enum.zip(x1..x2, Stream.cycle([y]))
  [_x1, _y1, _x2, _y2] -> []
end)
|> Enum.frequencies()
|> Map.values()
|> Enum.count(fn x -> x >= 2 end)

Part 2

input
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Stream.map(fn x ->
  x
  |> String.split(" -> ", trim: true)
  |> Enum.flat_map(&String.split(&1, ",", trim: true))
  |> Enum.map(&String.to_integer/1)
end)
|> Enum.flat_map(fn
  [x, y1, x, y2] -> Enum.zip(Stream.cycle([x]), y1..y2)
  [x1, y, x2, y] -> Enum.zip(x1..x2, Stream.cycle([y]))
  [x1, y1, x2, y2] -> Enum.zip(x1..x2, y1..y2)
end)
|> Enum.frequencies()
|> Map.values()
|> Enum.count(fn x -> x >= 2 end)