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

Day 4

day4.livemd

Day 4

Section

test_input = """
2-4,6-8
2-3,4-5
5-7,7-9
2-8,3-7
6-6,4-6
2-6,4-8
"""

path = "Projects/aoc/2022/day4.txt"
input = File.read!(path)

Part 1

defmodule Day4 do
  def part1(input) do
    prep_input(input)
    |> Enum.filter(fn pairs ->
      contains?(pairs)
    end)
    |> Enum.count()
  end

  def part2(input) do
    prep_input(input)
    |> Enum.filter(fn pairs ->
      overlap?(pairs)
    end)
    |> Enum.count()
  end

  def prep_input(input) do
    input
    |> String.split()
    |> Enum.map(fn x ->
      x
      |> String.split(",")
      |> Enum.flat_map(fn y ->
        y
        |> String.split("-")
        |> Enum.map(&String.to_integer(&1))
      end)
    end)
  end

  def contains?([p1, p2, p3, p4]) when p1 >= p3 and p2 <= p4, do: true
  def contains?([p1, p2, p3, p4]) when p3 >= p1 and p4 <= p2, do: true
  def contains?(_), do: false

  def overlap?([p1, _, p3, p4]) when p1 >= p3 and p1 <= p4, do: true
  def overlap?([_, p2, p3, p4]) when p2 >= p3 and p2 <= p4, do: true
  def overlap?([p1, p2, p3, _]) when p3 >= p1 and p3 <= p2, do: true
  def overlap?([p1, p2, _, p4]) when p4 >= p1 and p4 <= p2, do: true
  def overlap?(_), do: false
end

Day4.part2(input)