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

Day 4

2022/day_04.livemd

Day 4

Mix.install([
  {:kino, "~> 0.7.0"}
])

Common

defmodule Day4 do
  def parse_input(textarea) do
    textarea
    |> Kino.Input.read()
    |> String.split("\n", trim: true)
    |> Enum.map(&transform_line/1)
  end

  defp transform_line(line) do
    [range1, range2] = String.split(line, ",", trim: true)

    {
      transform_range(range1),
      transform_range(range2)
    }
  end

  defp transform_range(range) do
    [from, to] = String.split(range, "-", trim: true)

    Range.new(
      String.to_integer(from),
      String.to_integer(to)
    )
  end
end

Input

textarea =
  Kino.Input.textarea("Input:",
    default: """
    2-4,6-8
    2-3,4-5
    5-7,7-9
    2-8,3-7
    6-6,4-6
    2-6,4-8
    """
  )
input = Day4.parse_input(textarea)

Part 1

defmodule Day4.Part1 do
  def run(input) do
    Enum.count(input, fn {range1, range2} ->
      includes?(range1, range2) or includes?(range2, range1)
    end)
  end

  defp includes?(range1, range2) do
    range2.first in range1 and range2.last in range1
  end
end
Day4.Part1.run(input)

Part 2

defmodule Day4.Part2 do
  def run(input) do
    Enum.count(input, fn {range1, range2} ->
      not Range.disjoint?(range1, range2)
    end)
  end
end
Day4.Part2.run(input)