this repo has no description

2024 day 08

hauleth.dev 775fa1f1 807c3e37

verified
Changed files
+327
2024
+327
2024/day08.livemd
··· 1 + <!-- livebook:{"persist_outputs":true} --> 2 + 3 + # Day 08 4 + 5 + ```elixir 6 + Mix.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 + 42 + freqs = 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 + ``` 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 + └─ 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 139 + defmodule 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 156 + end 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 168 + antinodes = 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 + ``` 181 + MapSet.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 237 + MapSet.size(antinodes) 238 + ``` 239 + 240 + <!-- livebook:{"output":true} --> 241 + 242 + ``` 243 + 398 244 + ``` 245 + 246 + ## Part 2 247 + 248 + ```elixir 249 + antinodes_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 + ``` 262 + MapSet.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 318 + MapSet.size(antinodes_res) 319 + ``` 320 + 321 + <!-- livebook:{"output":true} --> 322 + 323 + ``` 324 + 1333 325 + ``` 326 + 327 + <!-- livebook:{"offset":9159,"stamp":{"token":"XCP.vUy-wiQ1Ola4DEyyjRWCHAhmtmjmoDVd4jyZ0g5rhe0RM8-OKii82hOqtdVQ6B_yetZ17Z8avgol_Frq-whc91b45zMSMIRVIC-azF_IQmYLdHX0p3LEQ0xKLcBUuir19OQ","version":2}} -->