this repo has no description
1<!-- livebook:{"persist_outputs":true} -->
2
3# Day 07
4
5```elixir
6Mix.install([
7 {:kino_aoc, git: "https://github.com/ljgago/kino_aoc"}
8])
9```
10
11<!-- livebook:{"output":true} -->
12
13```
14:ok
15```
16
17## Section
18
19<!-- livebook:{"attrs":{"day":"7","session_secret":"ADVENT_OF_CODE_SESSION","variable":"puzzle_input","year":"2022"},"chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
20
21```elixir
22{:ok, puzzle_input} =
23 KinoAOC.download_puzzle("2022", "7", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
24```
25
26<!-- livebook:{"output":true} -->
27
28```
29{:ok,
30 "$ cd /\n$ ls\ndir fts\ndir jnwr\ndir lrvl\ndir nzgprvw\ndir snwqjgj\n16394 tllvcdr.sjl\n195891 zbdp.gqb\ndir zddrb\n$ cd fts\n$ ls\ndir dlqtffw\ndir rbfmmjvd\n254713 wvwhrb.dhh\n$ cd dlqtffw\n$ ls\n73533 nqbvg.fgd\n$ cd ..\n$ cd rbfmmjvd\n$ ls\n290697 zcgrgff.fnf\n$ cd ..\n$ cd ..\n$ cd jnwr\n$ ls\n323577 ghmtnzr\n57588 tdcbdpnr\ndir wbv\ndir zzbvdcf\n$ cd wbv\n$ ls\ndir nmdwbnnr\n253584 slzdbm.ncn\n$ cd nmdwbnnr\n$ ls\n208370 scbcsb.pjg\n$ cd ..\n$ cd ..\n$ cd zzbvdcf\n$ ls\n8052 ssssrhwz\n$ cd ..\n$ cd ..\n$ cd lrvl\n$ ls\ndir bqqltcg\n189288 cwpwh\n90813 jhnddzml.lww\ndir pwc\ndir rjl\ndir rzvqvv\ndir slzdbm\ndir tcbjmq\n140665 zbdp.gqb\ndir zhbpqlnd\n$ cd bqqltcg\n$ ls\ndir dlbjblbf\ndir fdlw\ndir jnwr\ndir slzdbm\ndir zcgrgff\n$ cd dlbjblbf\n$ ls\n11732 rnsrrf.rtv\n$ cd ..\n$ cd fdlw\n$ ls\ndir hlvpfw\n228436 mzsfcvgv.pqw\n$ cd hlvpfw\n$ ls\ndir dhwq\n$ cd dhwq\n$ ls\n127459 cgdpqh.tct\n58310 jnwr.nqt\n$ cd ..\n$ cd ..\n$ cd ..\n$ cd jnwr\n$ ls\n305998 ssssrhwz\n129135 vrt.qdt\n86204 wnvm.bld\n$ cd ..\n$ cd slzdbm\n$ ls\n40915 zbdp.gqb\n120991 zsvffwlt.rbp\n$ cd ..\n$ cd zcgrgff\n$ ls\n94614 jnwr.mqm\n191626 zbdp.gqb\ndir ztrslh\n$ cd ztrslh\n$ ls\ndir bhzn\n201167 dvcjtzvs.rvd\ndir slzdbm\ndir szrth\ndir zcp\n$ cd bhzn\n$ ls\n119164 qbgmrqw\n102090 zbdp.gqb\n$ cd ..\n$ cd slzdbm\n$ ls\n124928 gtdq\n$ cd ..\n$ cd szrth\n$ ls\ndir hpbbsq\ndir vlwlsdjp\ndir zcgrgff\n$ cd hpbbsq\n$ ls\n151717 qsdhff.jsv\n$ cd ..\n$ cd vlwlsdjp\n$ ls\n15049 glpdjtq.mwm\n302526 jnwr.tds\n9550 lhwtbh\n22857 ssssrhwz\n$ cd ..\n$ cd zcgrgff\n$ ls\n73640 mpq.cdn\ndir zcgrgff\n$ cd zcgrgff\n$ ls\n115955 rssmrfbq.trs\n$ cd ..\n$ cd ..\n$ cd ..\n$ cd zcp\n$ ls\ndir qdjtmwrr\ndir wpdjttm\n$ cd qdjtmwrr\n$ ls\n138185 jnwr\n$ cd ..\n$ cd wpdjttm\n$ ls\n207755 vvwtghjb\n$ cd ..\n$ cd ..\n$ cd ..\n$ cd ..\n$ cd ..\n$ cd pwc\n$ ls\n15911 fqw\n$ cd ..\n$ cd rjl\n$ ls\n119274 ssssrhwz\n$ cd ..\n$ cd rzvqvv\n$ ls\n273935 ssssrhwz\n$ cd ..\n$ cd slzdbm\n$ ls\ndir hlvpfw\n290414 lgzbzjvd.glj\ndir ljpmphn\n316440 slzdbm.tsj\n$ cd hlvpfw\n$ ls\ndir mhvmszgh\n107004 slzdbm\n$ cd mhvmszgh\n$ ls\ndir tftstdp\n$ cd tftstdp\n$ ls\n176794 mpq.cdn\n$ cd ..\n$ cd ..\n$ cd ..\n$ cd ljpmphn\n$ ls\n37528 slfdb.bqt\n$ cd ..\n$ cd ..\n$ cd tcbjmq\n$ ls\n96506 lrz.nhb\n$ cd ..\n$ cd zhbpqlnd\n$ ls\n14027 ccswrthv.pfd\ndir clnqtjz\ndir fdsqmnn\ndir fwdt\ndir nljb\ndir npmsdrgp\n57812 slfdb.bqt\n184299 wmlmg\n241025 zcgrgff.wbh\ndir zggqfj\n$ cd clnqtjz\n$ ls\n62391 cbhw.wgr\n309318 jlm.lfq\ndir mzsfcvgv\ndir rrn\n307583 ssssrhwz\n$ cd mzsfcvgv\n$ ls\n1356 hrbh.wpz\ndir vnwqstw\n$ cd vnwqstw\n$ ls\n184434 hnhzdshl.lrl\n150624 wsrnprdb.pjf\n$ cd ..\n$ cd ..\n$ cd rrn\n$ ls\n105792 dzprqqc.rbh\n107482 ffdjdbc\ndir hnr\ndir rdmgtf\ndir rgrwp\n325147 shqr.pdj\n43186 slfdb.bqt\n236667 zcgrgff\n$ cd hnr\n$ ls\ndir gljrlhjm\n250526 mzsfcvgv.nsb\n43164 ssssrhwz\n$ cd gljrlhjm\n$ ls\ndir wjwqrnj\n$ cd wjwqrnj\n$ ls\n142366 gshl.qfc\n$ cd ..\n$ cd ..\n$ cd ..\n$ cd rdmgtf\n$ ls\n193562 gdrdnc.vml\n123723 hmqfdht\ndir lzfntb\ndir mjfwsmgd\n208819 nqbgcn.qfq\ndir tqh\n$ cd lzfntb\n$ ls\ndir gwnpsvw\ndir rsgwzhp\n103487 scvllbjh.pnw\n$ cd gwnpsvw\n$ ls\ndir lqnz\n81937 zbdp.gqb\n$ cd lqnz\n$ ls\n27250 zcgrgff\n$ cd ..\n$ cd ..\n$ cd rsgwzhp\n$ ls\ndir hhz\n$ cd hhz\n$ ls\n46435 djvfz\n$ cd ..\n$ cd ..\n$ cd ..\n$ cd mjfwsmgd\n$ ls\n25726 clcvm\n170085 zbdp.gqb\n$ cd ..\n$ cd tqh\n$ ls\n111272 gdq.llg\n3215 hdghs\ndir lpdcdr\ndir vhfr\n$ cd lpdcdr\n$ ls\n203902 hmqfdht\n$ cd ..\n$ cd vhfr\n$ ls\n91584 hmqfdht\ndir stmvj\n$ cd stmvj\n$ ls\n315660 wwpq.ffq\n$ cd ..\n$ cd ..\n$ cd ..\n$ cd ..\n$ cd rgrwp\n$ ls\ndir dhwtfld\n187439 hmqfdht\ndir jnwr\ndir npr\ndir sdsppq\n228581 twd.nnc\n42349 wbf.cwb\n194162 zbdp.gqb\n224441 zcgrgff.qpg\n$ cd dhwtfld\n$ ls\n152381 dqdrd\n$ cd ..\n$ cd jnwr\n$ ls\n229758 hmvw.gdz\n92710 mzsfcvgv.cdd\n79954 stjtn.gft\n89831 zbdp.gqb\n$ cd ..\n$ cd npr\n$ ls\n52767 hlvpfw.rqb\ndir nrbjzvgq\n270579 pbsq.msg\n240181 slfdb.bqt\ndir znbwnh\n$ cd nrbjzvgq\n$ ls\n295237 bwqqvn\n229608 dhrjnvtt.lvm\n55391 nlvn\ndir zcgrgff\n$ cd zcgrgff\n$ ls\n124604 hlvpfw.mlw\n$ cd ..\n$ cd ..\n$ cd znbwnh\n$ ls\n228293 zcgrgff\n$ cd ..\n$ cd ..\n$ cd sdsppq\n$ ls\n235741 bcsdzpfj.lvd\ndir jnwr\ndir njtrhrfm\ndir tvq\ndir wshgn\n$ cd jnwr\n$ ls\n273541 brcps\ndir gjt\ndir hlvpfw\ndir nbsdvpnj\ndir zcgrgff\n$ cd gjt\n$ ls\n184707 zbdp.gqb\n$ cd ..\n$ cd hlvpfw\n$ ls\n242810 zcgrgff\n$ cd ..\n$ cd nbsdvpnj\n$ ls\n181797 hlvpfw.gsd\n294284 hmqfdht\n2150" <> ...}
31```
32
33```elixir
34defmodule FS do
35 def cd("/", _), do: []
36 def cd("..", [_ | path]), do: path
37 def cd(dir, path), do: [dir | path]
38
39 def file("dir " <> name, path, fs) do
40 put_in(fs, Enum.reverse([name | path]), %{})
41 end
42
43 def file(entry, path, fs) do
44 [size, name] = String.split(entry, " ", parts: 2)
45
46 put_in(fs, Enum.reverse([name | path]), String.to_integer(size))
47 end
48
49 def squash(fs) do
50 fs
51 |> Map.values()
52 |> Enum.reduce({0, []}, fn
53 fsize, {size, subdirs} when is_integer(fsize) ->
54 {size + fsize, subdirs}
55
56 subdir, {size, subdirs} ->
57 {dsize, _} = subdir = squash(subdir)
58
59 {size + dsize, [subdir | subdirs]}
60 end)
61 end
62end
63```
64
65<!-- livebook:{"output":true} -->
66
67```
68{:module, FS, <<70, 79, 82, 49, 0, 0, 12, ...>>, {:squash, 1}}
69```
70
71```elixir
72fs =
73 puzzle_input
74 |> String.split("\n", trim: true)
75 |> Enum.reduce({[], %{}}, fn
76 "$ cd " <> path, {cwd, fs} -> {FS.cd(path, cwd), fs}
77 "$ ls", acc -> acc
78 entry, {cwd, fs} -> {cwd, FS.file(entry, cwd, fs)}
79 end)
80 |> elem(1)
81 |> FS.squash()
82```
83
84<!-- livebook:{"output":true} -->
85
86```
87{46592386,
88 [
89 {18070237,
90 [
91 {5362031,
92 [
93 {619773, [{295762, []}]},
94 {4327113,
95 [
96 {3365961,
97 [
98 {584534, []},
99 {464942, []},
100 {2036798,
101 [
102 {1075736, [{20405, [{20405, []}]}]},
103 {47204, []},
104 {820238, [{481556, [{60750, []}]}, {6432, []}, {14084, []}]},
105 {44434, []},
106 {49186, []}
107 ]}
108 ]},
109 {512340, [{64408, []}, {398645, [{31665, []}]}, {49287, []}]},
110 {448812, []}
111 ]},
112 {415145, []}
113 ]},
114 {4095947,
115 [
116 {1171420, [{388084, []}]},
117 {1871858,
118 [
119 {241851, []},
120 {314621, []},
121 {90357, []},
122 {454015, []},
123 {240747, []},
124 {121723, []},
125 {408544, [{408544, []}]}
126 ]},
127 {37106, []},
128 {821426, [{181282, []}, {349919, []}]}
129 ]},
130 {7756031,
131 [
132 {6999588,
133 [
134 {603629, [{244001, []}]},
135 {1919401,
136 [{159354, []}, {779158, [{68393, []}, {432671, []}]}, {284951, [{284951, []}]}]},
137 {1015127, [{744818, [{744818, []}]}, {270309, []}]},
138 {3461431,
139 [
140 {101738, [{101738, [{101738, []}]}]},
141 {1781861,
142 [{198197, []}, {808768, []}, {774896, [{293633, []}, {188389, []}, {292874, []}]}]},
143 {915750, [{316131, []}, {306743, []}, {71772, [{71772, []}]}]}
144 ]}
145 ]},
146 {452018, [{358208, [{183686, []}]}]},
147 {150157, []}
148 ]}
149 ]},
150 {3078860,
151 [
152 {2260158,
153 [
154 {324522, [{324522, []}]},
155 {205684, []},
156 {213872, []},
157 {466588, [{51223, []}, {397589, []}, {17776, []}]}
158 ]},
159 {621970, [{277366, [{277366, []}]}, {69149, []}]},
160 {196732, []}
161 ]},
162 {1738868, [{473075, [{186613, []}, {47133, []}, {44509, []}]}, {278273, []}, {426097, []}]},
163 {22022022,
164 [
165 {17187447,
166 [
167 {2018419, [{861586, [{140610, []}]}, {449012, [{127216, []}]}, {521137, [{521137, []}]}]},
168 {1863430, [{1374035, [{438736, []}, {75020, []}, {105747, []}, {58981, []}]}, {4624, []}]},
169 {105380, []},
170 {1941889, [{146536, [{71403, []}]}, {720197, []}, {367058, [{63205, []}, {303853, []}]}]},
171 {868116, [{247470, []}, {28438, []}, {324132, []}]},
172 {9893050,
173 [
174 {8877344,
175 [
176 {5916357,
177 [
178 {2898091,
179 [
180 {454565, [{245558, []}]},
181 {448698, []},
182 {178036, [{178036, []}]},
183 {1581051, [{188814, []}, {691179, []}, {242810, []}, {184707, []}]}
184 ]},
185 {1496660, [{228293, []}, {704840, [{124604, []}]}]},
186 {492253, []},
187 {152381, []}
188 ]},
189 {1706657,
190 [
191 {725633, [{407244, [{315660, []}]}, {203902, []}]},
192 {195811, []},
193 {259109, [{46435, [{46435, []}]}, {109187, [{27250, []}]}]}
194 ]},
195 {436056, [{142366, [{142366, []}]}]}
196 ]},
197 {336414, [{335058, []}]}
198 ]}
199 ]},
200 {96506, []},
201 {928180, [{37528, []}, {283798, [{176794, [{176794, []}]}]}]},
202 {273935, []},
203 {119274, []},
204 {15911, []},
205 {2980003,
206 [
207 {1870823,
208 [
209 {1584583,
210 [
211 {345940, [{207755, []}, {138185, []}]},
212 {691294, [{189595, [{115955, []}]}, {349982, []}, {151717, []}]},
213 {124928, []},
214 {221254, []}
215 ]}
216 ]},
217 {161906, []},
218 {521337, []},
219 {414205, [{185769, [{185769, []}]}]},
220 {11732, []}
221 ]}
222 ]},
223 {851171, [{8052, []}, {461954, [{208370, []}]}]},
224 {618943, [{290697, []}, {73533, []}]}
225 ]}
226```
227
228## Task 1
229
230```elixir
231defmodule DFS do
232 def size({size, subs}, total \\ 0) do
233 total =
234 if size < 100_000 do
235 total + size
236 else
237 total
238 end
239
240 Enum.reduce(subs, total, &size/2)
241 end
242end
243```
244
245<!-- livebook:{"output":true} -->
246
247```
248{:module, DFS, <<70, 79, 82, 49, 0, 0, 8, ...>>, {:size, 2}}
249```
250
251```elixir
252DFS.size(fs)
253```
254
255<!-- livebook:{"output":true} -->
256
257```
2581642503
259```
260
261## Task 2
262
263```elixir
264defmodule DFS2 do
265 def dirs({size, subs}, needed) do
266 dirs({size, subs}, needed, size)
267 end
268
269 defp dirs({size, subs}, needed, curr) do
270 if size >= needed do
271 Enum.reduce(subs, min(curr, size), &dirs(&1, needed, &2))
272 else
273 curr
274 end
275 end
276end
277```
278
279<!-- livebook:{"output":true} -->
280
281```
282{:module, DFS2, <<70, 79, 82, 49, 0, 0, 8, ...>>, {:dirs, 3}}
283```
284
285```elixir
286max = 70_000_000
287{current, _} = fs
288needed = 30_000_000
289
290left =
291 (max - current)
292 |> IO.inspect(label: :left)
293
294DFS2.dirs(fs, needed - left)
295```
296
297<!-- livebook:{"output":true} -->
298
299```
300left: 23407614
301```
302
303<!-- livebook:{"output":true} -->
304
305```
3066999588
307```