# Day 03 ```elixir Mix.install([ :kino_aoc ]) ``` ## Section ```elixir {:ok, puzzle_input} = KinoAOC.download_puzzle("2023", "3", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION")) ``` ``` {:ok, ".......12.......935............184.720...243........589.652..........435..........483.............6...........................904...........\n......*.....968*.....$............*........=..348...*..........986....*...................459....*........422................#......%482....\n....291............612....290..........903........699......218*.......376............890....*.838...81......*.....138.../194................\n..............156......$..*...891.&731....%..89...................523..........699....+...227......*.......225....=...........388....*......\n................*...189..591.*................*.......783.....107..-...54.287..$................533.../..............909........&.603.424...\n...229*952.....938............470.555.......746...28.....+...*.........................................279..826..788*.......................\n...................................*...............@.........867.-....102..845...542.779.....................*........182.166...511.........\n563.727.....282....237..171.......892...183.......................989....*..........*................$....709...8*974.=...%.....*.....873...\n....#..........+...*.......*..........................&......129+......491...................877....715.......................270.......#...\n.................53.....781...&295....@773.336......547................................45......*.............=800.....*359..................\n...342*468....&.....573....................*.................................%850............*..465................192.....*.......&115.....\n............988.......*...731.............789.673....*256..............677..................621...........#....716......910..297........22..\n204&....69............905...=.....641.472.......#.524............127....*..714.........*62..........622..324..&.................*...........\n..........*........................+....@.................812......*..955.....*.....257....../.................../..............545.........\n........668....91..&.........840......+..............566.....+...66.........660..............469.................525...765...........25.....\n...............$...666.979..*........952...122......%............................71......=39...../94.........................132......*.....\n......@.................../.460..#.......=.=..........146..625........214.........#.278................667..........386.......-....936......\n....643.......@..................974...464...........*.....*...........*.............%.....$...........=...=..%995...*......................\n........./...577...-....3.../186.................*.995.....678.&.......882...559...........374.......&...554.........428.......725....*.....\n.......96........678....%.....................529..............374...........*......924........=277..606..................#...#......8.257..\n...609....................397.......475...................651.......856......697.&.....&..=...................486........888................\n............-................*..................756...399....*..42................866....287.....#......515...*......................137....\n.....285..947....#..........997......=.....665..*......*..420...*.....-..268*457.............=63..758.....+..623.............+../...........\n..............458.....422.......338...827...+..462....797.....26....523..........*.880*.............................&.....934..157..........\n.......149........409....$................................................868.378......144..149............356.....872..............871.533.\n....22...*..........$........7.......149....979......................826.&.....................@........-.....*275.....................*....\n........518.773*.........10..$..........*........805..812.972......................123......*............98.........=........./609.682......\n.................5........./............349........$.....*..................786....*.......160..903...40.............209...............*....\n.......*.....................................497...........#.............../.....153.795............./.........&806..........839....419.337.\n78...58" <> ...} ``` ```elixir IO.puts(puzzle_input) ``` ``` .......12.......935............184.720...243........589.652..........435..........483.............6...........................904........... ......*.....968*.....$............*........=..348...*..........986....*...................459....*........422................#......%482.... ....291............612....290..........903........699......218*.......376............890....*.838...81......*.....138.../194................ ..............156......$..*...891.&731....%..89...................523..........699....+...227......*.......225....=...........388....*...... ................*...189..591.*................*.......783.....107..-...54.287..$................533.../..............909........&.603.424... ...229*952.....938............470.555.......746...28.....+...*.........................................279..826..788*....................... ...................................*...............@.........867.-....102..845...542.779.....................*........182.166...511......... 563.727.....282....237..171.......892...183.......................989....*..........*................$....709...8*974.=...%.....*.....873... ....#..........+...*.......*..........................&......129+......491...................877....715.......................270.......#... .................53.....781...&295....@773.336......547................................45......*.............=800.....*359.................. ...342*468....&.....573....................*.................................%850............*..465................192.....*.......&115..... ............988.......*...731.............789.673....*256..............677..................621...........#....716......910..297........22.. 204&....69............905...=.....641.472.......#.524............127....*..714.........*62..........622..324..&.................*........... ..........*........................+....@.................812......*..955.....*.....257....../.................../..............545......... ........668....91..&.........840......+..............566.....+...66.........660..............469.................525...765...........25..... ...............$...666.979..*........952...122......%............................71......=39...../94.........................132......*..... ......@.................../.460..#.......=.=..........146..625........214.........#.278................667..........386.......-....936...... ....643.......@..................974...464...........*.....*...........*.............%.....$...........=...=..%995...*...................... ........./...577...-....3.../186.................*.995.....678.&.......882...559...........374.......&...554.........428.......725....*..... .......96........678....%.....................529..............374...........*......924........=277..606..................#...#......8.257.. ...609....................397.......475...................651.......856......697.&.....&..=...................486........888................ ............-................*..................756...399....*..42................866....287.....#......515...*......................137.... .....285..947....#..........997......=.....665..*......*..420...*.....-..268*457.............=63..758.....+..623.............+../........... ..............458.....422.......338...827...+..462....797.....26....523..........*.880*.............................&.....934..157.......... .......149........409....$................................................868.378......144..149............356.....872..............871.533. ....22...*..........$........7.......149....979......................826.&.....................@........-.....*275.....................*.... ........518.773*.........10..$..........*........805..812.972......................123......*............98.........=........./609.682...... .................5........./............349........$.....*..................786....*.......160..903...40.............209...............*.... .......*.....................................497...........#.............../.....153.795............./.........&806..........839....419.337. 78...582............675................145.........405....77..361............952.......*..../741....................624..527*............... ...................../../....=.....+....&.............*51.....*..........733*.........728.........173....834.....76......................... ................878....276..792.....372....................385..179.............@610.............................%........146=.............. ..........522.....*...........................-....30....-........*.@................110=..+.......197.....643.................762......%... ......%....*...173.............420..407......261.........687.806.12..104.....914..........685.233.&.......*.....549...=...........*......591 .....837..135.......313...579....%.=.....613................../..........729.........257#.....&.........430.399*.....157.........970........ ...................*.....*.....*......@.....*............../....566........+.....................*906....................%.................. ....459.78$.775.768..62...345.537......122.803.142*758...148...*....992................711....316.........#...............521.298*590..289.. ....*.................#.........................................444............382.....*...@...............753.......927................/... .....592..735......+.............634.......652.....853....690................./.......874.846.35.....884.........182.-...................... .419........*.839.157.......795...................*.......*...........928........................756....*64......*.....*19.....309.......... .........716...*.......591....*....358$.#378.............623...............687.........-816......*............292...110....&....*......643.. ..134...........910......*.941.......................................547=....*....................490....938+..............422.482.......... ...*..331....$..........80.................#346....180...........737.........76.......992@...91......................../.................... ...16....$.140.464*831.....933.917....303............*......%.....*....336........339.......*.............@..939....583....*564.........864. ..............................*........=...+54.....449......209.912.....+.....615..%.....605............960..*..........219................. .........@442.....730..................................413...........................26.....................944..336........188......./..... ...190............#...@...524.544....968*.............*........466...222...536...843.@..........=.....32...........$..........-.......410... ......*..80@..491....232..-......*.......16........402......27..*...*.....*...................480....*........&........894.................. .....218.........*.............=..819......................*........857...896...........677........689........638...45*.....993............. ................754...........434.........622.338...........607....................&......&.%213...........................-................ ........+.894......................681.......*.........484.........963.498...*..538.............................................346......... .....802.....*162....752...........................................*........520...........229.2.586..513..............25=.746........782*423 ...............................@...307#.497....551..996..696....879...911................%......................277*........................ ....*157.....137....#.........621.........*...#.....*...#............*............527......9........./..............844.....@224....304..... .541............*.649.............412.....744......560..............404.....240.......986*.@.......346.....@..........................+..... ......268....764.................%.......................902....856.......*....*..........................242.....842.....#................. ........&...............514..38..........+..=...........@..............715.142..587.......307.................731...*...954....878*......... ............................*.....349....76.92....612.....376.......................257...$...................../.968..............765...... ........960*414........713.501......&............%.......*......*941............................#........415...........937%................. ....967............409..*......605......................375..771........599*884.................880.........*...127..$.................$513. .....*................*..171..*.....@.......507.895..................*.................636...........768...114....-..292.......-...223...... ...807...977.......218.......753...47.......*......*..............507.90....../725.......*.........+...@.....................755......*..... ............*478.............................542....676...............................673........974.....@....*170....261..............134.. 800...............532............................15............%...445..102.............../510.........625.279..........-.....*............. .......................654.....850.405......................395.....-.......467....477...........973............../........191........398... .925...793...423*.........@..........................................................=.659..........*.....817.....230...........653..-...... .......*.........52...........764$....273...................@........430....................................*...........669.....-.......71.. .435....804..177....990.838.........#..-...475...297..337..360.........*....914.............................833............................. ....*.......*.........*...*.......281......&......*..+.............328..746......=215.......359....295.....................#481......868.... ..967........936.689%.785..515...............*64.827........................761.........+....&.......+..............................*....637 ....../.+265..............................562...............235........585..*...........793........=...838.147....284.902..301*330.......... ....579.........................21%..327................481..*...469%..*.....297.704..............797.....*...........*.................#... ......................638............*...................*....81.......780.........*...../...282....................907.882.781.......797... ..........671....608.................295.................302......953............171..919.......*........................*...*......#....... ............*....*....251.....191........#............*..........................................999.....451....+....286.415.581....274..... ..245$.....217...649.-....................898......950..................495*497.......53*............@...........398..-..................... ...........................942.......323...............+.....623.........................804.......875........................#............. .....42..543.................*..320....*..918....314....145...........603......991$.921.......261......................762...187.....951*638 .....*..#........53........374........756...........*.........-.......................*........../..217*550..............*.................. ....217..........*................................743......703....368...$861..4*966.415..703................................*959........*344 ...........626...31...602.................700..........696........*.....................*......396..........591.......*124.................. ..135........@................................699.139.....*.662....46........=797......144.....#...*289......*.....840............-...102.44 ................909.......180.............100.*....#...574..*............52...................................451............764.517....*... ........701*..........127*............117../...787...........67.....903..........273....*900................................=..........112.. ............430............423.67.......*..............*572...........@...199.........94..........686.....679.....................921*...... .542*119...............396....*.......938...........250......888..........*.....978...................25..../.........306.............780... ...............251........*.....................238......................340....+..............112....*........120...*....24................ .223.....549......-..98..60..775..28*105...........*.436..951.599.................309*682.......*..937...158.....*....697.*......764..$..... .....788............#....................768.....266........*..%..............................779........*.......542.......148...*....529... ....*......310.............412.......23.+....289..........560............249+.204..606*................271...805.......394.......898........ ....919.......&...867.......*........*......%.........592............166.........*.....460.........369..........*........*.................. .........920.......*.....233.....732..500.....950.....*.......514...........110..961..................*309.....450..#...521................. .................753...............*............#...965..............................852...841....%........524.....981............653....... ...........858...........*..234..922........65..................991.........-839.800....*......869...836..$.............675..789...*....505. ..........*.............516...*..................774.....&.149.=.................*.......737.........*......402....%.......*....#..762...... ........780.........4.........116.....................976..-...........%........791..................300.....%....338.471................... ...................*.................480*160..3..............*727.....363................................................................167 ...........743.....721.......................*..........808...............942...........339.289.............$............416.....$.......... ..955...................606*623.............718...503....*...................*245..........*........531.....686......250..../....275........ .............@....................110...............*...309..#....&......210..........386.................%...........*........+........391. .....444.....743......519..691......*.......-824......+......759.617....*.......710..*.....814.........356.........464.......709............ ......*..746......247.....*......596..999.............907.............296.-..../.......760.+.................$.890.......................669 ...479.....*.........*.......561.....+..........*178......................977....266...*.....640..........607.....*.....%...........545..... ........395...=......361........*372.........655..........398...203..11................147..*......../.............196..499........*........ ..561........646......................*898.......175.570.....$.....#...*..135..............633..314...871......898..........891...90.....780 .......*91........405..............627..............*....736.........760.....*........=..........*...........%....*..........*.............. ....722...........*......................................*.................744.698.367..-........767..........236.692.......308............. ...............740........./............906......*593...977.......645............*......167.............................................*... ........+...............123...................281....................*...543......461........................175.....................381.319 .282...814......771*........920.......................@............473....*...............&....872...../401.....*......=......18............ ....*.........%......993...*...........................256..223...........242....977.......293.-...............550.....435.................. ....23.........960........307....$.....504.638*656...............&...................203.............33.$430..................731........... ................................885......*................398....763...........805.....=....338.......*......146*916..................513... ..20...............42....................828.............../...................*............$.........531............159*761......78........ ......805-...-..........598...........#.............351........34.........682..516.534..............*........&..........................283. ..............664....../.......255..887.....258......%.........*.........*............*.....226..931.91......128............................ ...557.938#.......75.....585..*...............*.194......#..686........786..........755.......&..........637..............988.......275..... ....*............%....35...*.141...........508.....*865.967..............................80*............./.....978....790*.....@...*........ .662..................*..............@939...........................204........484....34....99.............@.................350.54......... ............358....832..=......................%......307.95........*......654...*......&.........734.....491...50...924.385................ ............*............340................483.........-.*.......118..794*.....431...........783..*..............-......*.........&594.#... ..........338........=.............$.................*....94....................................*...546.....$.......187..593.768........282. ...............796.380.183....+.564..94.144.........138..............394.392.....971.......#928.447........275..57...*.......&.............. ...........233...*.......%...40........*........................945.....*.........-.................%.............=.438...........*......906 .....881.../...491...903..........918.....303......................*........578*...................807......597................681.539...... ......*.................*.463.467*....246.......577.....198.....245.....967.....988.&.........759.......=...*.........-889.................. ......462..978........664...%...........*.-731.../.....&....375.............#.......217........@........381.250...219......947.............. ..........&..........................252.......%.............*..............258............427...137...............@........@....-175....... ....864...................461..................234.......69.222........*...........411....=............651...#.............................. ....*......243...............*283...................777-..*..........92.761..581%.*.....................$.....258..867..876................. .916......%.........629.................911*238...........680...239................672.............137@...469.........*.......737...@....... ..............764....*........894/..289...........944..........#...........@....%........../876..........*.........687.........*....436..... ......442.255.....442..903.............*.....*493..../......................338..346...................927..............764.....536......... .........*.....*........*.....869*888.597.241..................11-....542#...........412*..................235.............................. .804.329......344....195...94.......................................*....................880......44.622.........342.18...............417... ....*.....=................+.........76..328.....803.....658.....254.............327..........340......*.............@...................... ...........254........../...........*...*...........*234...%..........20.....238...*..........*.........380......&......78.246%...598....... .96....990.........%..718...%....869.......596....*......................423.....433..93.....613....$.............905...=........*.....497.. ...*....*........=.86.....499..............*...385.296...................*...........*...............523.$.....................529...$.*.... ...780.685.....822....................560.35.............................529......780.....................453......................711..930. ``` ``` :ok ``` ```elixir defmodule Day03 do def parse_line("", {_, _, acc}), do: acc def parse_line("." <> rest, {x, y, acc}), do: parse_line(rest, {x + 1, y, acc}) def parse_line(<> <> _ = str, {x, y, items}) when c in ?0..?9 do {num, rest} = Integer.parse(str) len = floor(:math.log10(num) + 1) ref = make_ref() points = for i <- 0..(len - 1) do {{x + i, y}, {ref, num}} end parse_line(rest, {x + len, y, points ++ items}) end def parse_line(<> <> rest, {x, y, items}) do parse_line(rest, {x + 1, y, [{{x, y}, <>} | items]}) end def around({x, y}) do for dx <- -1..1, dy <- -1..1, do: {x + dx, y + dy} end end grid = puzzle_input |> String.split() |> Enum.with_index() |> Enum.flat_map(fn {line, y} -> Day03.parse_line(line, {0, y, []}) end) {parts, ids} = grid |> Enum.split_with(fn {_, value} -> is_binary(value) end) parts = Map.new(parts) ids = Map.new(ids) ``` ``` %{ {77, 129} => {#Reference<0.209765579.1433141249.123990>, 581}, {120, 47} => {#Reference<0.209765579.1433141249.123295>, 894}, {4, 5} => {#Reference<0.209765579.1433141249.122921>, 229}, {78, 98} => {#Reference<0.209765579.1433141249.123728>, 245}, {29, 25} => {#Reference<0.209765579.1433141249.123095>, 7}, {4, 81} => {#Reference<0.209765579.1433141249.123572>, 135}, {121, 77} => {#Reference<0.209765579.1433141249.123544>, 762}, {119, 60} => {#Reference<0.209765579.1433141249.123401>, 292}, {111, 108} => {#Reference<0.209765579.1433141249.123813>, 175}, {78, 75} => {#Reference<0.209765579.1433141249.123526>, 497}, {58, 84} => {#Reference<0.209765579.1433141249.123603>, 572}, {58, 33} => {#Reference<0.209765579.1433141249.123159>, 687}, {13, 55} => {#Reference<0.209765579.1433141249.123356>, 764}, {91, 38} => {#Reference<0.209765579.1433141249.123211>, 846}, {9, 58} => {#Reference<0.209765579.1433141249.123378>, 960}, {25, 87} => {#Reference<0.209765579.1433141249.123628>, 60}, {21, 97} => {#Reference<0.209765579.1433141249.123717>, 721}, {126, 48} => {#Reference<0.209765579.1433141249.123304>, 993}, {26, 82} => {#Reference<0.209765579.1433141249.123584>, 180}, {22, 36} => {#Reference<0.209765579.1433141249.123185>, 62}, {79, 81} => {#Reference<0.209765579.1433141249.123577>, 797}, {65, 55} => {#Reference<0.209765579.1433141249.123358>, 856}, {99, 39} => {#Reference<0.209765579.1433141249.123220>, 756}, {52, 42} => {#Reference<0.209765579.1433141249.123245>, 180}, {120, 77} => {#Reference<0.209765579.1433141249.123544>, 762}, {133, 57} => {#Reference<0.209765579.1433141249.123377>, 765}, {68, 81} => {#Reference<0.209765579.1433141249.123576>, 46}, {22, 103} => {#Reference<0.209765579.1433141249.123768>, 361}, {44, 93} => {#Reference<0.209765579.1433141249.123687>, 65}, {87, 32} => {#Reference<0.209765579.1433141249.123151>, 110}, {81, 37} => {#Reference<0.209765579.1433141249.123201>, 382}, {111, 25} => {#Reference<0.209765579.1433141249.123099>, 275}, {98, 0} => {#Reference<0.209765579.1433141249.122882>, 6}, {110, 80} => {#Reference<0.209765579.1433141249.123570>, 591}, {19, 138} => {#Reference<0.209765579.1433141249.124066>, 86}, {88, 62} => {#Reference<0.209765579.1433141249.123415>, 673}, {37, 15} => {#Reference<0.209765579.1433141249.123010>, 952}, {65, 44} => {#Reference<0.209765579.1433141249.123266>, 912}, {28, 20} => {#Reference<0.209765579.1433141249.123049>, 397}, {10, 32} => {#Reference<0.209765579.1433141249.123149>, 522}, {101, 87} => {#Reference<0.209765579.1433141249.123637>, 937}, {87, 2} => {#Reference<0.209765579.1433141249.122897>, 890}, {46, 108} => {#Reference<0.209765579.1433141249.123810>, 281}, {82, 139} => {#Reference<0.209765579.1433141249.124078>, 780}, {137, 104} => {#Reference<0.209765579.1433141249.123789>, 780}, {82, 100} => {#Reference<0.209765579.1433141249.123745>, 710}, {127, 130} => {#Reference<0.209765579.1433141249.124003>, 737}, {45, 130} => {#Reference<0.209765579.1433141249.123997>, 238}, {70, ...} => {#Reference<0.209765579.1433141249.123447>, ...}, {...} => {...}, ... } ``` ```elixir used_parts = for {xy, _} <- parts, dxy <- Day03.around(xy), {:ok, val} <- [Map.fetch(ids, dxy)], into: %{}, do: val Enum.sum(Map.values(used_parts)) ``` ``` 540025 ``` ```elixir cogs = for {xy, "*"} <- parts, values = Map.take(ids, Day03.around(xy)) |> Map.values() |> Enum.uniq() |> Enum.map(&elem(&1, 1)), match?([_, _], values), do: Enum.product(values) Enum.sum(cogs) ``` ``` 84584891 ```