Powered by AppSignal & Oban Pro

Day 3

2025/03.livemd

Day 3

Mix.install([
  {:kino_aoc, "~> 0.1"}
])

Setup

{:ok, input} = KinoAOC.download_puzzle("2025", "3", System.fetch_env!("LB_AOC_SESSION"))
{:ok,
 "3443334373333545324339252335233845533545245422755419334136447332543353734352333342352363164324383844\n3433434334423225944433232334354334442333333924335333942343333233383543372333445344524534333323244433\n6445452443354336524556464436667635356536446542335532632338343422556865453434662554935342463434223136\n2522122122222222213514222332223223222122232532121112132223123212333143222121122332225253222212321211\n1222223242242124231221324122442244142124714212424435424317222323122242413232232443422232242244223233\n2234122222122211233222212122322222222222222212122222222222213223132341322332622221213243232112232212\n2356223112523523532351855315332431353232242235731412344613124336231133453223225343122332352374734222\n3343432333333433333353345383224352442322423613343232333233333222334353244322433323333349333323335332\n7342322222321224721259321122442322323912322222234431214315422526522422685252123223422224521263228262\n2321237353323325232227232324323625332343235343331932233222233323332333243732354322373633211232251338\n6587278866858777575848766583196774727779775755865586583751787657778977475965868675678578574775877768\n4243433343343335433332333662344232834535534353463535333433445334453536554362335333523333323222363333\n1222334223412222322312213223222224223224132322142333222313223222232233432133232522222122322232231432\n7266252247353442465575262453542242436244617535242642143465626662245355662263447433233352622264565552\n2252222223221222222322222211322222222222221222222222342312212222112222122222223221212222222121122311\n2252214253222222122211254121212253225342223513152224242122222322183252332223252231255521212124562145\n3232233343223221533552323233322812243222732333237371343223233422352234325413334443214233362223323333\n2342443423434526262344243443334434122353342643463324544542333433334534234212574643223435444444424243\n4234533874331232443932333323515328233454263273334347334324342533222225345733324339333234342333346138\n3225147738277523635463338685217615828176126784146642842386623467638862577174577655862764255576728659\n2222222222232222223122123222122222122122221122112122322222221225232222322222222222232211222112321222\n3479323224342333223222511252232243342322124343433333222423222214453551323235444432472352233322223245\n5463572146329235254353543532352353454434345543284253144835282525757726144212437443336453583455472233\n1222222122232121321224222122262222222212333232225232224222221222242225213721321323323223221132222221\n2341322341242324233451232255415814465512213322234248221211241242354232236212222122232223323452163412\n4454463265754646433444423485756661531442323357343522334426252546663346334245634521226274343347414441\n2647576354734635436333353353454273639633652433471856516225325343333553543454645525636257353443245656\n2434324664221452323121333334642342424422623424453634123334432232245624343446312873326264222232333352\n4341452433364323733343336332333324343344332343333633633443322323333313333234234432234323431333333333\n6539633785395567855785537696565568653433836276358445868355445588635456465735423644556666765566984565\n5242415277566773245362345636373244476363461772322135753412671171452255524256317474564632275365114489\n5234163333754933332443335632313411333333435246363534333435423743312133323253334516354442325433433232\n3232234523232335215332112333353212123545233533533432535143412323324442133233323333783335322314234332\n2222515311121345232324112232115452512513542442222322424443353212315524445431541121234353443231126789\n5313558143442512332546524125525243435455455424424335433324525342573623365424335654441164544354311347\n4455478257574554847563757556444944565455455661632453455457564745577344644385255775475355544554747447\n2222232222222816322121246651222326222342622252382321342283266252222222222222242222444422514231522245\n3343354327136217325663353616348466432624634323433348426344653794243336744293233743844836947223741433\n3424514445433844253564465344255143437345442344265435573554434425523544446613523362352333543424443543\n5335334765735554437649555196451745532315534523724335121443954695742359425344662446569273433433285945\n26321324736545225647675553563724455545432325355576731474" <> ...}
ex = """
987654321111111
811111111111119
234234234234278
818181911112111
"""
"987654321111111\n811111111111119\n234234234234278\n818181911112111\n"

Solution

defmodule Day3 do
  def parse(str) do
    String.split(str) |> Enum.map(fn x -> String.to_integer(x) |> Integer.digits() end)
  end

  def drop_smaller([last | rest], removals_left, digit) when removals_left > 0 and last < digit do
    drop_smaller(rest, removals_left - 1, digit)
  end

  def drop_smaller(stack, removals_left, _digit), do: {stack, removals_left}
   
  def max_joltage_from_bank(bank_digits, digits_to_keep) do
    removals_left = length(bank_digits) - digits_to_keep

    stack =
      Enum.reduce(bank_digits, {[], removals_left}, fn digit, {stack, removals_left} ->
        {stack, removals_left} = drop_smaller(stack, removals_left, digit)
        {[digit | stack], removals_left}
      end)
      |> elem(0)
      |> Enum.reverse()

    stack
    |> Enum.take(digits_to_keep) |> Integer.undigits()
  end

  def solve(str) do
    parse(str)
      |> Enum.map(fn x -> max_joltage_from_bank(x, 2) end)
      |> Enum.sum()
  end
 
  def solve2(str) do
    parse(str)
      |> Enum.map(fn x -> max_joltage_from_bank(x, 12) end)
      |> Enum.sum()
  end


end
{:module, Day3, <<70, 79, 82, 49, 0, 0, 14, ...>>, {:solve2, 1}}

Part 1

Day3.parse(ex)
[
  [9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 1, 1, 1, 1, 1],
  [8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9],
  [2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 7, 8],
  [8, 1, 8, 1, 8, 1, 9, 1, 1, 1, 1, 2, 1, 1, 1]
]
Day3.parse(ex) |> List.first() |> Day3.max_joltage_from_bank(2)
98
Day3.solve(ex)
357
Day3.solve(input)
17452

Part 2

Day3.parse(ex) |> List.first() |> Day3.max_joltage_from_bank(12)
987654321111
Day3.parse(ex) |> Enum.at(1) |> Day3.max_joltage_from_bank(12)
811111111119
Day3.parse(ex) |> Enum.at(2) |> Day3.max_joltage_from_bank(12)
434234234278
Day3.solve2(ex)
3121910778619
Day3.solve2(input)
173300819005913