Day 5
Mix.install([
{:kino_aoc, "~> 0.1"}
])
Setup
{:ok, input} = KinoAOC.download_puzzle("2025", "5", System.fetch_env!("LB_AOC_SESSION"))
{:ok,
"435767821145222-437542065836164\n40922560379023-45361625965897\n433483051103449-435226969759467\n103879172354475-104083984552668\n143976141047070-149704968501856\n324338045724310-328005549841074\n317812869521516-321234660027768\n397962755552251-400192369703711\n171983076544055-171983076544055\n339945164807007-340633491305409\n279531392826505-279816734544586\n104990055572338-105107856306124\n328005549841075-329765621391064\n127991253754465-129951653343840\n355857878124764-358385606402119\n272731198580506-273246390457576\n70689854028220-78685047535521\n503352690049488-510560297161322\n102666171522443-103087576432901\n45361625965899-47427458143925\n369584312491857-371478017113317\n166211926567052-168331663906491\n106589199166428-106855458935099\n434763225748311-436503773108745\n171983076544055-177666782634599\n336575032463200-337080425428790\n225399387289088-226765651103365\n303723977826912-310292761333116\n151716851447006-155777680308567\n373316997145833-378453387481395\n534257831069231-534942781913367\n55718522314941-59870310846522\n382776255223298-387983994862059\n545052205755978-548923584157338\n368703642646505-370315253155496\n203692803417388-207889028754216\n458391796034147-460530373521337\n279008627456494-279366788894712\n452914619117074-458391796034145\n223568241072271-225026875318602\n540902490370585-541380689797219\n101697389842376-101950138071699\n283654728568734-288365806620047\n537872412027744-538423113080634\n260128529637136-260128529637136\n367360333289059-368912498940132\n139399741684678-139399741684678\n295771658641023-298067904329585\n141639793951694-146283515082581\n100602126462801-101179459980295\n288365806620048-288365806620048\n361982642431803-363879017843927\n74756502764290-76233752675094\n90965560321456-95371287170236\n122881380221199-125199536212134\n275014603871430-275812887089541\n273103025911361-273570669932717\n106418002021065-106589199166428\n11745995299669-11745995299669\n124523626647373-126751395783808\n102435256803916-102932918026407\n83797828825790-86111533566344\n22161113737564-25972619829376\n440165185930827-442088040512483\n404481195497081-411224792598851\n276285431852154-277117047790836\n272731198580506-273570669932717\n478780287245640-478780287245640\n540530670795229-540902490370585\n313823078327954-317812869521514\n83797828825790-86111533566344\n23556556778726-29187005843328\n121107915266238-123538438773612\n437231558664452-438846442311148\n335167642847972-335634169923343\n277578392966716-278376655488219\n102666171522443-103384934895611\n335634169923343-335909768680093\n109440561717184-109761022873644\n540530670795229-540712817972731\n229438095543824-230776110869564\n212069653871013-215677245888467\n125901549997827-128418039487586\n109117611219417-109761022873644\n107128479457351-107710734047382\n338674583812156-339436601998066\n345856555614293-345856555614293\n277858240495680-278156054921895\n523966588797071-528978213722247\n375933845592089-380734874862247\n486887966676223-491793947094996\n277578392966716-278376655488219\n224358763814124-226073900519063\n514639405707727-518326621626485\n111624376324086-119527049205991\n226508442746523-227966191717636\n271531800312167-271729868649407\n394799458263786-400192369703711\n293532338521233-300835928122097\n274258438596817-274892942217584\n242685346581906-242685346581906\n345856555614294-347856476654039\n432669297148941-434294988354370\n553798970066387-562410961054321\n232645398124000-239916382901420\n227582044514096-229034220429771\n533959769928955-534382423735152\n556784562882017-558454643755254\n334879464471433-335167642847972\n438003966941549-439922463093597\n274892942217584-275014603871430\n414075202192991-416811985301625\n182232686906027-188624170379212\n161757984000523-168331663906491\n222460791158185-223854739707238\n464025806637756-471787626088320\n104083984552668-104990055572338\n131364789778337-139399741684677\n493166077035015-493166077035015\n263163889131547-269808128896144\n332968751899179-333098211249400\n207889028754216-207889028754216\n339670331728617-340167478115742\n382776255223298-387983994862059\n242685346581907-247085667609343\n535884186380042-536102928344477\n411224792598851-411224792598851\n11745995299669-15721067146153\n364645113373755-36642452" <> ...}
ex = """
3-5
10-14
16-20
12-18
1
5
8
11
17
32
"""
"3-5\n10-14\n16-20\n12-18\n\n1\n5\n8\n11\n17\n32\n"
a = 1..2
a.last
2
Solution
defmodule Day5 do
def parse(str) do
a = str |> String.split("\n")
fresh = a |> Enum.take_while(fn x ->
x != ""
end) |> Enum.map(fn x ->
[a, b] = String.split(x, "-", trim: true)
String.to_integer(a)..String.to_integer(b)
end)
to_check = a
|> Enum.drop_while(fn x -> x != "" end)
|> Enum.reject(fn x -> x == "" end)
|> Enum.map(&String.to_integer/1)
{ fresh, to_check }
end
def solve(str) do
{fresh, to_check } = parse(str)
to_check
|> Enum.filter(fn x ->
fresh |> Enum.any?(fn fresh_range ->
x in fresh_range
end)
end)
|> Enum.count()
end
def merge_ranges(a), do: merge_ranges(a |> Enum.sort_by(fn x -> x.first end), [])
def merge_ranges([], acc), do: acc
def merge_ranges([a], acc) do
acc ++ [a]
end
def merge_ranges([a, b | rest], acc) do
if range_touching?(a, b) do
merge_ranges([combine_range(a, b)] ++ rest, acc)
else
merge_ranges([b] ++ rest, acc ++ [a])
end
end
def range_touching?(a, b) do
a.last + 1 == b.first || b.last + 1 == a.first || !Range.disjoint?(a, b)
end
def combine_range(a, b) do
min(a.first, b.first)..max(a.last, b.last)
end
def reduce_overlapping(fresh) do
fresh
|> merge_ranges()
|> Enum.reduce(MapSet.new(), fn fresh_range, acc ->
MapSet.union(acc, MapSet.new(fresh_range))
end)
end
def sum_ranges(ranges) do
ranges |> Enum.reduce(0, fn r, acc -> acc + Range.size(r) end)
end
def partition(fresh) do
indexed = fresh |> Enum.with_index()
{overlapping_list, nonoverlapping_list } = indexed
|> Enum.reduce({[], []}, fn {range, idx }, {overlapping_list, nonoverlapping_list } ->
is_overlapping = Enum.any?(indexed, fn {cur, cur_idx} ->
cur_idx != idx && !Range.disjoint?(cur, range)
end)
if is_overlapping do
{
[range | overlapping_list],
nonoverlapping_list
}
else
{
overlapping_list,
[range | nonoverlapping_list]
}
end
end)
{overlapping_list, nonoverlapping_list }
end
def solve2(str) do
{fresh, _} = parse(str)
{overlapping_list, nonoverlapping_list } = partition(fresh |> merge_ranges())
a = nonoverlapping_list |> sum_ranges()
b = reduce_overlapping(overlapping_list) |> MapSet.size()
a + b
end
end
{:module, Day5, <<70, 79, 82, 49, 0, 0, 31, ...>>, {:solve2, 1}}
Day5.parse(ex)
{[3..5, 10..14, 16..20, 12..18], [1, 5, 8, 11, 17, 32]}
{fresh, to_check } = Day5.parse(input)
IO.puts(to_check |> List.last())
IO.puts(to_check |> List.first())
513635430305496
146852967135975
:ok
Day5.solve(input)
652
Part 2
Day5.merge_ranges([ 1..6, 1..2, 3..4, 2..3])
[1..6]
Day5.solve2(input)
341753674214273