tangled
alpha
login
or
join now
hauleth.dev
/
advent-of-code
3
fork
atom
this repo has no description
3
fork
atom
overview
issues
pulls
pipelines
2024 day 08
hauleth.dev
1 year ago
775fa1f1
807c3e37
verified
This commit was signed with the committer's
known signature
.
hauleth.dev
SSH Key Fingerprint:
SHA256:1hEP8QO8nM2KQfQ8jK4Q19y/CmqVZQI/cNSht3c1QlI=
+327
1 changed file
expand all
collapse all
unified
split
2024
day08.livemd
+327
2024/day08.livemd
···
1
1
+
<!-- livebook:{"persist_outputs":true} -->
2
2
+
3
3
+
# Day 08
4
4
+
5
5
+
```elixir
6
6
+
Mix.install([:kino_aoc])
7
7
+
```
8
8
+
9
9
+
## Section
10
10
+
11
11
+
<!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJwdXp6bGVfaW5wdXQiLCJkYXkiOiI4Iiwic2Vzc2lvbl9zZWNyZXQiOiJBRFZFTlRfT0ZfQ09ERV9TRVNTSU9OIiwieWVhciI6IjIwMjQifQ","chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
12
12
+
13
13
+
```elixir
14
14
+
{:ok, puzzle_input} =
15
15
+
KinoAOC.download_puzzle("2024", "8", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
16
16
+
```
17
17
+
18
18
+
<!-- livebook:{"output":true} -->
19
19
+
20
20
+
```
21
21
+
{:ok,
22
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
23
+
```
24
24
+
25
25
+
```elixir
26
26
+
# puzzle_input =
27
27
+
"""
28
28
+
............
29
29
+
........0...
30
30
+
.....0......
31
31
+
.......0....
32
32
+
....0.......
33
33
+
......A.....
34
34
+
............
35
35
+
............
36
36
+
........A...
37
37
+
.........A..
38
38
+
............
39
39
+
............
40
40
+
"""
41
41
+
42
42
+
freqs =
43
43
+
puzzle_input
44
44
+
|> String.split("\n", trim: true)
45
45
+
|> Enum.with_index()
46
46
+
|> Enum.flat_map(fn {row, y} ->
47
47
+
row
48
48
+
|> String.to_charlist()
49
49
+
|> Enum.with_index()
50
50
+
|> Enum.filter(fn {freq, _} -> freq != ?. end)
51
51
+
|> Enum.map(fn {freq, x} -> {{x, y}, freq} end)
52
52
+
end)
53
53
+
|> Map.new()
54
54
+
|> Enum.group_by(&elem(&1, 1), &elem(&1, 0))
55
55
+
```
56
56
+
57
57
+
<!-- livebook:{"output":true} -->
58
58
+
59
59
+
```
60
60
+
warning: 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
61
+
└─ Workspace/hauleth/advent-of-code/2024/day08.livemd#cell:y5uv5vxll4fey6gh:1
62
62
+
63
63
+
```
64
64
+
65
65
+
<!-- livebook:{"output":true} -->
66
66
+
67
67
+
```
68
68
+
%{
69
69
+
117 => [{28, 46}, {31, 45}, {38, 43}, {47, 38}],
70
70
+
73 => [{2, 32}, {17, 34}, {23, 27}, {6, 29}],
71
71
+
89 => [{4, 36}, {7, 32}, {6, 37}, {5, 27}],
72
72
+
48 => [{25, 22}, {9, 21}, {8, 23}, {14, 24}],
73
73
+
57 => [{29, 46}, {21, 43}, {36, 45}],
74
74
+
113 => [{30, 9}, {20, 2}, {21, 4}, {19, 1}],
75
75
+
69 => [{42, 18}, {34, 21}, {45, 23}, {29, 14}],
76
76
+
88 => [{7, 10}, {5, 3}, {44, 13}, {2, 8}],
77
77
+
100 => [{25, 45}, {28, 44}, {10, 31}],
78
78
+
71 => [{36, 1}, {35, 25}, {31, 2}, {32, 8}],
79
79
+
98 => [{16, 41}, {7, 33}, {20, 34}, {17, 30}],
80
80
+
81 => [{42, 19}, {41, 16}, {43, 25}, {32, 2}],
81
81
+
76 => [{12, 9}, {14, 6}, {17, 8}, {21, 49}],
82
82
+
85 => [{15, 36}, {12, 28}, {17, 31}, {18, 41}],
83
83
+
120 => [{27, 5}, {35, 8}, {28, 11}, {24, 12}],
84
84
+
109 => [{26, 1}, {39, 6}, {40, 12}, {31, 7}],
85
85
+
72 => [{38, 44}, {40, 45}, {49, 46}, {25, 41}],
86
86
+
110 => [{8, 26}, {7, 21}, {15, 18}, {6, 23}],
87
87
+
68 => [{30, 27}, {28, 24}, {27, 28}, {33, 23}],
88
88
+
86 => [{29, 13}, {33, 16}, {30, 12}, {34, 11}],
89
89
+
116 => [{35, 23}, {36, 47}, {47, 48}, {40, 42}],
90
90
+
51 => [{7, 24}, {0, 19}, {3, 39}, {4, 32}],
91
91
+
80 => [{18, 7}, {19, 24}, {10, 8}, {11, 5}],
92
92
+
77 => [{11, 7}, {15, 14}, {10, 0}, {4, 5}],
93
93
+
78 => [{22, 14}, {29, 16}, {36, 13}, {23, 9}],
94
94
+
108 => [{29, 2}, {28, 5}, {35, 1}],
95
95
+
103 => [{32, 40}, {36, 43}, {33, 44}],
96
96
+
122 => [{27, 49}, {23, 44}, {24, 24}, {22, 43}],
97
97
+
83 => [{10, 46}, {25, 42}, {31, 41}, {8, 11}],
98
98
+
74 => [{38, 45}, {41, 49}, {43, 46}, {40, 44}],
99
99
+
99 => [{31, 22}, {33, 31}, {20, 19}, {6, 18}],
100
100
+
112 => [{5, 33}, {17, 26}, {8, 37}, {0, 34}],
101
101
+
97 => [{38, 40}, {33, 36}, {49, 47}, {40, 39}],
102
102
+
104 => [{16, 21}, {19, 31}, {11, 20}, {18, 24}],
103
103
+
75 => [{30, 5}, {24, 6}, {23, 10}, {37, 27}],
104
104
+
90 => [{21, 47}, {47, 30}, {34, 38}, {38, 29}],
105
105
+
55 => [{15, 22}, {14, 26}, {8, 27}, {25, 33}],
106
106
+
52 => [{45, 3}, {38, 11}, {39, 10}, {46, 8}],
107
107
+
111 => [{13, 35}, {42, 7}, {45, 44}, {44, 48}],
108
108
+
87 => [{25, 35}, {12, 18}, {14, 31}, {21, 28}],
109
109
+
119 => [{21, 23}, {18, 31}, {17, 18}, {16, 24}],
110
110
+
82 => [{12, 11}, {27, 13}, {21, 12}, {16, 8}],
111
111
+
53 => [{22, 47}, {31, 43}, {4, 30}],
112
112
+
50 => [{27, 2}, {24, 22}, {44, 5}, {49, 21}],
113
113
+
66 => [{8, 45}, {9, 30}, {3, 1}, {0, ...}],
114
114
+
70 => [{5, 14}, {41, 15}, {10, ...}, {...}],
115
115
+
56 => [{12, 41}, {4, ...}, {...}, ...],
116
116
+
102 => [{17, ...}, {...}, ...],
117
117
+
105 => [{...}, ...],
118
118
+
121 => [...],
119
119
+
...
120
120
+
}
121
121
+
```
122
122
+
123
123
+
```elixir
124
124
+
{w, h} =
125
125
+
puzzle_input
126
126
+
|> String.split("\n", trim: true)
127
127
+
|> then(fn [a | _] = lst ->
128
128
+
{byte_size(a), length(lst)}
129
129
+
end)
130
130
+
```
131
131
+
132
132
+
<!-- livebook:{"output":true} -->
133
133
+
134
134
+
```
135
135
+
{50, 50}
136
136
+
```
137
137
+
138
138
+
```elixir
139
139
+
defmodule Antennas do
140
140
+
def each_pair([]), do: []
141
141
+
def each_pair([a | rest]) do
142
142
+
for(b <- rest, do: {a, b}) ++ each_pair(rest)
143
143
+
end
144
144
+
145
145
+
def antinodes({xa, ya}, {xb, yb}) do
146
146
+
dx = xa - xb
147
147
+
dy = ya - yb
148
148
+
149
149
+
Stream.from_index()
150
150
+
|> Stream.flat_map(fn n ->
151
151
+
dx = dx * n
152
152
+
dy = dy * n
153
153
+
[{xa + dx, ya + dy}, {xb - dx, yb - dy}]
154
154
+
end)
155
155
+
end
156
156
+
end
157
157
+
```
158
158
+
159
159
+
<!-- livebook:{"output":true} -->
160
160
+
161
161
+
```
162
162
+
{:module, Antennas, <<70, 79, 82, 49, 0, 0, 10, ...>>, {:antinodes, 2}}
163
163
+
```
164
164
+
165
165
+
## Part 1
166
166
+
167
167
+
```elixir
168
168
+
antinodes =
169
169
+
for {_, antennas} <- freqs,
170
170
+
{a, b} <- Antennas.each_pair(antennas),
171
171
+
{x, y} = node <- Antennas.antinodes(a, b) |> Stream.drop(2) |> Enum.take(2),
172
172
+
x in 0..(w - 1) and y in 0..(h - 1),
173
173
+
into: MapSet.new() do
174
174
+
node
175
175
+
end
176
176
+
```
177
177
+
178
178
+
<!-- livebook:{"output":true} -->
179
179
+
180
180
+
```
181
181
+
MapSet.new([
182
182
+
{20, 41},
183
183
+
{20, 3},
184
184
+
{16, 10},
185
185
+
{26, 21},
186
186
+
{6, 18},
187
187
+
{10, 32},
188
188
+
{20, 30},
189
189
+
{33, 17},
190
190
+
{17, 30},
191
191
+
{29, 28},
192
192
+
{40, 35},
193
193
+
{28, 37},
194
194
+
{25, 49},
195
195
+
{10, 19},
196
196
+
{14, 17},
197
197
+
{35, 7},
198
198
+
{29, 48},
199
199
+
{1, 34},
200
200
+
{23, 8},
201
201
+
{35, 6},
202
202
+
{49, 17},
203
203
+
{46, 38},
204
204
+
{5, 39},
205
205
+
{37, 29},
206
206
+
{16, 15},
207
207
+
{48, 41},
208
208
+
{4, 18},
209
209
+
{24, 15},
210
210
+
{33, 44},
211
211
+
{39, 18},
212
212
+
{40, 25},
213
213
+
{35, 21},
214
214
+
{41, 17},
215
215
+
{20, 37},
216
216
+
{45, 24},
217
217
+
{0, 35},
218
218
+
{18, 3},
219
219
+
{1, 36},
220
220
+
{35, 41},
221
221
+
{37, 28},
222
222
+
{28, 15},
223
223
+
{29, 38},
224
224
+
{46, 43},
225
225
+
{31, 19},
226
226
+
{19, 39},
227
227
+
{43, 10},
228
228
+
{38, 10},
229
229
+
{21, 26},
230
230
+
{28, ...},
231
231
+
{...},
232
232
+
...
233
233
+
])
234
234
+
```
235
235
+
236
236
+
```elixir
237
237
+
MapSet.size(antinodes)
238
238
+
```
239
239
+
240
240
+
<!-- livebook:{"output":true} -->
241
241
+
242
242
+
```
243
243
+
398
244
244
+
```
245
245
+
246
246
+
## Part 2
247
247
+
248
248
+
```elixir
249
249
+
antinodes_res =
250
250
+
for {_, antennas} <- freqs,
251
251
+
{a, b} <- Antennas.each_pair(antennas),
252
252
+
{x, y} = node <- Enum.take(Antennas.antinodes(a, b), 100),
253
253
+
x in 0..(w - 1) and y in 0..(h - 1),
254
254
+
into: MapSet.new() do
255
255
+
node
256
256
+
end
257
257
+
```
258
258
+
259
259
+
<!-- livebook:{"output":true} -->
260
260
+
261
261
+
```
262
262
+
MapSet.new([
263
263
+
{37, 47},
264
264
+
{35, 30},
265
265
+
{4, 5},
266
266
+
{20, 41},
267
267
+
{31, 42},
268
268
+
{9, 34},
269
269
+
{47, 38},
270
270
+
{20, 3},
271
271
+
{47, 44},
272
272
+
{22, 36},
273
273
+
{45, 7},
274
274
+
{19, 38},
275
275
+
{27, 21},
276
276
+
{9, 33},
277
277
+
{16, 10},
278
278
+
{21, 45},
279
279
+
{26, 21},
280
280
+
{21, 48},
281
281
+
{16, 38},
282
282
+
{35, 26},
283
283
+
{28, 20},
284
284
+
{45, 19},
285
285
+
{27, 22},
286
286
+
{16, 24},
287
287
+
{6, 18},
288
288
+
{10, 32},
289
289
+
{33, 15},
290
290
+
{36, 14},
291
291
+
{20, 30},
292
292
+
{33, 17},
293
293
+
{41, 1},
294
294
+
{36, 25},
295
295
+
{28, 48},
296
296
+
{5, 9},
297
297
+
{14, 16},
298
298
+
{17, 30},
299
299
+
{30, 49},
300
300
+
{32, 18},
301
301
+
{29, 28},
302
302
+
{40, 35},
303
303
+
{6, 23},
304
304
+
{17, 39},
305
305
+
{28, 37},
306
306
+
{6, 29},
307
307
+
{39, 23},
308
308
+
{49, 16},
309
309
+
{34, 0},
310
310
+
{11, 37},
311
311
+
{25, ...},
312
312
+
{...},
313
313
+
...
314
314
+
])
315
315
+
```
316
316
+
317
317
+
```elixir
318
318
+
MapSet.size(antinodes_res)
319
319
+
```
320
320
+
321
321
+
<!-- livebook:{"output":true} -->
322
322
+
323
323
+
```
324
324
+
1333
325
325
+
```
326
326
+
327
327
+
<!-- livebook:{"offset":9159,"stamp":{"token":"XCP.vUy-wiQ1Ola4DEyyjRWCHAhmtmjmoDVd4jyZ0g5rhe0RM8-OKii82hOqtdVQ6B_yetZ17Z8avgol_Frq-whc91b45zMSMIRVIC-azF_IQmYLdHX0p3LEQ0xKLcBUuir19OQ","version":2}} -->