this repo has no description
1<!-- livebook:{"persist_outputs":true} -->
2
3# Day 18
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":"18","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", "18", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
24```
25
26<!-- livebook:{"output":true} -->
27
28```
29{:ok,
30 "9,2,13\n12,12,4\n3,8,14\n9,3,4\n15,5,7\n9,5,4\n7,3,10\n12,8,2\n8,12,16\n12,16,12\n5,15,8\n16,7,12\n4,5,6\n11,7,2\n10,14,16\n9,3,15\n6,7,3\n14,10,15\n7,12,3\n13,8,3\n9,1,12\n7,15,5\n8,6,16\n17,9,12\n3,13,6\n7,2,10\n9,14,3\n16,12,6\n13,4,15\n17,14,11\n14,4,5\n15,4,14\n3,4,9\n13,12,17\n15,11,3\n12,14,3\n12,5,4\n16,5,12\n14,16,6\n4,3,11\n9,16,13\n10,6,3\n17,9,7\n5,5,14\n14,13,15\n16,12,8\n7,11,2\n14,9,4\n12,11,15\n13,7,4\n4,15,13\n9,13,2\n7,16,9\n17,13,6\n11,0,11\n15,4,11\n4,12,8\n13,3,13\n5,12,17\n16,14,9\n6,5,4\n9,17,8\n6,10,2\n3,10,7\n1,9,7\n5,14,12\n7,12,5\n3,5,10\n5,15,14\n6,3,11\n15,13,13\n7,4,5\n11,7,4\n11,16,12\n2,11,8\n7,15,4\n9,5,17\n12,14,4\n14,4,6\n7,8,2\n11,3,7\n15,13,7\n12,11,2\n11,6,16\n18,10,10\n4,12,5\n11,10,2\n7,17,9\n3,14,9\n7,17,5\n10,8,17\n10,1,11\n11,11,1\n16,8,14\n2,7,10\n7,9,17\n12,12,2\n11,17,11\n15,10,16\n9,1,8\n1,10,12\n6,2,11\n17,11,8\n9,2,11\n13,5,4\n2,9,11\n4,5,9\n8,3,5\n3,14,11\n3,13,12\n10,8,16\n12,14,16\n15,12,13\n5,3,12\n16,9,12\n1,10,10\n17,6,10\n10,18,8\n8,13,17\n13,7,2\n3,12,13\n2,12,5\n6,9,16\n3,6,9\n6,16,6\n0,9,9\n6,17,10\n15,10,14\n2,8,12\n13,3,8\n11,12,17\n9,17,11\n4,6,8\n15,11,2\n4,6,15\n11,4,12\n11,8,1\n7,1,10\n12,11,3\n18,11,12\n8,16,12\n1,9,11\n16,14,14\n15,8,5\n15,5,5\n6,10,17\n13,4,16\n8,12,2\n10,5,15\n4,11,16\n4,10,4\n12,10,3\n10,5,2\n5,15,7\n14,15,7\n16,10,5\n6,3,3\n12,17,10\n4,7,14\n6,4,12\n13,5,11\n7,15,6\n1,8,9\n4,11,15\n14,4,4\n2,13,8\n5,4,5\n4,13,13\n4,14,8\n17,12,11\n7,16,15\n16,13,11\n11,3,12\n17,9,8\n11,6,15\n11,15,16\n6,17,9\n17,6,8\n13,15,15\n10,17,8\n3,5,5\n3,9,14\n17,10,13\n16,9,13\n13,8,16\n12,5,3\n12,15,15\n5,10,14\n16,15,11\n7,2,9\n9,16,12\n2,14,9\n14,17,8\n13,16,8\n7,3,5\n5,3,10\n11,5,16\n17,10,10\n6,7,16\n1,12,10\n6,14,2\n7,2,12\n12,17,9\n17,6,12\n2,13,13\n8,4,3\n16,8,13\n3,15,7\n16,5,13\n16,13,12\n16,12,5\n16,5,9\n4,13,8\n9,13,17\n13,10,15\n4,6,4\n10,11,17\n13,14,5\n9,14,14\n11,2,7\n12,10,2\n12,18,10\n12,6,16\n17,11,6\n8,14,16\n10,15,3\n3,6,5\n7,10,17\n15,5,12\n16,11,14\n8,12,18\n15,13,9\n6,8,3\n15,12,2\n14,13,6\n15,4,10\n11,1,8\n10,1,6\n5,7,16\n9,7,2\n13,3,6\n8,2,7\n14,14,5\n9,3,13\n6,3,8\n8,5,4\n7,4,4\n10,14,15\n10,16,5\n16,11,10\n3,8,11\n4,13,15\n8,13,5\n10,4,5\n15,14,14\n13,12,16\n11,14,3\n11,17,8\n6,5,2\n15,15,13\n5,5,5\n14,9,2\n5,5,9\n3,7,13\n2,15,9\n15,15,7\n7,17,8\n11,8,2\n16,5,7\n9,16,7\n11,4,4\n7,5,15\n10,12,1\n7,4,14\n9,16,6\n15,10,9\n14,7,16\n7,15,15\n15,11,5\n8,4,14\n13,14,10\n10,12,2\n11,15,14\n13,13,3\n4,13,4\n8,8,17\n9,4,3\n13,5,3\n2,10,8\n6,16,9\n4,8,14\n7,2,11\n14,1,10\n17,8,7\n14,9,13\n14,6,6\n5,6,16\n4,13,10\n8,13,16\n16,9,15\n5,8,3\n18,9,10\n13,14,15\n14,4,13\n17,12,10\n17,7,7\n10,17,6\n16,10,14\n6,11,2\n16,10,10\n12,8,16\n12,13,18\n12,2,8\n17,8,9\n12,6,4\n13,17,10\n17,6,6\n15,8,15\n7,17,13\n4,15,11\n10,12,17\n2,7,11\n17,13,10\n5,12,4\n11,3,13\n5,11,4\n14,3,10\n11,4,14\n10,1,13\n5,6,6\n2,10,12\n5,8,15\n13,7,3\n12,7,4\n15,14,7\n5,7,13\n8,6,3\n9,6,16\n16,5,11\n15,13,15\n9,14,17\n15,14,13\n14,5,6\n2,7,6\n13,15,5\n4,11,5\n8,4,6\n14,14,15\n17,5,10\n5,9,3\n11,5,4\n5,9,13\n16,8,15\n11,11,17\n10,3,4\n14,5,16\n6,9,15\n9,14,16\n9,5,5\n5,15,13\n9,11,3\n7,6,4\n12,13,3\n2,13,7\n10,13,17\n10,17,10\n13,3,9\n14,4,8\n18,8,8\n4,12,7\n6,17,12\n9,9,1\n16,8,12\n12,3,6\n6,5,14\n4,14,12\n15,11,13\n5,4,15\n4,15,12\n5,14,5\n10,4,16\n12,6,2\n15,13,4\n8,15,4\n14,5,14\n16,10,12\n6,17,11\n17,15,10\n16,13,10\n16,12,14\n10,14,3\n11,12,1\n4,10,14\n10,2,15\n16,13,14\n6,14,5\n2,9,7\n12,9,2\n8,18,11\n13,12,2\n7,9,3\n8,16,15\n12,3,15\n9,16,11\n16,9,7\n6,15,7\n12,2,13\n5,12,16\n6,12,17\n12,1,10\n11,13,14\n9,8,18\n15,10,17\n7,13,16\n11,2,11\n10,11,2\n13,16,14\n8,15,14\n8,4,13\n7,7,2\n13,10,1\n7,3,12\n12,2,10\n10,17,11\n3,13,9\n5,10,13\n10,10,16\n6,14,6\n7,6,2\n13,12,4\n15,3,13\n4,3,12\n7,10,18\n4,14,7\n15,9,4\n7,16,4\n11,3,6\n5,11,2\n2,9,13\n14,7,4\n14,15,10\n4,8,4\n7,6,16\n15,12,14\n17,7,10\n13,15,4\n16,4,8\n13,3,5\n6,16,8\n3,6,12\n6,16,7\n15,9,15\n4,6,10\n12,12,16\n2,8,10\n3,13,11\n8,5,6\n14,4,12\n10,9,18\n9,6,2\n6,9,3\n12,14,15\n10,5,12\n17,7,12\n7,11,17\n14,12,15\n18,9,8\n10,5,16\n14,9,16\n4,5,11\n5,13,8\n3,4,6\n2,6,11\n6,15,15\n9,5,2\n11,15,15\n7,16,13\n2,9,12\n1,9,10\n9,7,16\n9,11,17\n16,11,6\n14,16,8\n9,3,12\n8,14,4\n17,8,10\n17,5,9\n4,11,12\n3,5,13\n7,15,14\n11,8,17\n13,2,9\n10,17,12\n8,5,2\n16,16,12\n10,6,16\n16,6,7\n9,10,1\n9,16,15\n7,11,18\n4,9,16\n8,2,11\n7,16,11\n8,7,2\n7,9,2\n2,11,5\n6,3,7\n10,7,17\n6,5,16\n4,4,8\n11,9,4\n5,13,13\n14,6,14\n2,8,7\n14,5,5\n13,14,3\n15,14,8\n9,5,3\n16,4,11\n3,7,15\n7,16,12\n14,14,14\n4,9,5\n4,4,10\n2,14,12\n15,2,9\n9,15,4\n16,13,6\n7,7,3\n4,11,6\n1,12,9\n12,10,17\n5,12,14\n16,12,12\n6,6,5\n15,11,11\n11,4,5\n11,13,5\n18,13,9\n17,6,13\n12,4,12\n5,16,9\n10,9,17\n3,14" <> ...}
31```
32
33```elixir
34cubes =
35 puzzle_input
36 |> String.split("\n", trim: true)
37 |> Enum.map(fn line ->
38 line
39 |> String.split(",")
40 |> Enum.map(&String.to_integer/1)
41 |> List.to_tuple()
42 end)
43 |> MapSet.new()
44```
45
46<!-- livebook:{"output":true} -->
47
48```
49MapSet.new([
50 {12, 9, 18},
51 {11, 4, 5},
52 {2, 10, 6},
53 {12, 2, 8},
54 {14, 15, 15},
55 {5, 14, 12},
56 {10, 6, 18},
57 {6, 4, 6},
58 {11, 4, 3},
59 {6, 14, 3},
60 {4, 8, 4},
61 {17, 7, 9},
62 {7, 12, 16},
63 {14, 13, 3},
64 {12, 3, 16},
65 {13, 6, 2},
66 {5, 6, 5},
67 {17, 10, 11},
68 {4, 16, 9},
69 {17, 9, 9},
70 {6, 2, 10},
71 {13, 17, 13},
72 {12, 13, 3},
73 {3, 13, 7},
74 {13, 7, 4},
75 {17, 12, 7},
76 {7, 3, 13},
77 {12, 15, 15},
78 {15, 6, 4},
79 {17, 10, 8},
80 {9, 14, 13},
81 {3, 9, 4},
82 {14, 13, 9},
83 {15, 13, 4},
84 {13, 4, 15},
85 {7, 7, 15},
86 {6, 14, 8},
87 {11, 2, 16},
88 {7, 2, 8},
89 {3, 14, 13},
90 {4, 5, 6},
91 {3, 9, 14},
92 {4, 16, 12},
93 {14, 12, 12},
94 {14, 5, 15},
95 {17, 9, 12},
96 {15, 10, 15},
97 {8, 17, ...},
98 {2, ...},
99 {...},
100 ...
101])
102```
103
104## Task 1
105
106```elixir
107sides =
108 for {x, y, z} <- cubes,
109 {place, {dx, dy, dz}} <- [
110 x: {-1, 0, 0},
111 y: {0, -1, 0},
112 z: {0, 0, -1},
113 x: {0, 0, 0},
114 y: {0, 0, 0},
115 z: {0, 0, 0}
116 ],
117 reduce: MapSet.new() do
118 set ->
119 side = {place, {x + dx, y + dy, z + dz}}
120
121 if side in set do
122 MapSet.delete(set, side)
123 else
124 MapSet.put(set, side)
125 end
126 end
127
128MapSet.size(sides)
129```
130
131<!-- livebook:{"output":true} -->
132
133```
1343636
135```
136
137## Task 2
138
139```elixir
140max =
141 Enum.reduce(cubes, {0, 0, 0}, fn {x, y, z}, {mx, my, mz} ->
142 {max(x, mx), max(y, my), max(z, mz)}
143 end)
144```
145
146<!-- livebook:{"output":true} -->
147
148```
149{19, 19, 19}
150```
151
152```elixir
153defmodule Cave do
154 def bfs([], _sides, outer, _visited), do: outer
155
156 def bfs([{x, y, z} = p | queue], sides, outer, visited) do
157 {min, max} = Enum.min_max([x, y, z])
158
159 if p in visited or max > 25 or min < -5 do
160 bfs(queue, sides, outer, visited)
161 else
162 visited = MapSet.put(visited, p)
163
164 {outer, xs1} = check(:x, p, {x + 1, y, z}, sides, outer, visited)
165 {outer, xs2} = check(:x, {x - 1, y, z}, {x - 1, y, z}, sides, outer, visited)
166 {outer, ys1} = check(:y, p, {x, y + 1, z}, sides, outer, visited)
167 {outer, ys2} = check(:y, {x, y - 1, z}, {x, y - 1, z}, sides, outer, visited)
168 {outer, zs1} = check(:z, p, {x, y, z + 1}, sides, outer, visited)
169 {outer, zs2} = check(:z, {x, y, z - 1}, {x, y, z - 1}, sides, outer, visited)
170
171 bfs(queue ++ xs1 ++ xs2 ++ ys1 ++ ys2 ++ zs1 ++ zs2, sides, outer, visited)
172 end
173 end
174
175 defp check(axis, curr, next, sides, outer, visited) do
176 cond do
177 {axis, curr} in sides ->
178 {MapSet.put(outer, {axis, curr}), []}
179
180 next in visited ->
181 {outer, []}
182
183 true ->
184 {outer, [next]}
185 end
186 end
187end
188```
189
190<!-- livebook:{"output":true} -->
191
192```
193{:module, Cave, <<70, 79, 82, 49, 0, 0, 14, ...>>, {:check, 6}}
194```
195
196```elixir
197outer = Cave.bfs([{-5, -5, -5}], sides, MapSet.new(), MapSet.new())
198```
199
200<!-- livebook:{"output":true} -->
201
202```
203MapSet.new([
204 x: {10, 19, 11},
205 z: {15, 16, 12},
206 z: {2, 16, 10},
207 z: {5, 13, 2},
208 y: {4, 3, 15},
209 x: {0, 13, 10},
210 x: {17, 12, 6},
211 z: {10, 11, 0},
212 z: {10, 5, 17},
213 z: {4, 7, 2},
214 x: {15, 16, 9},
215 x: {2, 7, 4},
216 z: {2, 8, 5},
217 y: {16, 13, 5},
218 x: {2, 6, 14},
219 x: {18, 12, 11},
220 y: {13, 17, 7},
221 z: {3, 9, 14},
222 y: {11, 3, 16},
223 x: {4, 10, 17},
224 y: {11, 2, 15},
225 z: {13, 4, 3},
226 x: {10, 17, 5},
227 y: {3, 12, 4},
228 y: {11, 18, 10},
229 z: {5, 17, 8},
230 y: {15, 16, 6},
231 y: {3, 3, 7},
232 z: {7, 1, 5},
233 x: {14, 2, 9},
234 y: {18, 5, 8},
235 x: {10, 1, 13},
236 x: {9, 16, 3},
237 x: {2, 15, 8},
238 y: {7, 4, 2},
239 x: {17, 6, 12},
240 x: {0, 9, 7},
241 x: {12, 8, 1},
242 x: {0, 11, 10},
243 z: {10, 16, 3},
244 x: {16, 5, 6},
245 z: {5, 10, 1},
246 z: {7, 4, 15},
247 z: {12, 11, 18},
248 y: {11, 17, 12},
249 z: {3, 5, 4},
250 z: {6, 1, 9},
251 x: {16, 8, ...},
252 z: {14, ...},
253 z: {...},
254 ...
255])
256```
257
258```elixir
259MapSet.size(outer)
260```
261
262<!-- livebook:{"output":true} -->
263
264```
2652102
266```