this repo has no description
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

ft: add day 4

+716 -56
+601
2021/day4.txt
··· 1 + 37,60,87,13,34,72,45,49,61,27,97,88,50,30,76,40,63,9,38,67,82,6,59,90,99,54,11,66,98,23,64,14,18,4,10,89,46,32,19,5,1,53,25,96,2,12,86,58,41,68,95,8,7,3,85,70,35,55,77,44,36,51,15,52,56,57,91,16,71,92,84,17,33,29,47,75,80,39,83,74,73,65,78,69,21,42,31,93,22,62,24,48,81,0,26,43,20,28,94,79 2 + 3 + 66 78 7 45 92 4 + 39 38 62 81 77 5 + 9 73 25 97 99 6 + 87 80 19 1 71 7 + 85 35 52 26 68 8 + 9 + 47 38 84 53 16 10 + 66 3 63 92 94 11 + 71 41 59 1 87 12 + 17 67 62 73 33 13 + 69 12 26 82 55 14 + 15 + 89 94 65 57 6 16 + 27 77 60 19 83 17 + 72 58 0 29 91 18 + 33 75 50 64 87 19 + 24 88 32 93 38 20 + 21 + 35 82 7 49 43 22 + 58 8 56 54 6 23 + 74 53 98 59 84 24 + 4 40 11 67 14 25 + 89 1 44 51 45 26 + 27 + 44 51 57 75 19 28 + 33 54 24 96 1 29 + 30 0 45 47 38 30 + 58 78 17 74 14 31 + 91 60 32 67 10 32 + 33 + 72 91 61 45 49 34 + 68 67 31 69 96 35 + 92 52 9 34 36 36 + 16 77 62 55 41 37 + 42 88 53 4 15 38 + 39 + 68 98 73 81 41 40 + 36 43 87 48 95 41 + 55 62 8 12 30 42 + 23 34 59 72 85 43 + 38 7 16 13 79 44 + 45 + 66 98 23 69 89 46 + 71 84 79 14 53 47 + 10 62 60 44 28 48 + 49 43 29 45 75 49 + 72 94 5 64 3 50 + 51 + 27 99 41 10 91 52 + 2 94 16 85 75 53 + 25 95 15 34 36 54 + 90 72 76 20 29 55 + 55 18 93 53 69 56 + 57 + 84 87 16 80 64 58 + 48 45 63 53 25 59 + 10 44 65 58 59 60 + 94 31 41 35 89 61 + 42 29 71 69 61 62 + 63 + 63 44 74 33 3 64 + 65 47 90 52 38 65 + 9 13 91 4 45 66 + 26 39 94 68 93 67 + 56 31 41 59 32 68 + 69 + 17 6 85 74 19 70 + 58 93 9 92 31 71 + 90 69 2 87 11 72 + 67 94 53 66 30 73 + 15 41 59 51 45 74 + 75 + 7 59 76 14 15 76 + 51 3 88 17 2 77 + 42 39 98 84 65 78 + 54 48 9 56 74 79 + 68 5 1 24 13 80 + 81 + 55 34 94 50 28 82 + 8 14 93 64 52 83 + 92 62 9 51 38 84 + 31 74 73 24 59 85 + 33 65 7 75 32 86 + 87 + 30 93 48 17 33 88 + 67 7 5 0 69 89 + 54 76 52 1 87 90 + 99 73 50 25 16 91 + 13 20 41 77 62 92 + 93 + 54 0 33 23 75 94 + 50 4 29 18 94 95 + 14 8 38 48 53 96 + 84 13 12 91 83 97 + 69 78 55 47 26 98 + 99 + 30 65 70 51 1 100 + 22 53 86 46 89 101 + 99 79 20 24 64 102 + 18 92 82 0 68 103 + 57 33 61 12 83 104 + 105 + 22 47 21 38 57 106 + 41 63 61 95 79 107 + 7 52 87 71 14 108 + 40 45 92 73 48 109 + 42 0 26 94 5 110 + 111 + 90 98 47 85 52 112 + 19 44 48 59 88 113 + 93 81 7 16 63 114 + 1 45 84 11 24 115 + 78 27 62 77 37 116 + 117 + 34 2 6 3 56 118 + 48 47 12 58 76 119 + 89 78 30 75 20 120 + 91 39 97 69 28 121 + 96 64 32 61 67 122 + 123 + 62 25 53 56 97 124 + 42 34 24 64 95 125 + 17 35 7 79 68 126 + 30 74 54 78 3 127 + 88 66 18 38 90 128 + 129 + 63 45 80 89 76 130 + 39 57 71 25 79 131 + 6 3 28 94 34 132 + 82 18 95 42 33 133 + 96 36 27 83 66 134 + 135 + 20 87 59 86 21 136 + 14 61 7 23 56 137 + 5 33 91 0 1 138 + 97 65 82 95 72 139 + 18 26 35 47 69 140 + 141 + 86 65 41 97 40 142 + 2 73 68 34 3 143 + 88 71 79 70 95 144 + 48 62 1 50 77 145 + 13 67 20 15 55 146 + 147 + 98 16 93 30 24 148 + 39 11 56 13 3 149 + 14 83 76 58 60 150 + 73 81 63 88 92 151 + 74 96 51 43 77 152 + 153 + 4 12 43 46 53 154 + 34 37 50 60 56 155 + 96 98 10 65 38 156 + 40 24 80 77 73 157 + 23 67 84 64 13 158 + 159 + 5 19 85 1 58 160 + 41 15 44 57 22 161 + 2 66 80 94 71 162 + 40 55 89 79 0 163 + 56 81 23 30 24 164 + 165 + 0 29 94 4 68 166 + 81 2 20 95 43 167 + 49 40 37 30 96 168 + 19 23 42 26 85 169 + 61 17 12 72 88 170 + 171 + 64 26 61 32 68 172 + 80 24 31 67 49 173 + 72 15 88 98 50 174 + 73 55 86 38 10 175 + 87 34 52 29 63 176 + 177 + 76 61 36 54 10 178 + 63 56 75 67 29 179 + 11 9 41 4 43 180 + 83 88 45 93 74 181 + 72 70 94 60 98 182 + 183 + 44 99 39 5 23 184 + 53 69 68 60 83 185 + 81 72 1 97 20 186 + 43 96 91 11 32 187 + 51 7 8 86 25 188 + 189 + 62 36 39 20 5 190 + 52 59 6 74 95 191 + 2 83 44 43 66 192 + 96 55 79 42 37 193 + 34 32 19 0 90 194 + 195 + 84 8 65 35 78 196 + 57 83 4 82 36 197 + 3 29 74 60 90 198 + 86 47 53 26 10 199 + 52 51 40 32 6 200 + 201 + 69 32 77 72 44 202 + 34 54 82 94 23 203 + 1 60 2 11 36 204 + 17 52 0 73 31 205 + 5 90 24 21 53 206 + 207 + 42 24 18 44 5 208 + 74 19 76 62 34 209 + 61 66 4 77 47 210 + 92 94 78 39 97 211 + 25 91 11 22 23 212 + 213 + 11 87 83 93 8 214 + 7 73 85 84 3 215 + 65 16 71 12 44 216 + 88 61 54 19 97 217 + 72 57 80 59 45 218 + 219 + 30 55 1 62 39 220 + 31 45 34 6 43 221 + 68 93 38 57 60 222 + 70 32 5 95 92 223 + 35 83 66 36 91 224 + 225 + 76 89 54 36 21 226 + 99 28 62 78 73 227 + 17 72 96 13 91 228 + 79 65 37 81 14 229 + 33 86 31 11 25 230 + 231 + 3 93 37 88 47 232 + 4 6 19 87 30 233 + 76 22 33 69 64 234 + 36 52 60 82 53 235 + 39 5 61 67 90 236 + 237 + 28 6 59 61 75 238 + 40 4 65 43 93 239 + 41 32 60 89 18 240 + 22 11 12 9 0 241 + 26 15 78 90 30 242 + 243 + 8 87 74 70 76 244 + 45 43 63 84 25 245 + 18 68 92 4 31 246 + 66 22 29 71 91 247 + 15 50 64 52 1 248 + 249 + 3 93 25 71 43 250 + 45 48 52 4 94 251 + 36 34 47 74 97 252 + 12 27 64 14 80 253 + 41 17 21 32 88 254 + 255 + 76 62 68 24 0 256 + 97 43 37 3 79 257 + 65 25 52 28 20 258 + 29 18 90 89 48 259 + 35 66 19 53 82 260 + 261 + 57 98 86 69 24 262 + 55 74 49 12 35 263 + 68 50 70 38 75 264 + 82 56 73 5 89 265 + 90 10 15 14 95 266 + 267 + 98 86 47 87 81 268 + 62 51 3 79 10 269 + 60 39 61 9 77 270 + 36 50 89 49 88 271 + 63 95 1 15 69 272 + 273 + 72 71 51 33 23 274 + 12 35 97 34 99 275 + 4 32 36 88 80 276 + 5 17 3 56 1 277 + 44 19 47 98 26 278 + 279 + 55 56 75 5 74 280 + 4 86 60 67 68 281 + 21 45 40 17 2 282 + 43 39 20 88 33 283 + 24 70 58 13 98 284 + 285 + 34 28 86 65 80 286 + 82 23 98 91 0 287 + 61 62 43 51 49 288 + 39 10 58 1 11 289 + 8 83 17 97 31 290 + 291 + 7 96 2 18 26 292 + 15 86 34 76 61 293 + 75 93 68 3 83 294 + 63 37 85 8 74 295 + 11 51 32 14 23 296 + 297 + 25 33 24 86 75 298 + 63 73 97 37 47 299 + 76 72 34 81 27 300 + 93 91 70 20 98 301 + 11 94 64 28 6 302 + 303 + 70 86 59 78 95 304 + 47 18 64 40 68 305 + 49 55 20 12 53 306 + 60 76 35 83 50 307 + 32 73 91 46 28 308 + 309 + 31 21 92 97 89 310 + 14 82 51 1 62 311 + 43 58 90 18 24 312 + 56 79 54 35 48 313 + 29 39 45 86 66 314 + 315 + 62 74 81 27 23 316 + 28 92 66 86 29 317 + 98 95 14 35 11 318 + 13 69 70 64 79 319 + 51 80 87 96 85 320 + 321 + 69 15 37 95 29 322 + 6 45 20 17 36 323 + 62 42 1 77 59 324 + 25 44 72 35 31 325 + 70 73 86 89 97 326 + 327 + 81 88 82 99 13 328 + 53 87 2 29 47 329 + 36 94 48 95 65 330 + 96 42 92 61 60 331 + 86 33 83 52 12 332 + 333 + 32 4 52 54 24 334 + 28 77 58 80 16 335 + 62 82 59 6 66 336 + 63 72 91 41 29 337 + 36 22 68 0 31 338 + 339 + 38 58 51 77 26 340 + 80 5 90 30 20 341 + 33 14 54 53 0 342 + 76 74 63 84 15 343 + 45 73 41 29 69 344 + 345 + 28 31 47 97 58 346 + 69 7 86 40 57 347 + 45 1 11 84 54 348 + 29 9 95 93 88 349 + 12 5 79 76 77 350 + 351 + 93 7 60 75 12 352 + 49 64 20 46 10 353 + 3 23 76 42 47 354 + 9 22 6 34 87 355 + 41 37 66 45 48 356 + 357 + 9 53 64 37 83 358 + 89 43 91 30 36 359 + 39 22 69 79 42 360 + 31 28 55 40 54 361 + 7 24 44 84 46 362 + 363 + 81 75 15 89 31 364 + 11 13 12 5 10 365 + 94 80 22 68 3 366 + 27 60 42 65 58 367 + 40 82 17 92 73 368 + 369 + 16 40 98 33 41 370 + 79 72 2 77 86 371 + 14 32 85 74 50 372 + 11 49 62 56 9 373 + 69 20 12 19 60 374 + 375 + 95 72 61 54 92 376 + 10 0 1 84 99 377 + 88 62 13 18 86 378 + 89 59 60 29 78 379 + 55 98 27 91 87 380 + 381 + 58 37 49 43 76 382 + 14 3 65 13 2 383 + 92 20 6 73 5 384 + 96 53 82 95 99 385 + 15 83 80 26 11 386 + 387 + 51 71 56 58 95 388 + 59 84 46 54 94 389 + 8 7 49 62 83 390 + 47 92 32 31 65 391 + 48 44 57 25 20 392 + 393 + 5 3 26 90 14 394 + 61 16 44 4 0 395 + 49 1 52 82 54 396 + 60 77 86 43 87 397 + 6 36 73 25 31 398 + 399 + 32 25 37 18 63 400 + 60 65 35 24 34 401 + 52 94 12 77 47 402 + 99 83 2 30 74 403 + 58 38 17 75 56 404 + 405 + 77 88 70 22 39 406 + 4 14 86 99 50 407 + 5 79 2 78 16 408 + 34 46 83 58 13 409 + 71 74 21 76 66 410 + 411 + 25 15 99 79 68 412 + 59 95 82 22 53 413 + 0 70 85 73 67 414 + 36 10 66 6 32 415 + 1 51 52 40 4 416 + 417 + 29 49 64 26 18 418 + 56 28 9 7 99 419 + 20 2 74 71 39 420 + 81 94 55 75 16 421 + 52 45 35 66 11 422 + 423 + 42 68 76 37 34 424 + 0 41 86 19 59 425 + 7 46 49 30 88 426 + 74 80 24 50 29 427 + 96 78 67 61 26 428 + 429 + 45 96 11 99 44 430 + 87 95 32 77 64 431 + 8 31 80 4 34 432 + 24 91 90 16 60 433 + 13 29 63 67 59 434 + 435 + 15 55 0 52 54 436 + 58 45 62 66 85 437 + 91 19 32 16 92 438 + 93 59 8 22 2 439 + 98 33 31 17 84 440 + 441 + 28 49 63 81 69 442 + 30 45 46 90 26 443 + 4 76 94 93 24 444 + 15 16 18 86 62 445 + 2 98 89 44 67 446 + 447 + 32 35 11 1 38 448 + 86 36 70 24 95 449 + 59 94 71 99 40 450 + 48 64 91 25 57 451 + 29 76 68 88 58 452 + 453 + 45 81 50 20 68 454 + 85 91 49 38 9 455 + 27 0 58 8 10 456 + 59 1 88 19 89 457 + 23 29 61 99 12 458 + 459 + 74 50 41 83 4 460 + 33 34 88 23 14 461 + 89 39 98 75 37 462 + 26 73 80 71 44 463 + 52 53 48 84 85 464 + 465 + 47 35 98 73 9 466 + 61 4 71 91 58 467 + 65 40 63 36 86 468 + 12 30 69 46 2 469 + 6 17 23 32 74 470 + 471 + 84 87 59 58 65 472 + 30 53 7 98 48 473 + 71 28 1 77 56 474 + 36 88 52 64 89 475 + 90 37 94 26 39 476 + 477 + 25 75 32 48 6 478 + 49 7 74 50 62 479 + 68 51 72 12 10 480 + 94 37 97 69 91 481 + 73 9 67 18 1 482 + 483 + 51 96 71 44 0 484 + 97 52 1 77 11 485 + 90 9 15 76 24 486 + 68 6 57 40 98 487 + 47 31 94 82 49 488 + 489 + 48 31 26 77 14 490 + 94 93 27 2 82 491 + 11 83 85 9 8 492 + 90 69 4 16 22 493 + 5 62 29 57 30 494 + 495 + 59 46 82 13 53 496 + 71 58 67 2 28 497 + 73 52 30 97 12 498 + 95 34 51 32 38 499 + 62 81 5 15 74 500 + 501 + 82 10 58 84 67 502 + 92 5 66 25 83 503 + 90 76 21 26 69 504 + 39 63 42 11 53 505 + 23 61 80 99 48 506 + 507 + 8 13 49 63 83 508 + 26 48 50 53 43 509 + 1 39 95 60 99 510 + 96 7 35 94 10 511 + 24 44 65 31 46 512 + 513 + 87 17 72 71 81 514 + 35 56 4 99 59 515 + 96 90 37 23 86 516 + 34 73 18 19 78 517 + 41 10 43 92 80 518 + 519 + 29 7 37 40 70 520 + 72 10 85 74 76 521 + 36 9 13 73 82 522 + 4 65 49 77 42 523 + 75 24 84 78 39 524 + 525 + 29 6 94 59 38 526 + 99 55 8 66 85 527 + 14 43 25 92 67 528 + 49 33 87 39 44 529 + 9 61 24 90 75 530 + 531 + 45 35 78 56 24 532 + 53 38 34 92 55 533 + 20 44 90 33 83 534 + 54 95 71 87 13 535 + 40 43 85 88 68 536 + 537 + 32 80 59 34 22 538 + 18 9 12 15 55 539 + 85 60 37 64 92 540 + 35 39 26 90 50 541 + 52 67 58 87 8 542 + 543 + 90 96 40 14 61 544 + 34 33 80 22 38 545 + 59 94 3 6 4 546 + 0 71 25 1 20 547 + 30 57 48 31 10 548 + 549 + 50 14 40 48 83 550 + 85 80 29 60 2 551 + 92 59 86 99 57 552 + 46 7 89 66 75 553 + 98 6 45 97 51 554 + 555 + 13 17 0 57 5 556 + 29 68 52 11 59 557 + 78 63 94 88 89 558 + 35 54 74 18 2 559 + 28 65 86 1 30 560 + 561 + 57 46 44 86 62 562 + 43 89 81 34 13 563 + 32 51 9 6 35 564 + 29 52 84 8 88 565 + 26 21 17 75 85 566 + 567 + 14 87 26 22 30 568 + 65 78 98 6 60 569 + 42 99 19 71 11 570 + 68 27 48 52 62 571 + 51 1 54 37 74 572 + 573 + 76 69 37 49 61 574 + 20 91 14 31 11 575 + 54 40 67 71 15 576 + 73 64 85 80 62 577 + 5 10 3 51 7 578 + 579 + 63 90 54 46 17 580 + 16 5 4 56 33 581 + 39 41 8 87 80 582 + 14 77 26 47 70 583 + 15 48 6 10 76 584 + 585 + 96 95 0 42 56 586 + 3 87 92 18 60 587 + 51 7 38 4 91 588 + 41 33 80 43 66 589 + 61 32 57 84 10 590 + 591 + 8 64 76 78 17 592 + 55 74 68 47 29 593 + 46 84 49 58 93 594 + 52 26 32 11 33 595 + 24 42 98 27 43 596 + 597 + 14 19 27 93 16 598 + 23 32 74 73 67 599 + 68 38 2 22 76 600 + 6 12 94 15 77 601 + 64 62 34 3 37
+115 -56
2021/solutions.livemd
··· 1 - <!-- vim: syntax=markdown --> 2 - <!-- livebook:{"persist_outputs":true} --> 1 + <!-- 2 + vim:ft=markdown --!> 3 + livebook:{"persist_outputs":true} 4 + --> 3 5 4 6 # Advent of Code 2021 5 7 ··· 9 11 Mix.install([]) 10 12 ``` 11 13 12 - ```output 13 - :ok 14 - ``` 15 - 16 14 ## Day 1 17 15 18 16 ### Load input ··· 21 19 stream = 22 20 File.stream!("day1.txt") 23 21 |> Stream.map(&String.to_integer(String.trim(&1))) 24 - ``` 25 - 26 - ```output 27 - #Stream<[ 28 - enum: %File.Stream{ 29 - line_or_bytes: :line, 30 - modes: [:raw, :read_ahead, :binary], 31 - path: "day1.txt", 32 - raw: true 33 - }, 34 - funs: [#Function<47.58486609/1 in Stream.map/2>] 35 - ]> 36 22 ``` 37 23 38 24 ### Task 1 ··· 47 33 |> Enum.count(fn [a, b] -> a < b end) 48 34 ``` 49 35 50 - ```output 51 - 1688 52 - ``` 53 - 54 36 ### Task 2 55 37 56 38 <!-- livebook:{"break_markdown":true} --> ··· 79 61 |> Enum.count(fn [a, _, _, b] -> a < b end) 80 62 ``` 81 63 82 - ```output 83 - 1728 84 - ``` 85 - 86 64 ## Day 2 87 65 88 66 ### Load input ··· 111 89 end) 112 90 ``` 113 91 114 - ```output 115 - #Stream<[ 116 - enum: %File.Stream{ 117 - line_or_bytes: :line, 118 - modes: [:raw, :read_ahead, :binary], 119 - path: "day2.txt", 120 - raw: true 121 - }, 122 - funs: [#Function<47.58486609/1 in Stream.map/2>] 123 - ]> 124 - ``` 125 - 126 92 ### Task 1 127 93 128 94 ```elixir ··· 137 103 h * d 138 104 ``` 139 105 140 - ```output 141 - 1499229 142 - ``` 143 - 144 106 ### Task 2 145 107 146 108 ```elixir ··· 153 115 end) 154 116 155 117 h * d 156 - ``` 157 - 158 - ```output 159 - 1340836560 160 118 ``` 161 119 162 120 ## Day 3 ··· 181 139 end) 182 140 end 183 141 end 184 - ``` 185 - 186 - ```output 187 - {:module, Day3, <<70, 79, 82, 49, 0, 0, 7, ...>>, {:count, 1}} 188 142 ``` 189 143 190 144 ### Task 1 ··· 206 160 a * b 207 161 ``` 208 162 209 - ```output 210 - 3847100 211 - ``` 212 - 213 163 ### Task 2 214 164 215 165 ```elixir ··· 241 191 co2 * o2 242 192 ``` 243 193 244 - ```output 245 - 4105235 194 + ## Day 4 195 + 196 + ### Input 197 + 198 + This time it is a little bit more convoluted, as there are 2 parts of the input. 199 + Fortunately we can easily disect the parts via pattern matching. 200 + 201 + Technically the conversion to the numbers is not needed, but it does no harm 202 + and provides additional layer of safety against some whitespace characters left there 203 + and here. 204 + 205 + The `Day4.win/2` function is manually unrolled, as it is easier to write than some 206 + random jumping in the list. 207 + 208 + <!-- livebook:{"disable_formatting":true} --> 209 + 210 + ```elixir 211 + [numbers | bingos] = 212 + File.read!("day4.txt") 213 + |> String.split("\n\n", trim: true) 214 + 215 + numbers = 216 + numbers 217 + |> String.trim() 218 + |> String.split(",") 219 + |> Enum.map(&String.to_integer/1) 220 + 221 + bingos = 222 + bingos 223 + |> Enum.map(fn bingo -> 224 + bingo 225 + |> String.split(~r/\s+/, trim: true) 226 + |> Enum.map(&String.to_integer/1) 227 + end) 228 + 229 + defmodule Day4 do 230 + def win( 231 + [ 232 + a1, a2, a3, a4, a5, 233 + b1, b2, b3, b4, b5, 234 + c1, c2, c3, c4, c5, 235 + d1, d2, d3, d4, d5, 236 + e1, e2, e3, e4, e5 237 + ], 238 + nums 239 + ) do 240 + # Rows 241 + all_in([a1, a2, a3, a4, a5], nums) or 242 + all_in([b1, b3, b3, b4, b5], nums) or 243 + all_in([c1, c2, c3, c4, c5], nums) or 244 + all_in([d1, d2, d3, d4, d5], nums) or 245 + all_in([e1, e2, e3, e4, e5], nums) or 246 + # Columns 247 + all_in([a1, b1, c1, d1, e1], nums) or 248 + all_in([a2, b2, c2, d2, e2], nums) or 249 + all_in([a3, b3, c3, d3, e3], nums) or 250 + all_in([a4, b4, c4, d4, e4], nums) or 251 + all_in([a5, b5, c5, d5, e5], nums) or 252 + # Diagonals 253 + all_in([a1, b2, c3, d4, e5], nums) or 254 + all_in([a5, b4, c3, d2, e1], nums) 255 + end 256 + 257 + def not_matched(bingo, nums) do 258 + Enum.reject(bingo, &(&1 in nums)) 259 + end 260 + 261 + defp all_in(list, nums) do 262 + Enum.all?(list, &(&1 in nums)) 263 + end 264 + end 265 + ``` 266 + 267 + ### Task 1 268 + 269 + We simply traverse the `numbers` list aggregating the numbers (order doesn't really matter, 270 + here we aggregate them in reverse order to speedup the code). When we have enough numbers 271 + that any of the `bingos` is winning one, then we halt the reduction and return computed 272 + result. 273 + 274 + ```elixir 275 + numbers 276 + |> Enum.reduce_while([], fn elem, acc -> 277 + matches = [elem | acc] 278 + 279 + case Enum.find(bingos, &Day4.win(&1, matches)) do 280 + nil -> {:cont, matches} 281 + bingo -> {:halt, Enum.sum(Day4.not_matched(bingo, matches)) * elem} 282 + end 283 + end) 284 + ``` 285 + 286 + ### Task 2 287 + 288 + ```elixir 289 + numbers 290 + |> Enum.reduce_while({bingos, []}, fn elem, {bingos, acc} -> 291 + matches = [elem | acc] 292 + 293 + case bingos do 294 + [bingo] -> 295 + if Day4.win(bingo, matches) do 296 + {:halt, Enum.sum(Day4.not_matched(bingo, matches)) * elem} 297 + else 298 + {:cont, {bingos, matches}} 299 + end 300 + 301 + _ -> 302 + {:cont, {Enum.reject(bingos, &Day4.win(&1, matches)), matches}} 303 + end 304 + end) 246 305 ```