Brute force, after all.
defmodule Day3 do
@input "day3_1.input" |> File.read!() |> String.trim()
@phase1 false
if @phase1 do
defp parse(<<d1::binary-size(1), d2::binary-size(1), rest::binary>>),
do: do_parse_1(rest, {String.to_integer(d1), String.to_integer(d2)})
defp do_parse("", {d1, d2}), do: d1 * 10 + d2
defp do_parse(<<d::binary-size(1), rest::binary>>, {d1, d2}) do
d = String.to_integer(d)
acc =
cond do
d > d1 and rest != "" -> {d, -1}
d > d2 -> {d1, d}
true -> {d1, d2}
end
do_parse(rest, acc)
end
else
import Aoc2025.H
defp parse(<<d::binary-size(1), rest::binary>>),
do: do_parse(rest, {String.to_integer(d), unquote_splicing(minus_ones(11))})
defp do_parse("", digits),
do: digits |> Tuple.to_list() |> Integer.undigits()
defp do_parse(
<<d::binary-size(1), rest::binary>>,
{d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12}
) do
d = String.to_integer(d)
acc =
cond do
d > d1 and byte_size(rest) >= 11 -> {d, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}
d > d2 and byte_size(rest) >= 10 -> {d1, d, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}
d > d3 and byte_size(rest) >= 9 -> {d1, d2, d, -1, -1, -1, -1, -1, -1, -1, -1, -1}
d > d4 and byte_size(rest) >= 8 -> {d1, d2, d3, d, -1, -1, -1, -1, -1, -1, -1, -1}
d > d5 and byte_size(rest) >= 7 -> {d1, d2, d3, d4, d, -1, -1, -1, -1, -1, -1, -1}
d > d6 and byte_size(rest) >= 6 -> {d1, d2, d3, d4, d5, d, -1, -1, -1, -1, -1, -1}
d > d7 and byte_size(rest) >= 5 -> {d1, d2, d3, d4, d5, d6, d, -1, -1, -1, -1, -1}
d > d8 and byte_size(rest) >= 4 -> {d1, d2, d3, d4, d5, d6, d7, d, -1, -1, -1, -1}
d > d9 and byte_size(rest) >= 3 -> {d1, d2, d3, d4, d5, d6, d7, d8, d, -1, -1, -1}
d > d10 and byte_size(rest) >= 2 -> {d1, d2, d3, d4, d5, d6, d7, d8, d9, d, -1, -1}
d > d11 and byte_size(rest) >= 1 -> {d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d, -1}
d > d12 -> {d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d}
true -> {d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12}
end
do_parse(rest, acc)
end
end
def calc(input \\ @input) do
input
|> String.split(["\s", "\n"], trim: true)
|> Enum.sum_by(&parse/1)
end
end