this repo has no description
at master 15 kB view raw
1<!-- livebook:{"persist_outputs":true} --> 2 3# Day 02 4 5```elixir 6Mix.install([:kino_aoc]) 7``` 8 9## Section 10 11<!-- livebook:{"attrs":{"assign_to":"puzzle_input","day":"2","session_secret":"ADVENT_OF_CODE_SESSION","year":"2023"},"chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} --> 12 13```elixir 14{:ok, puzzle_input} = 15 KinoAOC.download_puzzle("2023", "2", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION")) 16``` 17 18<!-- livebook:{"output":true} --> 19 20``` 21{:ok, 22 "Game 1: 3 blue, 7 green, 10 red; 4 green, 4 red; 1 green, 7 blue, 5 red; 8 blue, 10 red; 7 blue, 19 red, 1 green\nGame 2: 6 red, 10 green; 11 green, 4 red; 16 green, 2 blue; 7 green, 5 blue, 4 red; 17 green, 1 red, 1 blue\nGame 3: 5 red, 9 blue, 1 green; 5 red; 11 red, 2 green, 8 blue; 2 green, 6 blue\nGame 4: 2 red, 5 green; 2 blue, 3 red, 3 green; 3 red, 2 blue; 8 green, 2 red\nGame 5: 12 red, 13 blue; 13 blue, 2 green, 9 red; 9 blue, 1 red; 2 green, 12 blue; 1 green, 1 red, 11 blue\nGame 6: 4 blue, 11 red; 4 red; 1 green, 7 red; 1 green, 1 blue; 8 blue, 10 red; 1 green, 2 blue, 8 red\nGame 7: 7 blue, 15 red, 1 green; 5 green, 17 red, 7 blue; 5 blue, 1 green; 11 blue, 2 green, 17 red; 14 green, 9 red, 2 blue; 6 blue, 19 red\nGame 8: 13 green; 5 green; 3 blue, 9 green, 1 red; 4 red, 11 green, 4 blue\nGame 9: 4 green, 1 red, 1 blue; 4 green, 7 blue, 7 red; 9 blue, 4 red; 2 blue, 8 red, 5 green; 6 blue, 2 green; 5 red, 5 green, 10 blue\nGame 10: 1 green, 5 blue, 3 red; 4 green, 9 red, 3 blue; 11 red, 2 green, 5 blue; 3 green, 1 blue, 2 red; 6 red, 2 blue\nGame 11: 2 red, 6 green, 12 blue; 2 red, 9 blue, 1 green; 12 green, 3 blue\nGame 12: 1 red, 1 blue, 12 green; 6 green, 2 red, 1 blue; 6 red, 6 green, 1 blue; 3 green, 6 red\nGame 13: 5 red, 19 green, 3 blue; 6 red, 7 blue, 11 green; 8 blue, 6 red; 3 blue, 4 green, 4 red; 8 red, 15 green, 5 blue; 5 blue, 2 red, 10 green\nGame 14: 5 blue, 9 green; 4 green, 6 blue; 14 green, 1 red, 4 blue; 3 blue, 3 green; 2 green; 5 blue, 7 green, 1 red\nGame 15: 5 red, 8 blue; 9 blue, 3 red; 5 red, 1 green, 16 blue; 1 blue, 3 red, 2 green; 5 red, 2 green, 10 blue\nGame 16: 6 blue, 9 green, 10 red; 8 blue, 9 red, 14 green; 7 green, 1 blue, 1 red; 8 red, 5 green, 8 blue; 10 red, 5 blue, 14 green; 7 blue, 11 red, 3 green\nGame 17: 12 blue, 12 red, 6 green; 14 green, 17 blue, 4 red; 11 blue, 1 red, 13 green\nGame 18: 7 blue, 2 green, 4 red; 1 blue, 2 green, 4 red; 2 red, 17 blue\nGame 19: 3 red, 9 green; 8 red, 2 blue, 2 green; 3 blue, 15 green, 11 red; 18 green, 3 red, 1 blue\nGame 20: 5 green, 5 red, 16 blue; 8 blue, 6 green, 4 red; 10 red, 11 blue; 5 red, 5 blue, 5 green\nGame 21: 1 red, 3 blue, 14 green; 6 red, 6 blue, 17 green; 12 green, 17 blue, 3 red; 15 green, 1 red, 19 blue; 3 red, 18 blue, 4 green\nGame 22: 15 blue; 11 blue, 2 red, 1 green; 1 green, 7 red; 1 red, 18 blue, 1 green; 16 blue; 3 red, 6 blue\nGame 23: 11 blue, 6 green, 4 red; 9 green, 11 red, 8 blue; 5 green, 5 red, 2 blue; 11 green, 4 blue, 11 red; 3 green, 9 blue, 2 red\nGame 24: 7 green, 2 red; 8 red, 1 blue, 15 green; 3 red, 6 green, 6 blue\nGame 25: 9 blue, 9 green; 3 green, 7 blue, 1 red; 6 green, 1 red, 1 blue; 6 green, 1 red, 1 blue\nGame 26: 1 green, 15 blue, 1 red; 1 red, 12 blue, 1 green; 16 blue; 5 red, 11 green, 14 blue; 6 green, 4 red, 14 blue\nGame 27: 14 red, 9 green; 11 red, 5 green, 6 blue; 1 red, 6 blue, 9 green\nGame 28: 6 green, 1 blue, 9 red; 1 green, 9 red; 7 red; 11 red, 1 blue, 2 green; 8 red, 10 green; 6 green, 1 blue, 5 red\nGame 29: 1 red, 19 blue, 3 green; 9 blue, 1 red; 8 green, 17 blue; 11 blue, 4 green\nGame 30: 7 blue; 5 blue, 1 red, 1 green; 3 blue, 1 red\nGame 31: 9 red, 2 green, 1 blue; 5 red, 1 green, 3 blue; 2 green, 7 red; 2 green, 12 red\nGame 32: 1 red, 1 blue, 17 green; 14 blue, 10 green, 6 red; 12 green, 11 blue, 3 red\nGame 33: 2 red, 1 green, 3 blue; 7 blue, 4 green; 1 red, 3 green, 5 blue\nGame 34: 9 blue, 1 green, 9 red; 12 blue, 2 green, 12 red; 3 blue, 12 red; 2 green, 14 blue, 11 red; 10 red, 12 blue\nGame 35: 6 blue, 2 red; 5 blue; 6 green, 9 blue, 3 red; 3 green, 1 red, 2 blue\nGame 36: 9 blue, 4 green, 6 red; 2 red, 4 green; 7 red, 3 green; 6 green, 2 blue; 3 red, 4 blue, 3 green; 3 green, 4 red, 16 blue\nGame 37: 2 green, 8 red, 4 blue; 3 red, 4 blue, 2 green; 5 blue, 3 green; 9 blue, 15 green; 5 red, 11 green, 7 blue\nGame 38: 12 red, 1 blue; 10 red, 3 green, 2 blue; 7 blue, 3 green, 8 red; 14 red, 2 green\nGame 39: 16 green, 2 red, 17 blue; 6 red, 4 green, 13 blue; 7 blue, 1 green, 4 red; 2 green, 3 blue; 12 green, 6 red, 17 blue; 5 red, 2 blue, 6 green\nGame 40: 3 green, 4 blue, 2 red; 2 green, 3 red; 6" <> ...} 23``` 24 25```elixir 26games = 27 puzzle_input 28 |> String.split("\n", trim: true) 29 |> Enum.map(fn "Game " <> game -> 30 {id, ": " <> rest} = Integer.parse(game) 31 32 picks = 33 for pick <- String.split(rest, "; ") do 34 pick 35 |> String.split(", ") 36 |> Map.new(fn balls -> 37 {num, " " <> color} = Integer.parse(balls) 38 {color, num} 39 end) 40 end 41 42 {id, picks} 43 end) 44``` 45 46<!-- livebook:{"output":true} --> 47 48``` 49[ 50 {1, 51 [ 52 %{"blue" => 3, "green" => 7, "red" => 10}, 53 %{"green" => 4, "red" => 4}, 54 %{"blue" => 7, "green" => 1, "red" => 5}, 55 %{"blue" => 8, "red" => 10}, 56 %{"blue" => 7, "green" => 1, "red" => 19} 57 ]}, 58 {2, 59 [ 60 %{"green" => 10, "red" => 6}, 61 %{"green" => 11, "red" => 4}, 62 %{"blue" => 2, "green" => 16}, 63 %{"blue" => 5, "green" => 7, "red" => 4}, 64 %{"blue" => 1, "green" => 17, "red" => 1} 65 ]}, 66 {3, 67 [ 68 %{"blue" => 9, "green" => 1, "red" => 5}, 69 %{"red" => 5}, 70 %{"blue" => 8, "green" => 2, "red" => 11}, 71 %{"blue" => 6, "green" => 2} 72 ]}, 73 {4, 74 [ 75 %{"green" => 5, "red" => 2}, 76 %{"blue" => 2, "green" => 3, "red" => 3}, 77 %{"blue" => 2, "red" => 3}, 78 %{"green" => 8, "red" => 2} 79 ]}, 80 {5, 81 [ 82 %{"blue" => 13, "red" => 12}, 83 %{"blue" => 13, "green" => 2, "red" => 9}, 84 %{"blue" => 9, "red" => 1}, 85 %{"blue" => 12, "green" => 2}, 86 %{"blue" => 11, "green" => 1, "red" => 1} 87 ]}, 88 {6, 89 [ 90 %{"blue" => 4, "red" => 11}, 91 %{"red" => 4}, 92 %{"green" => 1, "red" => 7}, 93 %{"blue" => 1, "green" => 1}, 94 %{"blue" => 8, "red" => 10}, 95 %{"blue" => 2, "green" => 1, "red" => 8} 96 ]}, 97 {7, 98 [ 99 %{"blue" => 7, "green" => 1, "red" => 15}, 100 %{"blue" => 7, "green" => 5, "red" => 17}, 101 %{"blue" => 5, "green" => 1}, 102 %{"blue" => 11, "green" => 2, "red" => 17}, 103 %{"blue" => 2, "green" => 14, "red" => 9}, 104 %{"blue" => 6, "red" => 19} 105 ]}, 106 {8, 107 [ 108 %{"green" => 13}, 109 %{"green" => 5}, 110 %{"blue" => 3, "green" => 9, "red" => 1}, 111 %{"blue" => 4, "green" => 11, "red" => 4} 112 ]}, 113 {9, 114 [ 115 %{"blue" => 1, "green" => 4, "red" => 1}, 116 %{"blue" => 7, "green" => 4, "red" => 7}, 117 %{"blue" => 9, "red" => 4}, 118 %{"blue" => 2, "green" => 5, "red" => 8}, 119 %{"blue" => 6, "green" => 2}, 120 %{"blue" => 10, "green" => 5, "red" => 5} 121 ]}, 122 {10, 123 [ 124 %{"blue" => 5, "green" => 1, "red" => 3}, 125 %{"blue" => 3, "green" => 4, "red" => 9}, 126 %{"blue" => 5, "green" => 2, "red" => 11}, 127 %{"blue" => 1, "green" => 3, "red" => 2}, 128 %{"blue" => 2, "red" => 6} 129 ]}, 130 {11, 131 [ 132 %{"blue" => 12, "green" => 6, "red" => 2}, 133 %{"blue" => 9, "green" => 1, "red" => 2}, 134 %{"blue" => 3, "green" => 12} 135 ]}, 136 {12, 137 [ 138 %{"blue" => 1, "green" => 12, "red" => 1}, 139 %{"blue" => 1, "green" => 6, "red" => 2}, 140 %{"blue" => 1, "green" => 6, "red" => 6}, 141 %{"green" => 3, "red" => 6} 142 ]}, 143 {13, 144 [ 145 %{"blue" => 3, "green" => 19, "red" => 5}, 146 %{"blue" => 7, "green" => 11, "red" => 6}, 147 %{"blue" => 8, "red" => 6}, 148 %{"blue" => 3, "green" => 4, "red" => 4}, 149 %{"blue" => 5, "green" => 15, "red" => 8}, 150 %{"blue" => 5, "green" => 10, "red" => 2} 151 ]}, 152 {14, 153 [ 154 %{"blue" => 5, "green" => 9}, 155 %{"blue" => 6, "green" => 4}, 156 %{"blue" => 4, "green" => 14, "red" => 1}, 157 %{"blue" => 3, "green" => 3}, 158 %{"green" => 2}, 159 %{"blue" => 5, "green" => 7, "red" => 1} 160 ]}, 161 {15, 162 [ 163 %{"blue" => 8, "red" => 5}, 164 %{"blue" => 9, "red" => 3}, 165 %{"blue" => 16, "green" => 1, "red" => 5}, 166 %{"blue" => 1, "green" => 2, "red" => 3}, 167 %{"blue" => 10, "green" => 2, "red" => 5} 168 ]}, 169 {16, 170 [ 171 %{"blue" => 6, "green" => 9, "red" => 10}, 172 %{"blue" => 8, "green" => 14, "red" => 9}, 173 %{"blue" => 1, "green" => 7, "red" => 1}, 174 %{"blue" => 8, "green" => 5, "red" => 8}, 175 %{"blue" => 5, "green" => 14, "red" => 10}, 176 %{"blue" => 7, "green" => 3, "red" => 11} 177 ]}, 178 {17, 179 [ 180 %{"blue" => 12, "green" => 6, "red" => 12}, 181 %{"blue" => 17, "green" => 14, "red" => 4}, 182 %{"blue" => 11, "green" => 13, "red" => 1} 183 ]}, 184 {18, 185 [ 186 %{"blue" => 7, "green" => 2, "red" => 4}, 187 %{"blue" => 1, "green" => 2, "red" => 4}, 188 %{"blue" => 17, "red" => 2} 189 ]}, 190 {19, 191 [ 192 %{"green" => 9, "red" => 3}, 193 %{"blue" => 2, "green" => 2, "red" => 8}, 194 %{"blue" => 3, "green" => 15, "red" => 11}, 195 %{"blue" => 1, "green" => 18, "red" => 3} 196 ]}, 197 {20, 198 [ 199 %{"blue" => 16, "green" => 5, "red" => 5}, 200 %{"blue" => 8, "green" => 6, "red" => 4}, 201 %{"blue" => 11, "red" => 10}, 202 %{"blue" => 5, "green" => 5, "red" => 5} 203 ]}, 204 {21, 205 [ 206 %{"blue" => 3, "green" => 14, "red" => 1}, 207 %{"blue" => 6, "green" => 17, "red" => 6}, 208 %{"blue" => 17, "green" => 12, "red" => 3}, 209 %{"blue" => 19, "green" => 15, "red" => 1}, 210 %{"blue" => 18, "green" => 4, "red" => 3} 211 ]}, 212 {22, 213 [ 214 %{"blue" => 15}, 215 %{"blue" => 11, "green" => 1, "red" => 2}, 216 %{"green" => 1, "red" => 7}, 217 %{"blue" => 18, "green" => 1, "red" => 1}, 218 %{"blue" => 16}, 219 %{"blue" => 6, "red" => 3} 220 ]}, 221 {23, 222 [ 223 %{"blue" => 11, "green" => 6, "red" => 4}, 224 %{"blue" => 8, "green" => 9, "red" => 11}, 225 %{"blue" => 2, "green" => 5, "red" => 5}, 226 %{"blue" => 4, "green" => 11, "red" => 11}, 227 %{"blue" => 9, "green" => 3, "red" => 2} 228 ]}, 229 {24, 230 [ 231 %{"green" => 7, "red" => 2}, 232 %{"blue" => 1, "green" => 15, "red" => 8}, 233 %{"blue" => 6, "green" => 6, "red" => 3} 234 ]}, 235 {25, 236 [ 237 %{"blue" => 9, "green" => 9}, 238 %{"blue" => 7, "green" => 3, "red" => 1}, 239 %{"blue" => 1, "green" => 6, "red" => 1}, 240 %{"blue" => 1, "green" => 6, "red" => 1} 241 ]}, 242 {26, 243 [ 244 %{"blue" => 15, "green" => 1, "red" => 1}, 245 %{"blue" => 12, "green" => 1, "red" => 1}, 246 %{"blue" => 16}, 247 %{"blue" => 14, "green" => 11, "red" => 5}, 248 %{"blue" => 14, "green" => 6, "red" => 4} 249 ]}, 250 {27, 251 [ 252 %{"green" => 9, "red" => 14}, 253 %{"blue" => 6, "green" => 5, "red" => 11}, 254 %{"blue" => 6, "green" => 9, "red" => 1} 255 ]}, 256 {28, 257 [ 258 %{"blue" => 1, "green" => 6, "red" => 9}, 259 %{"green" => 1, "red" => 9}, 260 %{"red" => 7}, 261 %{"blue" => 1, "green" => 2, "red" => 11}, 262 %{"green" => 10, "red" => 8}, 263 %{"blue" => 1, "green" => 6, "red" => 5} 264 ]}, 265 {29, 266 [ 267 %{"blue" => 19, "green" => 3, "red" => 1}, 268 %{"blue" => 9, "red" => 1}, 269 %{"blue" => 17, "green" => 8}, 270 %{"blue" => 11, "green" => 4} 271 ]}, 272 {30, [%{"blue" => 7}, %{"blue" => 5, "green" => 1, "red" => 1}, %{"blue" => 3, "red" => 1}]}, 273 {31, 274 [ 275 %{"blue" => 1, "green" => 2, "red" => 9}, 276 %{"blue" => 3, "green" => 1, "red" => 5}, 277 %{"green" => 2, "red" => 7}, 278 %{"green" => 2, "red" => 12} 279 ]}, 280 {32, 281 [ 282 %{"blue" => 1, "green" => 17, "red" => 1}, 283 %{"blue" => 14, "green" => 10, "red" => 6}, 284 %{"blue" => 11, "green" => 12, "red" => 3} 285 ]}, 286 {33, 287 [ 288 %{"blue" => 3, "green" => 1, "red" => 2}, 289 %{"blue" => 7, "green" => 4}, 290 %{"blue" => 5, "green" => 3, "red" => 1} 291 ]}, 292 {34, 293 [ 294 %{"blue" => 9, "green" => 1, "red" => 9}, 295 %{"blue" => 12, "green" => 2, "red" => 12}, 296 %{"blue" => 3, "red" => 12}, 297 %{"blue" => 14, "green" => 2, "red" => 11}, 298 %{"blue" => 12, "red" => 10} 299 ]}, 300 {35, 301 [ 302 %{"blue" => 6, "red" => 2}, 303 %{"blue" => 5}, 304 %{"blue" => 9, "green" => 6, "red" => 3}, 305 %{"blue" => 2, "green" => 3, "red" => 1} 306 ]}, 307 {36, 308 [ 309 %{"blue" => 9, "green" => 4, "red" => 6}, 310 %{"green" => 4, "red" => 2}, 311 %{"green" => 3, "red" => 7}, 312 %{"blue" => 2, "green" => 6}, 313 %{"blue" => 4, "green" => 3, "red" => 3}, 314 %{"blue" => 16, "green" => 3, "red" => 4} 315 ]}, 316 {37, 317 [ 318 %{"blue" => 4, "green" => 2, "red" => 8}, 319 %{"blue" => 4, "green" => 2, "red" => 3}, 320 %{"blue" => 5, "green" => 3}, 321 %{"blue" => 9, "green" => 15}, 322 %{"blue" => 7, "green" => 11, "red" => 5} 323 ]}, 324 {38, 325 [ 326 %{"blue" => 1, "red" => 12}, 327 %{"blue" => 2, "green" => 3, "red" => 10}, 328 %{"blue" => 7, "green" => 3, "red" => 8}, 329 %{"green" => 2, "red" => 14} 330 ]}, 331 {39, 332 [ 333 %{"blue" => 17, "green" => 16, "red" => 2}, 334 %{"blue" => 13, "green" => 4, "red" => 6}, 335 %{"blue" => 7, "green" => 1, "red" => 4}, 336 %{"blue" => 3, "green" => 2}, 337 %{"blue" => 17, "green" => 12, "red" => 6}, 338 %{"blue" => 2, "green" => 6, "red" => 5} 339 ]}, 340 {40, 341 [ 342 %{"blue" => 4, "green" => 3, "red" => 2}, 343 %{"green" => 2, "red" => 3}, 344 %{"blue" => 6, "green" => 6, "red" => 2}, 345 %{"green" => 5}, 346 %{"blue" => 3, "green" => 5, "red" => 1} 347 ]}, 348 {41, 349 [ 350 %{"green" => 13, "red" => 11}, 351 %{"blue" => 1, "green" => 3, "red" => 2}, 352 %{"blue" => 1, "green" => 3, "red" => 9}, 353 %{"green" => 11, "red" => 12}, 354 %{"green" => 1, "red" => 9}, 355 %{"green" => 9, ...} 356 ]}, 357 {42, 358 [ 359 %{"blue" => 2, "green" => 4}, 360 %{"blue" => 6, "green" => 10}, 361 %{"blue" => 13, "green" => 6, "red" => 3}, 362 %{"blue" => 11, "green" => 17}, 363 %{"blue" => 8, ...} 364 ]}, 365 {43, 366 [ 367 %{"blue" => 2, "green" => 10, "red" => 10}, 368 %{"blue" => 3, "green" => 5, "red" => 3}, 369 %{"blue" => 4, "green" => 10, ...}, 370 %{"green" => 5}, 371 %{...} 372 ]}, 373 {44, 374 [ 375 %{"blue" => 1, "green" => 5, "red" => 4}, 376 %{"blue" => 1, "green" => 3, ...}, 377 %{"blue" => 1, ...}, 378 %{...}, 379 ... 380 ]}, 381 {45, [%{"blue" => 7, "green" => 4, ...}, %{"blue" => 3, ...}, %{...}, ...]}, 382 {46, [%{"blue" => 5, ...}, %{...}, ...]}, 383 {47, [%{...}, ...]}, 384 {48, [...]}, 385 {49, ...}, 386 {...}, 387 ... 388] 389``` 390 391## Part 1 392 393```elixir 394games 395|> Enum.filter(fn {_, picks} -> 396 Enum.all?(picks, fn map -> 397 Map.get(map, "red", 0) <= 12 and Map.get(map, "green", 0) <= 13 and 398 Map.get(map, "blue", 0) <= 14 399 end) 400end) 401|> Enum.map(&elem(&1, 0)) 402|> Enum.sum() 403``` 404 405<!-- livebook:{"output":true} --> 406 407``` 4082162 409``` 410 411## Part 2 412 413```elixir 414games 415|> Enum.map(fn {_, picks} -> 416 picks 417 |> Enum.reduce([0, 0, 0], fn hand, [r, g, b] -> 418 [ 419 max(Map.get(hand, "red", 0), r), 420 max(Map.get(hand, "green", 0), g), 421 max(Map.get(hand, "blue", 0), b) 422 ] 423 end) 424 |> Enum.product() 425end) 426|> Enum.sum() 427``` 428 429<!-- livebook:{"output":true} --> 430 431``` 43272513 433``` 434 435<!-- livebook:{"offset":15042,"stamp":{"token":"XCP.FeGN4d2e9dnN-0MEzQ7fkG8b8Y3D1FEiGVZmcvfp_IBmCEdpr8gG7HkIpV-Id27eJzCE5vj63AzjPXXsdEgWHwh-T5OO4n9ak1Zs__R9RD4uOYpy2NSEJkYkMGlwtPNvlg","version":2}} -->