Powered by AppSignal & Oban Pro

AOC 2025 Day 2

2025/day_02.livemd

AOC 2025 Day 2

Section

defmodule Day02 do
  def data(:test) do
    ~s(11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124)
  end

  def data(:real) do
    File.read!("day_02.dat")
  end

  defp prep(data) do
    String.trim(data)
    |> String.split(",")
    |> Enum.map(fn range ->
      [a, b] = String.split(range, "-")
      a = String.to_integer(a)
      b = String.to_integer(b)
      Range.new(a, b)
    end)
  end

  def part_01(ranges) do
    prep(ranges)
    |> Enum.reduce(%{invalid_ids: []}, fn range, acc ->
      invalid_ids =
        Enum.filter(range, fn i ->
          digits = Integer.digits(i)
          l = length(digits)

          if Integer.mod(l, 2) == 0 do
            {x, y} = Enum.split(digits, div(l, 2))
            x == y
          end
        end)

      %{acc | invalid_ids: [invalid_ids | acc.invalid_ids]}
    end)
  end

  def part_02(ranges) do
    prep(ranges)
    |> Enum.reduce(%{invalid_ids: []}, fn _range, acc ->
      invalid_ids = []
      %{acc | invalid_ids: [invalid_ids | acc.invalid_ids]}
    end)
  end
end

%{invalid_ids: invalid_ids} =
  Day02.data(:test)
  |> Day02.part_02()

List.flatten(invalid_ids) |> Enum.sum()