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