this repo has no description
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}} -->