Powered by AppSignal & Oban Pro

πŸŽ„ Year 2025 πŸ”” Day 02

elixir/notebooks/2025/day02.livemd

πŸŽ„ Year 2025 πŸ”” Day 02

Section

ranges =
  File.read!("#{__DIR__}/../../../inputs/2025/day02.txt")
  |> String.split("\n", trim: true)
  |> Enum.join("")
  |> String.split(",", trim: true)
  |> Enum.map(fn range ->
    String.split(range, "-", trim: true)
    |> Enum.map(&String.to_integer/1)
  end)

Part 1

ranges
|> Enum.flat_map(fn [r_start, r_end] ->
  r_start..r_end
  |> Enum.map(&Integer.to_string/1)
  |> Enum.filter(&(rem(String.length(&1), 2) == 0))
  |> Enum.map(&String.split_at(&1, div(String.length(&1), 2)))
  |> Enum.filter(fn {a, b} -> a == b end)
  |> Enum.map(fn {a, b} -> String.to_integer("#{a}#{b}") end)
end)
|> Enum.sum()

Part 2

defmodule Helper do
  def divisible_by(1), do: []

  def divisible_by(n) do
    1..div(n, 2) |> Enum.filter(&(rem(n, &1) == 0))
  end

  def split_string_every(string, n) do
    string
    |> String.graphemes()
    |> Enum.chunk_every(n)
    |> Enum.map(fn chunk -> Enum.join(chunk, "") end)
  end
end

ranges
|> Enum.flat_map(fn [r_start, r_end] ->
  r_start..r_end
  |> Enum.map(fn n ->
    ns = Integer.to_string(n)

    Helper.divisible_by(String.length(ns))
    |> Enum.map(&Helper.split_string_every(ns, &1))
  end)
end)
|> Enum.filter(fn combinations ->
  Enum.any?(combinations, fn [head | tail] -> Enum.all?(tail, &(&1 == head)) end)
end)
|> Enum.map(fn [combination | _] -> Enum.join(combination) |> String.to_integer() end)
|> Enum.sum()