about summary refs log blame commit diff
path: root/day3.exs
blob: 4e66de43ae38efae1aef7adf468a6bc680685965 (plain) (tree)







































                                                                            
defmodule Day3 do
  def input() do
    File.stream!("input/day3.in")
    |> Stream.map(fn x ->
      Regex.scan(~r/\d+/, x)
      |> Enum.map(&String.to_integer(hd(&1)))
    end)
  end

  def plots(), do: Enum.reduce(input(), %{}, &stake_claim/2)

  def part1() do
    plots()
    |> Enum.count(fn {_k, {v, _}} -> v > 1 end)
  end

  def part2() do
    hd(Enum.find(input(), &intact?(&1, plots())))
  end

  def stake_claim([id, x, y, w, h], claims) do
    coords = for wide <- 0..(w - 1), high <- 0..(h - 1), do: {wide, high}

    Enum.reduce(coords, claims, fn {wide, high}, acc ->
      Map.update(acc, {x + wide, y + high}, {1, [id]}, fn {count, claims} ->
        {count + 1, [id | claims]}
      end)
    end)
  end

  def intact?([id, _x, _y, _w, _h], plot) do
    Enum.all?(plot, fn {_coord, {_count, claims}} ->
      not Enum.member?(claims, id) || claims == [id]
    end)
  end
end

IO.puts(Day3.part1())
IO.puts(Day3.part2())