this repo has no description
1<!-- livebook:{"persist_outputs":true} -->
2
3# Day 08
4
5```elixir
6Mix.install([:kino_aoc])
7```
8
9## Section
10
11<!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJwdXp6bGVfaW5wdXQiLCJkYXkiOiI4Iiwic2Vzc2lvbl9zZWNyZXQiOiJBRFZFTlRfT0ZfQ09ERV9TRVNTSU9OIiwieWVhciI6IjIwMjQifQ","chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
12
13```elixir
14{:ok, puzzle_input} =
15 KinoAOC.download_puzzle("2024", "8", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
16```
17
18<!-- livebook:{"output":true} -->
19
20```
21{:ok,
22 "..........M..........j.............y.....O........\n...B...............q......m........lGO............\n....................q......2.l.GQ...O.............\n.....X.......................................4....\n.....................q............................\n....M......P...............xl.K.............2.....\n....F.........L.......C.K..............m..........\n..........FM......P....jy......m..........o...r...\n..X.......P.....RL..............G..x..........4...\n............L..........NC.....q...................\n.....C.X...............K....y..........4..........\n........S...R.............j.x.....V...4...........\n.....................R..x.....V..i......m.........\n...........................R.V......N.......X.....\n.....F.........M......N......E....................\n................v................T.......F......O.\n.............................N...V.......Q........\n...v.....................C.....i..................\n......c.....W..n.w........................E.......\n3...................c.....................Q..6....\n...........h......................j...............\n.......n.0......h.................E..............2\n.v.............7.......120.....c..................\n......n.0............w...........D.t.........E...r\n....8..3......0.w.hP....z...D..T...............r..\n.................f........T........G......eQ......\n......f.n.....7..p................................\n.....Y..7.......f......I......D......K............\n............Uf....T..W.....D..r...i...............\n......I...............................Z...........\n....5....B.......b..............s..............Z..\n..........d...W..Uwh.............c..........i.....\n..I.3..Y......................e...................\n.....p.b..........k......7........................\np...........k....I..b..........s..................\n.....k.......o...........W........................\n.A..Y..........U.................a........6.......\n..A...Y.p...................................6.....\nB......k..........................Z............u..\n...3.....................s..............a.........\n......A.........................g.....a...........\n.......A....8...b.U......H....sS..................\n.........................S1.............t.........\n.....................9z..e.....5..1.g.u...........\n.......................z....d....g....H.J....o.6..\n........B................d.....u....9.J.H.........\n.8........S.................u9.............J.....H\n.....................Z5.............t1...........a\n.....................e..v...................o..t..\n.....8...............L.....z.............J........"}
23```
24
25```elixir
26# puzzle_input =
27"""
28............
29........0...
30.....0......
31.......0....
32....0.......
33......A.....
34............
35............
36........A...
37.........A..
38............
39............
40"""
41
42freqs =
43 puzzle_input
44 |> String.split("\n", trim: true)
45 |> Enum.with_index()
46 |> Enum.flat_map(fn {row, y} ->
47 row
48 |> String.to_charlist()
49 |> Enum.with_index()
50 |> Enum.filter(fn {freq, _} -> freq != ?. end)
51 |> Enum.map(fn {freq, x} -> {{x, y}, freq} end)
52 end)
53 |> Map.new()
54 |> Enum.group_by(&elem(&1, 1), &elem(&1, 0))
55```
56
57<!-- livebook:{"output":true} -->
58
59```
60warning: code block contains unused literal "............\n........0...\n.....0......\n.......0....\n....0.......\n......A.....\n............\n............\n........A...\n.........A..\n............\n............\n" (remove the literal or assign it to _ to avoid warnings)
61└─ Workspace/hauleth/advent-of-code/2024/day08.livemd#cell:y5uv5vxll4fey6gh:1
62
63```
64
65<!-- livebook:{"output":true} -->
66
67```
68%{
69 117 => [{28, 46}, {31, 45}, {38, 43}, {47, 38}],
70 73 => [{2, 32}, {17, 34}, {23, 27}, {6, 29}],
71 89 => [{4, 36}, {7, 32}, {6, 37}, {5, 27}],
72 48 => [{25, 22}, {9, 21}, {8, 23}, {14, 24}],
73 57 => [{29, 46}, {21, 43}, {36, 45}],
74 113 => [{30, 9}, {20, 2}, {21, 4}, {19, 1}],
75 69 => [{42, 18}, {34, 21}, {45, 23}, {29, 14}],
76 88 => [{7, 10}, {5, 3}, {44, 13}, {2, 8}],
77 100 => [{25, 45}, {28, 44}, {10, 31}],
78 71 => [{36, 1}, {35, 25}, {31, 2}, {32, 8}],
79 98 => [{16, 41}, {7, 33}, {20, 34}, {17, 30}],
80 81 => [{42, 19}, {41, 16}, {43, 25}, {32, 2}],
81 76 => [{12, 9}, {14, 6}, {17, 8}, {21, 49}],
82 85 => [{15, 36}, {12, 28}, {17, 31}, {18, 41}],
83 120 => [{27, 5}, {35, 8}, {28, 11}, {24, 12}],
84 109 => [{26, 1}, {39, 6}, {40, 12}, {31, 7}],
85 72 => [{38, 44}, {40, 45}, {49, 46}, {25, 41}],
86 110 => [{8, 26}, {7, 21}, {15, 18}, {6, 23}],
87 68 => [{30, 27}, {28, 24}, {27, 28}, {33, 23}],
88 86 => [{29, 13}, {33, 16}, {30, 12}, {34, 11}],
89 116 => [{35, 23}, {36, 47}, {47, 48}, {40, 42}],
90 51 => [{7, 24}, {0, 19}, {3, 39}, {4, 32}],
91 80 => [{18, 7}, {19, 24}, {10, 8}, {11, 5}],
92 77 => [{11, 7}, {15, 14}, {10, 0}, {4, 5}],
93 78 => [{22, 14}, {29, 16}, {36, 13}, {23, 9}],
94 108 => [{29, 2}, {28, 5}, {35, 1}],
95 103 => [{32, 40}, {36, 43}, {33, 44}],
96 122 => [{27, 49}, {23, 44}, {24, 24}, {22, 43}],
97 83 => [{10, 46}, {25, 42}, {31, 41}, {8, 11}],
98 74 => [{38, 45}, {41, 49}, {43, 46}, {40, 44}],
99 99 => [{31, 22}, {33, 31}, {20, 19}, {6, 18}],
100 112 => [{5, 33}, {17, 26}, {8, 37}, {0, 34}],
101 97 => [{38, 40}, {33, 36}, {49, 47}, {40, 39}],
102 104 => [{16, 21}, {19, 31}, {11, 20}, {18, 24}],
103 75 => [{30, 5}, {24, 6}, {23, 10}, {37, 27}],
104 90 => [{21, 47}, {47, 30}, {34, 38}, {38, 29}],
105 55 => [{15, 22}, {14, 26}, {8, 27}, {25, 33}],
106 52 => [{45, 3}, {38, 11}, {39, 10}, {46, 8}],
107 111 => [{13, 35}, {42, 7}, {45, 44}, {44, 48}],
108 87 => [{25, 35}, {12, 18}, {14, 31}, {21, 28}],
109 119 => [{21, 23}, {18, 31}, {17, 18}, {16, 24}],
110 82 => [{12, 11}, {27, 13}, {21, 12}, {16, 8}],
111 53 => [{22, 47}, {31, 43}, {4, 30}],
112 50 => [{27, 2}, {24, 22}, {44, 5}, {49, 21}],
113 66 => [{8, 45}, {9, 30}, {3, 1}, {0, ...}],
114 70 => [{5, 14}, {41, 15}, {10, ...}, {...}],
115 56 => [{12, 41}, {4, ...}, {...}, ...],
116 102 => [{17, ...}, {...}, ...],
117 105 => [{...}, ...],
118 121 => [...],
119 ...
120}
121```
122
123```elixir
124{w, h} =
125 puzzle_input
126 |> String.split("\n", trim: true)
127 |> then(fn [a | _] = lst ->
128 {byte_size(a), length(lst)}
129 end)
130```
131
132<!-- livebook:{"output":true} -->
133
134```
135{50, 50}
136```
137
138```elixir
139defmodule Antennas do
140 def each_pair([]), do: []
141 def each_pair([a | rest]) do
142 for(b <- rest, do: {a, b}) ++ each_pair(rest)
143 end
144
145 def antinodes({xa, ya}, {xb, yb}) do
146 dx = xa - xb
147 dy = ya - yb
148
149 Stream.from_index()
150 |> Stream.flat_map(fn n ->
151 dx = dx * n
152 dy = dy * n
153 [{xa + dx, ya + dy}, {xb - dx, yb - dy}]
154 end)
155 end
156end
157```
158
159<!-- livebook:{"output":true} -->
160
161```
162{:module, Antennas, <<70, 79, 82, 49, 0, 0, 10, ...>>, {:antinodes, 2}}
163```
164
165## Part 1
166
167```elixir
168antinodes =
169 for {_, antennas} <- freqs,
170 {a, b} <- Antennas.each_pair(antennas),
171 {x, y} = node <- Antennas.antinodes(a, b) |> Stream.drop(2) |> Enum.take(2),
172 x in 0..(w - 1) and y in 0..(h - 1),
173 into: MapSet.new() do
174 node
175 end
176```
177
178<!-- livebook:{"output":true} -->
179
180```
181MapSet.new([
182 {20, 41},
183 {20, 3},
184 {16, 10},
185 {26, 21},
186 {6, 18},
187 {10, 32},
188 {20, 30},
189 {33, 17},
190 {17, 30},
191 {29, 28},
192 {40, 35},
193 {28, 37},
194 {25, 49},
195 {10, 19},
196 {14, 17},
197 {35, 7},
198 {29, 48},
199 {1, 34},
200 {23, 8},
201 {35, 6},
202 {49, 17},
203 {46, 38},
204 {5, 39},
205 {37, 29},
206 {16, 15},
207 {48, 41},
208 {4, 18},
209 {24, 15},
210 {33, 44},
211 {39, 18},
212 {40, 25},
213 {35, 21},
214 {41, 17},
215 {20, 37},
216 {45, 24},
217 {0, 35},
218 {18, 3},
219 {1, 36},
220 {35, 41},
221 {37, 28},
222 {28, 15},
223 {29, 38},
224 {46, 43},
225 {31, 19},
226 {19, 39},
227 {43, 10},
228 {38, 10},
229 {21, 26},
230 {28, ...},
231 {...},
232 ...
233])
234```
235
236```elixir
237MapSet.size(antinodes)
238```
239
240<!-- livebook:{"output":true} -->
241
242```
243398
244```
245
246## Part 2
247
248```elixir
249antinodes_res =
250 for {_, antennas} <- freqs,
251 {a, b} <- Antennas.each_pair(antennas),
252 {x, y} = node <- Enum.take(Antennas.antinodes(a, b), 100),
253 x in 0..(w - 1) and y in 0..(h - 1),
254 into: MapSet.new() do
255 node
256 end
257```
258
259<!-- livebook:{"output":true} -->
260
261```
262MapSet.new([
263 {37, 47},
264 {35, 30},
265 {4, 5},
266 {20, 41},
267 {31, 42},
268 {9, 34},
269 {47, 38},
270 {20, 3},
271 {47, 44},
272 {22, 36},
273 {45, 7},
274 {19, 38},
275 {27, 21},
276 {9, 33},
277 {16, 10},
278 {21, 45},
279 {26, 21},
280 {21, 48},
281 {16, 38},
282 {35, 26},
283 {28, 20},
284 {45, 19},
285 {27, 22},
286 {16, 24},
287 {6, 18},
288 {10, 32},
289 {33, 15},
290 {36, 14},
291 {20, 30},
292 {33, 17},
293 {41, 1},
294 {36, 25},
295 {28, 48},
296 {5, 9},
297 {14, 16},
298 {17, 30},
299 {30, 49},
300 {32, 18},
301 {29, 28},
302 {40, 35},
303 {6, 23},
304 {17, 39},
305 {28, 37},
306 {6, 29},
307 {39, 23},
308 {49, 16},
309 {34, 0},
310 {11, 37},
311 {25, ...},
312 {...},
313 ...
314])
315```
316
317```elixir
318MapSet.size(antinodes_res)
319```
320
321<!-- livebook:{"output":true} -->
322
323```
3241333
325```
326
327<!-- livebook:{"offset":9159,"stamp":{"token":"XCP.vUy-wiQ1Ola4DEyyjRWCHAhmtmjmoDVd4jyZ0g5rhe0RM8-OKii82hOqtdVQ6B_yetZ17Z8avgol_Frq-whc91b45zMSMIRVIC-azF_IQmYLdHX0p3LEQ0xKLcBUuir19OQ","version":2}} -->