2025: day06

This commit is contained in:
Antoine Martin 2025-12-10 10:42:18 +01:00
parent 82f19b2667
commit 47dfb876eb
6 changed files with 220 additions and 1 deletions

View file

@ -5,6 +5,7 @@ use aoc2025::day02;
use aoc2025::day03;
use aoc2025::day04;
use aoc2025::day05;
use aoc2025::day06;
fn aoc2025_all(c: &mut Criterion) {
c.bench_function("day01", |b| b.iter(|| day01::run().unwrap()));
@ -12,6 +13,7 @@ fn aoc2025_all(c: &mut Criterion) {
c.bench_function("day03", |b| b.iter(|| day03::run().unwrap()));
c.bench_function("day04", |b| b.iter(|| day04::run().unwrap()));
c.bench_function("day05", |b| b.iter(|| day05::run().unwrap()));
c.bench_function("day06", |b| b.iter(|| day06::run().unwrap()));
}
criterion_group! {

5
aoc2025/input/day06.txt Normal file
View file

@ -0,0 +1,5 @@
366 27 228 617 753 14 146 5 1 83 92 885 64 41 8 952 75 23 26 43 229 478 633 5347 192 64 595 496 644 1 74 119 94 9 1 55 7 2 1269 13 128 368 75 18 32 664 15 4 57 7665 277 2 75 17 722 622 6 91 52 293 23 1 1611 267 1 47 458 469 9521 872 23 2 9 1669 971 77 26 4 17 491 972 354 5 964 438 873 65 432 81 75 71 334 17 6 92 28 888 966 82 98 4 38 5 69 74 754 38 872 349 93 74 12 151 319 332 35 313 8 12 55 295 781 1686 74 997 282 54 382 4881 4655 367 95 7 89 18 23 344 9 53 19 5749 486 72 687 27 29 92 55 15 54 17 85 237 7151 3 2573 6 9 363 623 972 16 9 71 64 741 111 91 3 662 779 65 7 14 23 56 1414 7517 2 41 754 515 32 6326 763 86 2625 83 78 75 9 6159 83 57 25 6989 949 2 2967 1 8 919 45 88 52 74 49 885 41 4 25 7333 185 65 83 327 96 5793 32 457 3 783 244 86 85 18 2 331 52 658 12 85 72 18 42 12 267 33 768 628 78 42 4816 264 17 765 758 9 678 12 45 67 432 447 37 8474 645 2 85 183 79 28 1 96 73 4 572 171 44 59 9787 47 4 46 15 126 3446 459 726 578 9 8 649 144 71 8 6 39 844 554 79 696 58 823 78 51 19 142 64 86 97 1 438 68 8 5746 19 498 323 2 438 3287 649 56 29 79 35 486 361 928 47 51 313 9 7 53 46 76 3 6862 14 24 2 2 44 23 142 28 82 756 2931 643 18 9 12 39 599 43 25 91 29 648 924 81 89 8315 713 88 375 3 894 25 427 938 54 2 967 11 947 97 574 989 215 413 31 59 238 92 24 75 6 966 3 63 252 826 397 9 6223 9957 55 96 89 2 54 589 41 12 327 3 15 295 2 34 366 972 24 89 224 34 68 691 3 5 94 6798 2 2354 891 913 6868 46 53 1 9164 8 6 444 47 5 19 448 5 12 3773 5494 13 76 24 583 4 475 783 951 62 2 44 921 96 251 84 896 58 87 343 75 61 9 661 31 24 6 17 873 163 4 78 45 28 67 42 92 232 3 183 1 879 81 17 98 571 23 7 225 7954 74 82 5 31 949 518 154 67 32 55 1 69 6 95 52 383 216 458 4 482 96 8494 72 275 9 41 52 37 279 51 39 396 57 89 588 32 524 17 6645 9 534 289 9 59 89 1 71 5345 561 3 5 565 93 6389 97 124 3 94 249 86 36 611 9 6299 7329 195 1 389 7 33 988 28 596 84 1 392 9846 364 82 6385 8 5 8482 48 914 4 417 534 59 64 751 7567 129 46 42 25 153 315 988 93 46 336 41 6 91 67 451 426 84 6 8155 3 6 53 4 399 178 53 13 668 4687 76 44 49 673 97 253 41 83 49 853 741 418 3 78 466 896 24 55 15 15 3 195 329 19 78 89 4 6 619 791 62 64 86 89 583 327 752 77 32 2 675 54 78 621 57 5976 18 33 9 441 9 52 828 51 39 2 15 338 4322 2 175 2473 555 69 1 722 28 5 43 59 4 732 656 32 67 147 74 399 1 764 34 69 97 91 46 43 82 85 11 5 376 11 65 2 9371 11 159 463 93 32 263 5 4 2794 1 21 42 199 937 8 168 8 337 17 753 28 46 9 866 4 27 42 144 622 6 9 34 89 73 282 32 14 58 946 91 71 2 8 64 277 18 59 99 4311 5 676 916 773 24 96 24 293 28 5856 227 452 53 5 8 79 5944 357 731 82 56 6787 75 569 8 854 4136 12 95 81 84 6848 2 72 1 86 986 492 13 17 5 32 967 1 27 124 6 82 135 11 73 62 81 3 81 9 61 865 48 5 62 16 963 8 52 71 93 4 529 7291 2 84 8 86 56 3727 14 157 64 74 377 694 275 21 2615 18 9 59 577 7811 839 67 24 3558 246 528 89 368 924 752 685 49 522 61 75 5735 8 4 37 745 56 815 38 9 247 53 6 1844 3 1 531 971 735 9 21 99 9413 89 8657 39 514 565 42 6724 2 23 443 37 85 117 63 14 35 3466 934 57 79 2 116 63 95 2 51 46 47 5535 28 6 38 81 898 93 3 871 3 9468 432 224 91 24 85 891 2 78 568 26 45 23 8 85 57 8 51 82 859 929 65 5 458 5456 752 96 47 264 86 76 24 67 87 8 622 9912 357 38 62 1 17 53 899 3 3977 97 6135 1 33 44 153 37 435 63 674 27 394 86 7696 119 1 77 94 69 417 7 917 53 831 4 62 314 794 17 78 268 8 58 465 6 969 59 39 44
2893 23 156 756 335 46 8446 45 5 83 57 16 641 43 1 275 56 3517 44 68 386 955 412 2855 155 64 641 489 199 4 17 589 99 99 15 25 73 62 1746 32 643 215 58 38 74 849 89 9 48 6538 178 735 13 26 719 991 714 85 43 956 44 4 6637 833 86 38 144 948 2943 786 21 2 829 8547 846 21 723 325 35 561 965 569 8 954 571 174 621 5163 93 42 66 953 52 24 59 13 487 778 26 789 74 84 34 98 97 836 944 218 11 98 32 727 731 258 269 18 798 14 15 94 773 227 2385 994 888 528 24 928 6311 9789 678 95 7 415 81 8 864 3 75 14 6375 756 17 589 82 9 99 15 47 94 631 99 254 1682 1 4196 32 8 7344 225 517 97 1 37 68 372 424 94 3 791 446 32 67 79 36 91 2515 7279 8 32 418 597 869 184 797 624 1492 44 83 73 2 1567 95 662 27 9258 798 2 8517 6 7 893 63 33 44 82 16 389 28 2 37 7143 697 69 33 744 44 9763 28 532 5 546 785 96 74 438 34 246 49 887 47 9635 148 33 99 83 361 38 643 363 69 58 93 459 164 548 659 3 388 62 493 89 478 431 11 587 298 99 39 168 573 856 56 51 772 35 938 639 61 59 4897 92 5 825 81 668 6531 241 168 252 88 27 65 381 86 39 54 23 7696 169 927 452 14 732 48 67 97 119 45 67 18 3 728 392 727 6797 36 613 357 4 197 9565 229 17 8 98 263 938 677 524 33 82 745 62 8 17 26 711 3 7725 37 37 92 9 68 37 233 18 66 63 1272 984 99 7 57 68 462 91 31 165 45 533 667 885 52 7378 81 28 923 11 975 62 945 367 23 96 381 51 249 66 833 669 8538 243 633 96 22 894 71 62 61 7369 26 271 718 41 269 5 5175 1161 15 39 888 7 98 593 52 46 423 68 33 981 27 47 3555 386 15 72 825 47 73 527 3 51 621 7416 11 8976 59 695 899 63 43 8 7564 78 22 285 92 57 2947 616 3 193 387 3633 241 573 74 182 33 694 589 728 53 3 249 62 58 579 26 576 58 38 422 65 24 89 411 59 67 61 1981 681 3767 14 67 33 725 523 83 878 713 2 716 26 16 287 982 65 648 96 47 731 1426 86 72 64 4369 99 757 8748 197 57 968 799 73 7 251 21 626 742 114 9 645 26 7211 5 345 9 95 445 73 584 19 39 175 58 63 592 49 979 469 1887 68 335 846 3 69 67 89 21 2186 435 734 4 483 84 1574 787 598 89 9 556 44 61 52 38 8941 4321 369 3 942 87 46 256 22 642 5 23 883 6479 965 14 216 4 88 214 59 173 57 937 912 63 18 654 7595 743 62 277 24 661 739 632 875 5164 829 56 637 38 839 56 75 4 8 1369 5 8 41 53 642 773 89 37 526 2696 67 65 57 37 476 85 14 94 6 853 8839 639 8 73 53 448 38 29 39 32 45 254 443 75 26 795 26 982 71 658 41 39 97 989 19 272 749 68 751 22 159 29 789 918 69 4287 83 18 859 518 31 74 449 418 96 495 56 854 8471 9 551 728 84 67 2 894 339 64 44 88 68 646 3232 493 72 353 11 833 72 711 97 147 67 22 56 412 11 46 86 47 249 976 55 3 7253 15 51 532 32 34 65 51 415 4241 53 344 182 165 389 58 377 6 398 231 311 26 56 6 568 95 23 78 434 392 71 76 697 5 125 486 5 23 3918 819 84 86 8 283 98 654 49 987 42 9794 7 72 569 143 742 4594 182 565 25 9658 546 4 27 831 25 68 8848 137 4321 2572 927 8545 99 923 52 424 6371 89 86 47 93 8895 1 49 1 99 9281 172 18 69 77 83 221 47 863 938 73 77 34 311 617 94 79 876 68 322 22 931 22 2 32 1787 828 1 75 52 25 8 632 5567 12 62 7 44 69 5892 81 812 32 317 726 1196 927 21 8555 39 3 62 559 1835 9679 31 58 446 931 858 61 247 917 161 4457 88 798 27 84 52 453 32 728 691 499 887 68 95 742 17 39 7951 51 16 823 664 483 1 4 51 754 313 9495 77 132 421 766 3315 176 93 58 37 86 433 42 66 15 9322 551 49 914 96 3215 11 88 2 22 11 13 7469 219 37 19 39 667 14 79 453 31 63 548 421 96 53 39 719 6 4 85 67 834 63 64 12 15 86 669 16 43 125 99 39 547 1666 372 11 74 875 59 381 89 86 99 68 176 452 537 3 34 886 49 87 621 32 236 64 6154 26 46 16 797 141 465 19 233 16 443 89 1322 37 42 47 25 715 613 188 236 78 592 485 67 699 919 39 37 583 728 64 373 5 156 388 76 29
5447 89 387 842 49 388 8423 814 93 2 17 2 288 92 5 45 77 9841 28 58 463 91 657 8732 899 525 1 74 928 74 27 186 72 78 386 51 853 34 6447 553 9 397 29 95 77 654 6 94 4 3949 985 873 6 8 57 732 438 81 6 98 72 14 136 864 73 17 948 128 2574 819 14 43 467 316 965 67 594 436 11 697 1 285 39 267 285 99 436 5384 28 83 11 568 45 41 67 94 664 775 53 644 69 75 51 347 7 62 556 415 2 41 71 718 58 299 194 34 5 52 56 6 63 46 95 569 922 25 36 643 6557 1685 85 87 566 161 92 1 25 332 43 239 53 418 675 98 87 9 76 67 57 22 687 38 291 4964 46 1211 658 163 6126 837 149 12 1 21 18 271 48 5 85 577 48 6 16 59 92 853 335 7311 22 87 879 567 165 762 843 765 9163 65 39 86 147 9749 84 614 95 649 743 68 9515 85 98 263 49 67 1 82 77 8 33 72 98 8562 38 56 46 165 627 532 27 131 1 85 519 99 463 284 18 265 99 88 69 9716 259 18 1 6 71 73 944 555 51 18 3 845 145 229 47 6 419 45 953 38 234 451 28 62 6937 592 71 267 998 895 21 4 634 188 15 758 78 79 946 38 46 219 67 735 56 836 784 824 45 55 16 791 29 853 73 83 4867 5254 6523 75 74 266 18 1 99 268 19 76 4 58 747 2392 521 398 22 887 131 3 379 855 527 75 5 24 882 69 938 257 1 1 98 44 7 72 12 3282 74 8446 37 7 84 12 58 61 866 3 83 1 74 513 59 2 76 62 667 53 74 587 55 626 7 768 14 1984 2 46 22 789 142 39 775 711 86 44 162 35 369 86 795 235 7833 172 543 82 59 381 18 31 33 3758 35 7626 1 46 82 77 575 4442 73 79 332 137 14 88 984 72 528 87 11 4 32 77 8142 32 28 9 4 293 22 979 8 72 495 1319 39 999 81 715 982 87 65 86 6563 693 25 952 54 86 8537 892 7 3145 337 991 882 256 97 13 293 42 249 533 68 91 733 74 41 167 295 222 2 976 252 42 9 69 134 3 761 9391 7723 515 1836 524 16 32 912 3775 74 391 177 135 8141 92 77 8335 139 72 21 39 94 66 4944 3 14 894 3411 17 75 4368 499 496 724 7259 6 27 317 18 182 574 84 3 758 18 574 4 78 78 69 831 87 331 17 464 112 19 11 354 93 9481 428 4432 15 476 67 7 6 83 13 31 6637 216 149 31 24 93 622 438 755 41 6 44 66 35 78 97 8919 3559 641 4 469 54 84 249 3 136 4 81 393 6263 149 5 838 71 83 78 22 813 41 95 245 61 17 27 619 835 25 891 72 863 7639 922 521 2126 437 58 8567 64 375 92 8 4 8 665 2 44 8 44 782 614 71 81 626 632 17 85 45 5 615 38 11 51 5 862 2717 4776 96 47 17 171 83 33 9385 597 92 585 653 825 99 3724 92 727 1 77 75 26 93 666 24 81 77 21 236 5938 422 66 113 66 43 8992 23 58 193 148 95 85 44 2252 22 336 2 793 2935 51 716 685 71 66 7 595 942 5755 56 62 43 732 3911 169 64 5 18 71 16 634 71 149 173 77 98 227 67 456 8 37 3287 832 65 1 8536 88 95 53 27 517 8 39 512 1264 81 496 886 76 846 17 456 71 529 358 958 95 86 41 217 372 83 67 58 24 95 229 167 3 611 6666 6 26 6394 44 37 97 15 693 53 159 31 273 86 6282 53 43 881 518 265 7965 7358 762 87 866 76 5 49 793 499 87 5339 779 6527 3278 517 6474 97 773 49 236 6713 67 54 55 15 152 6 89 2 41 4163 224 71 48 93 99 51 366 351 892 78 6 53 238 282 92 76 532 11 194 6 64 73 93 86 7588 815 25 13 949 97 7 76 3581 56 82 66 88 7 2413 74 41 26 997 5763 6164 51 93 185 469 86 38 793 7966 9935 7 31 997 7 283 85 674 295 955 9349 59 78 74 85 21 185 975 325 81 715 269 58 44 986 66 77 8718 261 821 684 963 211 61 4 63 212 691 2275 57 765 264 149 856 686 58 33 1 44 258 17 2 24 274 266 6 954 41 4924 14 3156 54 52 45 649 4247 583 99 65 68 449 66 358 664 41 14 789 625 17 11 55 174 67 8 37 34 1815 74 58 96 3 18 792 91 62 99 95 66 82 659 271 56 69 264 6 861 56 6 54 5579 336 566 5 8 5 417 21 76 256 76 726 6 3455 69 79 21 75 522 974 75 687 5 649 53 8932 84 33 78 75 814 52 412 7132 72 268 667 69 498 991 14 61 13 624 97 396 98 787 693 96 15
6541 525 919 57 35 465 2588 525 73 9 69 1 767 5 223 2 55 4553 5 26 26 31 29 57 999 9419 9 4 764 81 84 435 49 48 414 52 214 96 3372 128 8 748 51 7 99 89 3 83 6 13 887 219 1 8 7 589 139 3 8 15 3 42 57 329 58 41 13 12 2 56 458 651 783 99 558 34 395 843 74 3 7 65 46 4 3 3 613 8815 53 77 56 372 4 44 85 88 762 79 3 797 33 55 99 746 2 4 321 959 5 77 79 461 39 434 72 3 2 72 3 9 1 9 21 625 221 88 67 18 222 428 4 99 723 774 12 8 14 249 13 685 7 619 246 25 57 5 88 15 22 93 335 69 7 597 54 5 239 367 4373 85 72 4 37 5 59 172 53 1 46 136 85 6 61 8 21 166 9 99 927 95 71 162 227 698 9 684 2936 6 5 14 232 3271 11 118 67 713 16 78 946 754 51 5 98 8 4 65 73 1 66 22 48 4298 97 5 49 1 511 67 68 63 35 4 99 38 767 7295 74 535 42 9 44 2266 167 6 9 6 1 75 469 573 43 2 4 288 369 45 92 33 34 65 7323 66 84 339 86 8 3418 912 95 65 534 571 55 7 347 916 98 525 79 76 53 179 868 641 62 46 21 328 96 569 59 74 31 748 75 4226 23 33 4956 5484 8379 67 3 2 24 2 274 595 3 23 8 941 98 9326 931 17 27 31 854 47 293 667 22 18 6 32 225 1 982 196 4 4 4 33 583 46 4 6614 17 37 11 7 727 65 15 23 39 7 81 9 89 55 27 29 9 85 18 19 4 532 855 4 4 432 7 627 2 82 15 779 428 25 49 4 94 771 8 24 71 31 1 124 8544 878 924 32 45 793 2 92 11 4697 536 8998 9 88 78 16 93 95 55 56 685 4663 16 8 989 475 181 97 97 2 925 28 7439 7 19 5 9 383 81 339 39 27 995 381 86 68 2 861 13 87 16 91 4 671 36 54 24 72 9474 3 65 5712 95 393 581 978 35 68 356 28 154 99 39 51 8787 6 16 98 491 595 8 635 8 3 5 45 12 6 697 8141 4634 734 1189 639 75 95 127 4166 3 188 559 9214 3794 28 32 2436 283 5 11 12 637 75 818 5 27 226 2653 37 18 5517 262 583 843 1692 2 78 748 5 3 529 9 47 23 4 71 2 72 83 22 774 58 297 55 443 853 43 836 43 8 4633 796 4457 58 749 19 88 2 99 55 57 84 89 959 787 55 43 14 292 62 789 3 79 35 94 84 19 1445 1399 364 66 6 532 22 818 9 717 9 42 562 282 225 9 25 29 58 59 6 392 345 71 42 44 93 74 4 131 58 454 62 327 3564 675 638 4942 29 72 6424 3 545 7 7 9 59 951 65 18 3 49 364 1 71 77 627 7 77 15 87 3 198 4 65 18 4 837 3535 4837 11 38 32 185 87 8 5348 3612 51 83 33 725 99 6495 393 537 7 28 24 88 5 399 33 84 32 19 544 1192 723 7 496 7 96 62 52 92 962 863 835 96 94 8555 929 478 2 26 6582 67 497 47 9 87 36 52 169 4924 79 9 92 886 8948 722 8 2 6 16 79 56 58 558 256 93 49 351 62 996 1 54 4473 556 11 74 8835 42 33 4 6 978 6 25 8128 54 73 988 7983 73 864 23 132 64 688 747 183 58 24 21 631 469 92 95 47 11 85 195 714 8 786 7177 3 49 5727 41 474 19 66 261 74 26 45 194 91 9331 31 8 95 792 323 5649 9529 32 39 37 46 9 9 119 582 8 868 2893 7217 3284 576 1669 68 773 13 6 6739 91 4 22 45 61 71 1 98 63 7212 767 5 93 34 96 49 396 186 53 24 3 66 449 626 5 9 689 53 932 4 81 9 59 19 6946 25 74 97 767 68 97 21 3754 19 46 47 7 4 617 681 12 5 235 5543 2688 2 92 14 974 53 19 839 4444 8543 2 53 78 3 5 3 26 96 712 9234 86 11 65 22 15 594 636 922 12 466 992 12 69 74 31 14 3378 225 359 11 77 598 12 1 36 32 255 382 38 19 747 979 824 455 676 2 3 71 51 87 1 26 12 273 2 863 65 8761 2 4543 42 64 82 226 8952 639 62 81 15 367 87 872 173 46 5 43 84 68 34 59 38 93 5 15 96 3882 33 77 12 3 28 426 48 16 1 9 749 6 81 73 45 33 24 6 987 68 9 6 8677 7 38 5 6 9 544 9 21 39 61 512 6 615 68 8 2 72 871 625 91 242 1 223 6 72 5 73 1 14 5328 38 718 1348 17 799 282 99 81 283 27 539 1 523 2 7 89 21 876 3 55
+ * + * + * + + * * * + * * + * * + + * * + * + * + * + * * * + * + + + * + + + * * * * * + * * * + + * * * * * * + * * * * + * * + + * + + * * * + + * * * * * + + * * * * * + + * + + * * * * + * + + + * * * + + * * * * * + * * * + * + * + + * + * * * + * + + * * + * * * + * * * + + * * + * + * * * * * + + * + + * + * * * * + + * * * * * + * * + * * + + * + + * + + + + + * + + * + * + + + * * + + + * * + * * + * + * * + + * * + + + + * + + * + * + + * + + * + * + * * * + + * * * + * + * * + * + + * * * + + + * * * + * + * * * * + * * + * * * * * + * + * + * + * + + + * + + + * + * + + * + * * * * + + * + + * * * + + + + * + * * * + + + * * + * * + * + * * * + + * + * * * + * + + + + + * * + + + + * * + * * * + * + * * * + + + * * * * + + * * * + * + + + * + + * + * + + * + * + * + * + * * + * * * + * * * + + * * + + + + * + * * + * + * + * + * + * + * * + + + + * + * * * + * * + + * + + + + + * + * + * + * * + + + + + + + * + + + * + + * * + * + * * + + + + * * + * * + * + * + * + * * * + * * + + + * + * * * * * + + + * * * * + * + + * + * * * + * + + + * * * + * + + + * * * * + + + + * * + * * * + + * * + + + + + + + * + + + * * + * + * * + * + + * + + * * + + * * + * * + * * * * * + * * * + * * * + * + * + * * + + * + + + * * + + * * * + * + * * * * + * * + + * + * * + * + * + * + * * + * + * * + + + + + + * * + * + * * * + * * * + + * * * * + + + * + * * * + + + * + + + * * + * * * * * * * + + + * + * * * + + + + + * * * + * + * + + + + + * * + * + + * * + + * + * + * + + + * * * * + + + + + * * * * + * + + + + * + * + * * + + * * * + * + + + + * * + + + * * * + + * + * + * + * + + + * + * * + * * + * + + * + * * * * + + * * * * + + * + + + * + + + + * + + + * * + * * + * + + + + + * + + * * * * + + + + * + * * * * * + + * + * * * * + * * * + * * + + + + * + * + + * + + + + * + + * + + * * * * + + * * * + + * * + + * + + * * + + * * * * * + * + + + * + + * + + * + + + * * * * + * * + + + + * * * + * + * * + * + + + + * + + * * + + * + + * + * * * * + * + * + + +

View file

@ -0,0 +1,4 @@
123 328 51 64
45 64 387 23
6 98 215 314
* + * +

199
aoc2025/src/day06.rs Normal file
View file

@ -0,0 +1,199 @@
use std::{fmt::Write, str::FromStr};
use anyhow::{Context, Result, bail};
const INPUT: &str = include_str!("../input/day06.txt");
pub fn run() -> Result<String> {
let mut res = String::with_capacity(128);
writeln!(res, "part 1: {}", part1(INPUT)?)?;
writeln!(res, "part 2: {}", part2(INPUT)?)?;
Ok(res)
}
#[derive(Debug, Clone, Copy)]
enum MathOp {
Add,
Mult,
}
impl FromStr for MathOp {
type Err = anyhow::Error;
fn from_str(s: &str) -> Result<Self> {
match s {
"+" => Ok(MathOp::Add),
"*" => Ok(MathOp::Mult),
_ => bail!("cannot parse `{}' as MathOp", s),
}
}
}
#[derive(Debug, Clone)]
struct MathProblem {
numbers: Vec<u64>,
op: MathOp,
}
impl MathProblem {
fn compute(&self) -> u64 {
match self.op {
MathOp::Add => self.numbers.iter().sum(),
MathOp::Mult => self.numbers.iter().product(),
}
}
}
fn part1(input: &str) -> Result<u64> {
let mut numbers: Vec<Vec<u64>> = Vec::new();
let mut ops = Vec::new();
for line in input.lines() {
let line = line.trim();
if line
.chars()
.next()
.context("got an empty line")?
.is_ascii_punctuation()
{
ops = line
.split_ascii_whitespace()
.map(|c| c.parse::<MathOp>())
.collect::<Result<_>>()?;
break;
}
let split_line = line.trim().split_ascii_whitespace();
let width = split_line.clone().count();
if !numbers.is_empty() && numbers.len() != width {
bail!(
"all input lines should have the same number of columns: current line has {}, previous lines had {}",
width,
numbers.len()
);
}
if numbers.is_empty() {
for _ in 0..width {
numbers.push(Vec::new());
}
}
for (idx, num) in split_line.enumerate() {
numbers[idx].push(num.parse::<u64>()?);
}
}
Ok(ops
.into_iter()
.zip(numbers)
.map(|(op, numbers)| MathProblem { numbers, op })
.map(|problem| problem.compute())
.sum())
}
fn part2(input: &str) -> Result<u64> {
let mut numbers: Vec<Vec<u8>> = Vec::new();
let mut ops = Vec::new();
for line in input.lines() {
if line
.chars()
.next()
.context("got an empty line")?
.is_ascii_punctuation()
{
ops = line
.split_ascii_whitespace()
.map(|c| c.parse::<MathOp>())
.collect::<Result<_>>()?;
break;
}
let line = line.as_bytes().to_vec();
if !numbers.is_empty() && numbers[0].len() != line.len() {
bail!(
"all input lines should have the same number of columns: current line has {}, previous lines had {}",
line.len(),
numbers[0].len(),
);
}
numbers.push(line);
}
if numbers.is_empty() {
bail!("input had no numbers");
}
let mut parsed_numbers = Vec::new();
let mut cur_problem_numbers = Vec::new();
for col in 0..numbers[0].len() {
fn col_is_empty(col: usize, numbers: &[Vec<u8>]) -> bool {
(0..numbers.len()).all(|line| numbers[line][col].is_ascii_whitespace())
}
if col_is_empty(col, &numbers) {
parsed_numbers.push(cur_problem_numbers);
cur_problem_numbers = Vec::new();
continue;
}
let mut num = 0;
for line in &numbers {
let chr = line[col];
if chr.is_ascii_whitespace() {
continue;
}
if !chr.is_ascii_digit() {
bail!("input contained non-digit ascii character: `{}'", chr)
}
let digit = (chr - b'0') as u64;
num *= 10;
num += digit;
}
cur_problem_numbers.push(num);
}
if !cur_problem_numbers.is_empty() {
parsed_numbers.push(cur_problem_numbers);
}
if parsed_numbers.len() != ops.len() {
bail!(
"got a different number of number sets ({}) and operators ({})",
parsed_numbers.len(),
ops.len()
);
}
Ok(ops
.into_iter()
.zip(parsed_numbers)
.map(|(op, numbers)| MathProblem { numbers, op })
.map(|problem| problem.compute())
.sum())
}
#[cfg(test)]
mod tests {
use super::*;
const PROVIDED: &str = include_str!("../input/day06_provided.txt");
#[test]
fn part1_provided() {
assert_eq!(part1(PROVIDED).unwrap(), 4277556);
}
#[test]
fn part1_real() {
assert_eq!(part1(INPUT).unwrap(), 5316572080628);
}
#[test]
fn part2_provided() {
assert_eq!(part2(PROVIDED).unwrap(), 3263827);
}
#[test]
fn part2_real() {
assert_eq!(part2(INPUT).unwrap(), 11299263623062);
}
}

View file

@ -3,3 +3,4 @@ pub mod day02;
pub mod day03;
pub mod day04;
pub mod day05;
pub mod day06;

View file

@ -7,9 +7,17 @@ use aoc2025::day02;
use aoc2025::day03;
use aoc2025::day04;
use aoc2025::day05;
use aoc2025::day06;
fn main() -> Result<()> {
let days: &[DayFunc] = &[day01::run, day02::run, day03::run, day04::run, day05::run];
let days: &[DayFunc] = &[
day01::run,
day02::run,
day03::run,
day04::run,
day05::run,
day06::run,
];
aoc::run(days)
}