Compare changes

Choose any two refs to compare.

-1
.envrc
··· 1 - use_flake .
-1
.gitignore
··· 1 - .direnv
+1
2024/.gitignore
··· 1 + .direnv
+1
2024/day_1/.gitignore
··· 1 + /target
+7
2024/day_1/Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 3 4 + 5 + [[package]] 6 + name = "day_1" 7 + version = "0.1.0"
+6
2024/day_1/Cargo.toml
··· 1 + [package] 2 + name = "day_1" 3 + version = "0.1.0" 4 + edition = "2021" 5 + 6 + [dependencies]
+1000
2024/day_1/input.txt
··· 1 + 77221 93653 2 + 61169 27995 3 + 49546 69782 4 + 11688 41563 5 + 15820 48282 6 + 63235 37517 7 + 28850 68189 8 + 80735 25255 9 + 42616 65322 10 + 55068 99897 11 + 30851 35509 12 + 14907 49013 13 + 64732 92011 14 + 16709 68830 15 + 67643 36207 16 + 44080 23559 17 + 96480 58330 18 + 99450 40186 19 + 21169 63410 20 + 58096 21671 21 + 53828 79572 22 + 47026 44529 23 + 90101 28656 24 + 45773 73412 25 + 71303 85991 26 + 45304 78294 27 + 96528 23559 28 + 19794 17882 29 + 74831 17211 30 + 88912 11644 31 + 98961 80435 32 + 15788 96101 33 + 16350 86995 34 + 96806 19028 35 + 99959 77868 36 + 58887 90255 37 + 42568 25255 38 + 29278 88912 39 + 94028 63269 40 + 42810 21548 41 + 97490 71747 42 + 89051 24477 43 + 73916 31808 44 + 97751 88912 45 + 73608 77868 46 + 62426 13754 47 + 29429 36177 48 + 11070 10894 49 + 78656 85185 50 + 31308 60500 51 + 96166 91114 52 + 36906 85134 53 + 99662 77868 54 + 66402 41563 55 + 37085 14475 56 + 80907 53324 57 + 61650 53324 58 + 84223 63753 59 + 83891 47827 60 + 15973 77536 61 + 68843 40593 62 + 98854 31274 63 + 42426 97404 64 + 25255 67531 65 + 44559 50141 66 + 93909 50674 67 + 28070 32858 68 + 24880 24813 69 + 29338 89795 70 + 64883 77868 71 + 66924 57646 72 + 32984 66502 73 + 32238 39062 74 + 38816 23559 75 + 58770 65322 76 + 74953 91636 77 + 70592 19028 78 + 93111 11644 79 + 31065 23537 80 + 67370 19028 81 + 18314 47412 82 + 71075 74334 83 + 21544 44529 84 + 59137 50980 85 + 20440 80749 86 + 14393 38495 87 + 72130 90255 88 + 43828 68830 89 + 23262 73660 90 + 11923 50980 91 + 47754 14164 92 + 96043 34362 93 + 27162 28090 94 + 20838 50713 95 + 75009 11121 96 + 92099 31274 97 + 22054 38248 98 + 43518 80106 99 + 68189 13153 100 + 50520 12727 101 + 51425 40674 102 + 42998 31053 103 + 52443 33051 104 + 37256 54436 105 + 16648 95555 106 + 81123 17329 107 + 46974 79835 108 + 36328 77868 109 + 76373 23559 110 + 82592 70046 111 + 70600 22417 112 + 27116 89690 113 + 28090 34969 114 + 86348 23559 115 + 53145 50980 116 + 30203 83301 117 + 23347 77681 118 + 76433 26236 119 + 28046 92869 120 + 58920 50980 121 + 25518 28090 122 + 12791 44529 123 + 61967 31808 124 + 98022 53056 125 + 24326 12263 126 + 41095 13121 127 + 24045 82448 128 + 31274 16530 129 + 78021 21589 130 + 63029 19658 131 + 75684 14475 132 + 31258 36493 133 + 40561 48589 134 + 20457 54974 135 + 14783 88465 136 + 39433 23537 137 + 34774 53324 138 + 10455 14329 139 + 26338 74416 140 + 55227 37003 141 + 36963 40380 142 + 31910 68189 143 + 94894 18220 144 + 23166 44111 145 + 48884 46787 146 + 73036 89795 147 + 83519 25205 148 + 50205 93653 149 + 85926 50141 150 + 69194 23559 151 + 25529 11642 152 + 10182 31274 153 + 13638 61987 154 + 83588 19028 155 + 75911 20768 156 + 44692 24325 157 + 43278 94888 158 + 48148 24394 159 + 86205 99327 160 + 82605 58818 161 + 52770 68189 162 + 89068 84917 163 + 66452 83679 164 + 50217 85099 165 + 64914 52073 166 + 76460 78294 167 + 43026 24410 168 + 44179 50980 169 + 47653 90255 170 + 78061 50980 171 + 14475 71478 172 + 77868 37150 173 + 99645 28090 174 + 86267 70055 175 + 58072 68830 176 + 96428 66585 177 + 77501 50141 178 + 52344 93653 179 + 49534 35509 180 + 46925 12437 181 + 40005 87987 182 + 17329 86995 183 + 17585 89795 184 + 32296 59660 185 + 81836 11644 186 + 89435 65322 187 + 55149 59423 188 + 56971 50141 189 + 26342 95142 190 + 57894 56227 191 + 49762 33007 192 + 48949 65641 193 + 40453 53505 194 + 67613 23537 195 + 27110 87987 196 + 25231 63910 197 + 92546 50713 198 + 70074 27554 199 + 39649 93653 200 + 93231 30520 201 + 60008 79179 202 + 18449 47209 203 + 68828 36207 204 + 18908 72254 205 + 55426 44661 206 + 62522 87987 207 + 60923 25255 208 + 85721 68107 209 + 35153 71814 210 + 20053 24813 211 + 24233 22904 212 + 36237 92731 213 + 92077 68189 214 + 30105 50674 215 + 37032 90255 216 + 12745 54116 217 + 41563 53324 218 + 24700 29145 219 + 60226 85335 220 + 50713 64775 221 + 29972 51790 222 + 79176 19794 223 + 40017 96101 224 + 90724 41345 225 + 51608 39176 226 + 46178 50141 227 + 26151 23489 228 + 19569 44529 229 + 34368 86052 230 + 18948 50801 231 + 62091 17329 232 + 89749 38984 233 + 68315 37514 234 + 52396 19794 235 + 14981 14475 236 + 36038 69571 237 + 50048 50980 238 + 60796 41563 239 + 69942 72877 240 + 80976 25234 241 + 56722 90255 242 + 49489 28090 243 + 60768 65557 244 + 70753 85065 245 + 15233 23522 246 + 94697 87600 247 + 40958 41532 248 + 91709 40116 249 + 83586 19028 250 + 88140 24977 251 + 56993 50980 252 + 17980 53324 253 + 12421 97982 254 + 30183 40884 255 + 50452 53324 256 + 91314 90651 257 + 69995 19028 258 + 16588 28090 259 + 22432 98658 260 + 86088 77868 261 + 46361 65322 262 + 97178 75705 263 + 37444 79320 264 + 12275 96101 265 + 47016 16942 266 + 36822 87327 267 + 62082 31274 268 + 68265 64314 269 + 87344 24603 270 + 40642 23559 271 + 87254 38755 272 + 62372 50713 273 + 89026 68830 274 + 88519 96101 275 + 53514 31808 276 + 24686 41563 277 + 23817 68705 278 + 26704 89031 279 + 37908 65322 280 + 22665 35601 281 + 75378 59200 282 + 16797 86995 283 + 55847 68189 284 + 55932 72688 285 + 41470 96101 286 + 43557 17329 287 + 45439 77868 288 + 41230 76226 289 + 25104 92869 290 + 43736 93653 291 + 85938 93653 292 + 74153 54726 293 + 73956 70350 294 + 70419 37102 295 + 81275 64160 296 + 30656 32684 297 + 46218 32617 298 + 67969 31808 299 + 61544 81806 300 + 39376 56568 301 + 14769 60336 302 + 10199 97703 303 + 61064 40091 304 + 75531 30486 305 + 17211 31808 306 + 75184 74633 307 + 24565 61765 308 + 83922 44529 309 + 11644 25255 310 + 71836 14393 311 + 53030 19028 312 + 83437 33190 313 + 33687 54998 314 + 92054 82083 315 + 48250 68533 316 + 10977 34363 317 + 51050 19028 318 + 80898 68276 319 + 26442 68830 320 + 39875 65514 321 + 24976 76417 322 + 31946 23537 323 + 95278 90255 324 + 71678 26450 325 + 49641 28580 326 + 12962 13674 327 + 13598 30362 328 + 40620 21256 329 + 49062 92869 330 + 88449 79529 331 + 80153 94081 332 + 36918 70556 333 + 77902 99228 334 + 41848 99097 335 + 26032 39378 336 + 23830 50980 337 + 49712 78294 338 + 95464 65322 339 + 76971 27393 340 + 67074 22132 341 + 17629 71246 342 + 92019 92869 343 + 20780 96521 344 + 68372 16880 345 + 49710 88060 346 + 94680 52634 347 + 28626 57101 348 + 31808 60809 349 + 25578 28090 350 + 12020 25255 351 + 46008 33046 352 + 27712 36207 353 + 17168 53033 354 + 92923 87987 355 + 94668 65843 356 + 59490 48858 357 + 69085 38485 358 + 28242 14664 359 + 18302 96101 360 + 64047 71241 361 + 62752 73532 362 + 28873 59278 363 + 22206 18029 364 + 57298 85374 365 + 26420 78294 366 + 74055 30817 367 + 74377 45566 368 + 81846 17058 369 + 35184 27305 370 + 72054 89795 371 + 78666 41563 372 + 80545 96101 373 + 69240 51322 374 + 76319 36831 375 + 23617 14475 376 + 53848 93653 377 + 65082 36888 378 + 18802 93491 379 + 63942 23559 380 + 80208 22876 381 + 17018 68830 382 + 78018 51611 383 + 35520 75130 384 + 43479 88543 385 + 18522 96101 386 + 41260 15010 387 + 58041 21675 388 + 96272 68830 389 + 73601 78294 390 + 44788 52104 391 + 67152 89795 392 + 57671 61399 393 + 33841 56764 394 + 41963 53394 395 + 41010 28090 396 + 53937 65322 397 + 75472 76675 398 + 22253 92068 399 + 24277 93653 400 + 62012 14475 401 + 27539 50141 402 + 29180 41637 403 + 27151 35922 404 + 28752 23559 405 + 31602 47673 406 + 80298 50906 407 + 94689 38297 408 + 87987 48139 409 + 51692 61967 410 + 93653 86995 411 + 99694 96638 412 + 50948 11644 413 + 87830 19794 414 + 57579 93403 415 + 60947 72082 416 + 18514 53324 417 + 99194 25255 418 + 57630 93653 419 + 49914 10526 420 + 34613 94340 421 + 32145 16105 422 + 39569 62764 423 + 14118 31274 424 + 38901 19016 425 + 47443 66925 426 + 83812 31274 427 + 61920 50141 428 + 88684 50713 429 + 32305 31808 430 + 58695 50713 431 + 20016 42720 432 + 68955 31976 433 + 96299 99509 434 + 83258 96101 435 + 49424 68830 436 + 97130 14043 437 + 34668 50936 438 + 27567 35509 439 + 57890 65959 440 + 58399 78860 441 + 88934 50980 442 + 70656 66788 443 + 91507 44529 444 + 53671 87987 445 + 75858 71137 446 + 14726 13674 447 + 25416 31274 448 + 90521 50075 449 + 37289 96101 450 + 79415 19028 451 + 21158 25355 452 + 53210 16168 453 + 35192 81526 454 + 67240 23559 455 + 42967 65310 456 + 81598 93094 457 + 12765 36207 458 + 23853 41643 459 + 78439 22984 460 + 13052 50141 461 + 56642 93653 462 + 19028 82791 463 + 89371 36244 464 + 89795 50799 465 + 41542 90489 466 + 49486 72630 467 + 26630 50763 468 + 35019 68830 469 + 62271 78294 470 + 16433 77868 471 + 42466 57338 472 + 63666 39984 473 + 56231 83564 474 + 51132 96101 475 + 33675 74200 476 + 94670 70445 477 + 51236 17822 478 + 52493 64460 479 + 45346 86995 480 + 41620 31274 481 + 80479 88912 482 + 46200 90255 483 + 13789 60686 484 + 98564 76843 485 + 44974 92717 486 + 76047 80674 487 + 60650 89430 488 + 55723 45722 489 + 89426 97853 490 + 33961 98414 491 + 32872 68189 492 + 65322 12029 493 + 29922 36159 494 + 74923 34697 495 + 37065 59688 496 + 66622 23559 497 + 68253 14475 498 + 28664 53324 499 + 62981 25761 500 + 83161 50674 501 + 22849 50980 502 + 11119 76308 503 + 22980 13794 504 + 76171 19411 505 + 96351 28221 506 + 45573 90255 507 + 19850 79146 508 + 97828 90483 509 + 23867 85271 510 + 36353 50141 511 + 46579 87987 512 + 73434 23559 513 + 57169 68189 514 + 68768 41682 515 + 59354 97617 516 + 62181 64641 517 + 34167 53324 518 + 28374 24803 519 + 55863 57352 520 + 25058 33040 521 + 76126 53005 522 + 97283 51641 523 + 25887 29253 524 + 43067 50713 525 + 51616 61868 526 + 97533 16129 527 + 50692 80951 528 + 43173 41626 529 + 93917 76055 530 + 84713 53465 531 + 24130 13599 532 + 56773 50980 533 + 15310 44529 534 + 63375 50141 535 + 75875 93653 536 + 22284 33135 537 + 46294 77836 538 + 29713 14393 539 + 95318 83346 540 + 83264 61967 541 + 39267 47771 542 + 61101 86995 543 + 47882 96101 544 + 24345 70347 545 + 50674 14475 546 + 17296 12880 547 + 52605 11644 548 + 40817 78294 549 + 36207 93653 550 + 16045 96101 551 + 91784 68830 552 + 34583 69934 553 + 71867 28090 554 + 74898 22671 555 + 54609 27206 556 + 33070 26257 557 + 18570 57394 558 + 16766 87036 559 + 62825 21503 560 + 39793 17504 561 + 12038 82452 562 + 37265 12706 563 + 69479 44529 564 + 96101 44260 565 + 49175 50713 566 + 70708 55412 567 + 50136 14475 568 + 27300 96101 569 + 75794 62368 570 + 10277 87990 571 + 30825 87987 572 + 35563 24149 573 + 12505 91890 574 + 11323 14393 575 + 89922 84455 576 + 10927 65359 577 + 50656 71304 578 + 47973 11644 579 + 17156 92869 580 + 98964 96101 581 + 50980 59345 582 + 94733 23559 583 + 22743 26134 584 + 90255 54273 585 + 80006 65322 586 + 10157 92869 587 + 70496 28090 588 + 25569 41226 589 + 79982 92869 590 + 34897 76485 591 + 83357 86388 592 + 26352 79503 593 + 67432 15174 594 + 49155 72153 595 + 36311 86995 596 + 14394 65333 597 + 70928 51667 598 + 67367 23559 599 + 48195 57003 600 + 52001 26154 601 + 63251 21651 602 + 21894 89795 603 + 50774 43252 604 + 85637 36207 605 + 79243 11644 606 + 49512 57954 607 + 22454 15919 608 + 84214 20805 609 + 67121 86995 610 + 49247 78035 611 + 79313 34840 612 + 33168 19814 613 + 48657 92888 614 + 59824 74905 615 + 30088 68830 616 + 74246 90052 617 + 78389 65322 618 + 88418 28090 619 + 93716 62226 620 + 74962 29324 621 + 47309 50980 622 + 93517 14393 623 + 23895 68175 624 + 34548 25255 625 + 32628 84730 626 + 55988 31274 627 + 82578 40953 628 + 51728 16926 629 + 19440 27805 630 + 42922 45159 631 + 52930 41563 632 + 91562 31274 633 + 23559 62680 634 + 92150 26879 635 + 78315 61783 636 + 43601 91325 637 + 87621 17838 638 + 78580 65350 639 + 94778 77868 640 + 68519 83273 641 + 35509 66389 642 + 82288 52439 643 + 65083 19794 644 + 86995 13010 645 + 66618 95850 646 + 18656 70145 647 + 98537 65322 648 + 60842 52161 649 + 68830 10132 650 + 99689 24077 651 + 33740 89795 652 + 45595 53090 653 + 78239 36207 654 + 20185 36207 655 + 87307 69366 656 + 83009 77868 657 + 34685 88642 658 + 13674 28090 659 + 82450 69909 660 + 44812 75146 661 + 54296 92869 662 + 73558 94990 663 + 21422 48229 664 + 49473 10547 665 + 66108 68189 666 + 71169 74202 667 + 78276 40690 668 + 82977 78294 669 + 61842 15634 670 + 31582 95459 671 + 39064 14475 672 + 70204 18593 673 + 71244 87987 674 + 31642 50490 675 + 98413 37109 676 + 61175 50141 677 + 37168 23559 678 + 44093 11032 679 + 18806 40848 680 + 91249 73483 681 + 95812 32572 682 + 93644 68189 683 + 30669 20850 684 + 75404 92869 685 + 53324 50141 686 + 80675 50216 687 + 14897 73401 688 + 34074 29952 689 + 16366 32630 690 + 95656 28090 691 + 73964 58896 692 + 90705 66916 693 + 92869 59662 694 + 99522 78294 695 + 35903 19794 696 + 33033 42610 697 + 55650 50980 698 + 29289 11753 699 + 32302 58345 700 + 76036 57644 701 + 74870 31274 702 + 85035 77868 703 + 79322 25255 704 + 50332 31274 705 + 78294 44529 706 + 93000 53324 707 + 36560 19028 708 + 40041 53525 709 + 70360 89795 710 + 19074 98749 711 + 32829 89603 712 + 61436 71046 713 + 89938 85369 714 + 52708 28090 715 + 83958 53324 716 + 88155 67097 717 + 32730 75527 718 + 64221 23559 719 + 60391 97432 720 + 70047 20185 721 + 12372 73527 722 + 46501 29274 723 + 66552 14746 724 + 56373 51614 725 + 95596 11782 726 + 81196 72623 727 + 32282 60515 728 + 49504 14393 729 + 57642 34348 730 + 95402 87987 731 + 81625 68830 732 + 28527 37199 733 + 71475 31808 734 + 94280 23005 735 + 55623 99355 736 + 46783 29073 737 + 36641 81559 738 + 74788 14535 739 + 87994 78773 740 + 80189 77868 741 + 33263 89795 742 + 23537 23537 743 + 25755 22264 744 + 67413 72800 745 + 74924 73774 746 + 81215 78294 747 + 78206 92869 748 + 36161 50141 749 + 54925 86995 750 + 66305 49951 751 + 42462 28090 752 + 99051 88912 753 + 44954 89795 754 + 88856 28090 755 + 63026 85778 756 + 22651 24813 757 + 39262 14475 758 + 86176 69982 759 + 65395 14393 760 + 12926 78294 761 + 81994 53324 762 + 16933 30191 763 + 46987 19794 764 + 37215 28090 765 + 15340 63748 766 + 40271 86674 767 + 23747 52856 768 + 61156 11644 769 + 65356 56048 770 + 72336 51278 771 + 21864 77868 772 + 99351 13349 773 + 24599 79046 774 + 62281 23361 775 + 81871 53324 776 + 14029 42297 777 + 50141 48720 778 + 46677 43636 779 + 10745 35965 780 + 39344 80864 781 + 38077 50038 782 + 13983 89795 783 + 66663 67877 784 + 64175 19028 785 + 62355 68830 786 + 96823 79443 787 + 46436 44754 788 + 53388 68830 789 + 45987 92723 790 + 87646 11707 791 + 75997 45545 792 + 69968 93653 793 + 30425 44529 794 + 83211 88109 795 + 28725 64932 796 + 47043 89795 797 + 34475 31274 798 + 42302 94895 799 + 66558 92753 800 + 48964 50713 801 + 19546 78294 802 + 51026 89795 803 + 89346 57408 804 + 52993 54676 805 + 29577 38385 806 + 85932 60320 807 + 18030 22556 808 + 65993 19922 809 + 74692 23559 810 + 61588 89795 811 + 50688 69541 812 + 93760 44529 813 + 75094 96101 814 + 68976 86835 815 + 46278 50980 816 + 97836 44529 817 + 17576 32708 818 + 48519 46071 819 + 72647 93653 820 + 54724 34155 821 + 45186 43448 822 + 44529 41828 823 + 90404 86357 824 + 63175 44529 825 + 88381 25963 826 + 32140 23537 827 + 43348 36423 828 + 41733 88912 829 + 84065 98953 830 + 20389 96101 831 + 38749 93788 832 + 37929 35143 833 + 63747 35340 834 + 72249 93653 835 + 98042 59381 836 + 22741 95783 837 + 88124 33425 838 + 16493 44529 839 + 36599 69408 840 + 50436 41563 841 + 67695 86149 842 + 89091 20022 843 + 60708 92607 844 + 28750 68830 845 + 80224 39113 846 + 34580 96101 847 + 79688 34798 848 + 14870 68189 849 + 47719 29252 850 + 57652 33458 851 + 65541 87987 852 + 86435 19794 853 + 95204 81239 854 + 43800 50980 855 + 94063 11644 856 + 24096 36588 857 + 36628 95478 858 + 81443 17329 859 + 61221 57166 860 + 52782 78294 861 + 16740 31274 862 + 68369 45653 863 + 28895 44529 864 + 39222 65582 865 + 97201 77602 866 + 81119 11644 867 + 41083 50141 868 + 72917 25255 869 + 46148 21269 870 + 44495 18020 871 + 99464 90525 872 + 67254 58381 873 + 52750 28135 874 + 63899 55754 875 + 14617 50713 876 + 36962 50713 877 + 41322 73436 878 + 22504 38709 879 + 72577 39875 880 + 67799 68830 881 + 68284 71156 882 + 46011 61967 883 + 50367 31808 884 + 45832 87987 885 + 88775 87987 886 + 32562 26340 887 + 43756 49887 888 + 73444 16547 889 + 67302 92449 890 + 22133 85451 891 + 17768 77868 892 + 69281 39885 893 + 87364 25255 894 + 41209 27363 895 + 37792 77868 896 + 66667 73746 897 + 22195 28090 898 + 65037 37556 899 + 28634 89795 900 + 23901 50674 901 + 40511 95801 902 + 47779 45253 903 + 76489 86807 904 + 77873 66992 905 + 87523 35509 906 + 32876 50980 907 + 62342 50980 908 + 84222 41563 909 + 88205 40382 910 + 78856 20051 911 + 97888 68189 912 + 22233 17329 913 + 35868 81437 914 + 80155 93653 915 + 82730 78294 916 + 12733 19794 917 + 55038 26258 918 + 50682 23250 919 + 42043 74279 920 + 54719 71512 921 + 54474 23991 922 + 61776 25255 923 + 55564 41563 924 + 39404 31274 925 + 94954 14475 926 + 76258 89795 927 + 87689 67995 928 + 65619 59930 929 + 41846 17435 930 + 21990 22185 931 + 60161 53026 932 + 44955 57523 933 + 84178 39875 934 + 32693 87987 935 + 19125 44529 936 + 96731 93653 937 + 98080 44529 938 + 72947 95746 939 + 67285 23344 940 + 78101 77580 941 + 43064 11644 942 + 81350 23483 943 + 46937 11644 944 + 97686 79381 945 + 66339 60744 946 + 39269 50674 947 + 61837 77868 948 + 97647 86995 949 + 44613 93568 950 + 73127 68830 951 + 64048 80370 952 + 15530 87987 953 + 63926 51860 954 + 95853 91981 955 + 26155 28090 956 + 82222 19794 957 + 10035 87445 958 + 16445 93653 959 + 67972 15558 960 + 51780 68830 961 + 52358 31274 962 + 83942 60096 963 + 64899 11955 964 + 56009 96101 965 + 42288 36590 966 + 53349 65322 967 + 76255 50713 968 + 53044 26351 969 + 37184 31274 970 + 24813 19028 971 + 62309 52490 972 + 93607 19028 973 + 27423 45568 974 + 26128 78294 975 + 72691 50141 976 + 42162 60052 977 + 78247 10613 978 + 80209 31808 979 + 38310 93653 980 + 59228 47607 981 + 24897 23559 982 + 55176 37760 983 + 33062 53324 984 + 26521 39170 985 + 93209 68189 986 + 89881 23559 987 + 11418 50980 988 + 16884 78294 989 + 31995 50980 990 + 17858 98671 991 + 49107 96101 992 + 50512 54526 993 + 56890 65322 994 + 76173 65309 995 + 51569 52845 996 + 73919 23537 997 + 62591 16739 998 + 53735 79935 999 + 14454 69804 1000 + 19976 46609
+92
2024/day_1/src/main.rs
··· 1 + #![feature(test)] 2 + 3 + extern crate test; 4 + 5 + use std::{collections::HashMap, fs}; 6 + 7 + fn part_1(left: &Vec<u32>, right: &Vec<u32>) { 8 + let mut diff: u32 = 0; 9 + for (i, l) in left.iter().enumerate() { 10 + diff += l.abs_diff(right[i]); 11 + } 12 + 13 + println!("Part 1: {diff}"); 14 + } 15 + 16 + #[derive(Debug, Clone, Copy)] 17 + struct Occurences { 18 + left: u32, 19 + right: u32 20 + } 21 + 22 + fn part_2(left: &Vec<u32>, right: &Vec<u32>) { 23 + let mut mapped = HashMap::<u32, Occurences>::new(); 24 + for (_, l) in left.iter().enumerate() { 25 + let v = &mut mapped.get(l).unwrap_or( &Occurences { left: 0, right: 0 }); 26 + mapped.insert(*l, Occurences { left: v.left + 1, right: v.right }); 27 + } 28 + for (_, r) in right.iter().enumerate() { 29 + let v = &mut mapped.get(r).unwrap_or( &Occurences { left: 0, right: 0 }); 30 + mapped.insert(*r, Occurences { left: v.left, right: v.right + 1 }); 31 + } 32 + 33 + let reduce = mapped.iter().map( 34 + |(num, occurences)| { 35 + num*occurences.left*occurences.right 36 + } 37 + ); 38 + 39 + let similarity: u32 = reduce.sum(); 40 + 41 + println!("Part 2: {similarity}"); 42 + } 43 + 44 + fn parse_input() -> Option<(Vec<u32>, Vec<u32>)> { 45 + let input = fs::read_to_string("./input.txt").expect("Couldn't read file"); 46 + 47 + let (mut left, mut right) = input.lines().map( 48 + |l| { 49 + let mut split = l.split_whitespace(); 50 + let left = split.next(); 51 + let right = split.next(); 52 + 53 + ( 54 + left.unwrap().parse::<u32>().unwrap(), 55 + right.unwrap().parse::<u32>().unwrap() 56 + ) 57 + } 58 + ).collect::<(Vec<_>, Vec<_>)>(); 59 + 60 + left.sort(); 61 + right.sort(); 62 + 63 + Some((left, right)) 64 + } 65 + 66 + fn main() { 67 + let (left, right) = parse_input().unwrap(); 68 + part_1(&left, &right); 69 + part_2(&left, &right); 70 + } 71 + 72 + #[bench] 73 + fn full(b: &mut test::Bencher) { 74 + b.iter(|| main()); 75 + } 76 + 77 + #[bench] 78 + fn input_only(b: &mut test::Bencher) { 79 + b.iter(|| parse_input()); 80 + } 81 + 82 + #[bench] 83 + fn part_one(b: &mut test::Bencher) { 84 + let (left, right) = parse_input().unwrap(); 85 + b.iter(|| part_1(&left, &right)); 86 + } 87 + 88 + #[bench] 89 + fn part_two(b: &mut test::Bencher) { 90 + let (left, right) = parse_input().unwrap(); 91 + b.iter(|| part_2(&left, &right)); 92 + }
+1
2024/day_3/.gitignore
··· 1 + /target
+54
2024/day_3/Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "aho-corasick" 7 + version = "1.1.3" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 10 + dependencies = [ 11 + "memchr", 12 + ] 13 + 14 + [[package]] 15 + name = "day_3" 16 + version = "0.1.0" 17 + dependencies = [ 18 + "regex", 19 + ] 20 + 21 + [[package]] 22 + name = "memchr" 23 + version = "2.7.4" 24 + source = "registry+https://github.com/rust-lang/crates.io-index" 25 + checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 26 + 27 + [[package]] 28 + name = "regex" 29 + version = "1.11.1" 30 + source = "registry+https://github.com/rust-lang/crates.io-index" 31 + checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 32 + dependencies = [ 33 + "aho-corasick", 34 + "memchr", 35 + "regex-automata", 36 + "regex-syntax", 37 + ] 38 + 39 + [[package]] 40 + name = "regex-automata" 41 + version = "0.4.9" 42 + source = "registry+https://github.com/rust-lang/crates.io-index" 43 + checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 44 + dependencies = [ 45 + "aho-corasick", 46 + "memchr", 47 + "regex-syntax", 48 + ] 49 + 50 + [[package]] 51 + name = "regex-syntax" 52 + version = "0.8.5" 53 + source = "registry+https://github.com/rust-lang/crates.io-index" 54 + checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
+7
2024/day_3/Cargo.toml
··· 1 + [package] 2 + name = "day_3" 3 + version = "0.1.0" 4 + edition = "2024" 5 + 6 + [dependencies] 7 + regex = "1.11.1"
+6
2024/day_3/input.txt
··· 1 + <;'mul(234,359)who()-who():where()}%what()(when()mul(260,344)}[$*{&from()?]>mul(87,298)what()&+)who()(!#!when()mul(407,173)who(952,771)how()@!?what()]#mul(763,519)'from()$when()%mul(258,409)<)mul(703,155)who()who()<!!mul(423,685)%<?what()how()!,mul(647,758){'mul(595,333)';mul(228,760)~what()@when()who(617,201){{mul(403,912)when()-}(^[^;mul(513,464)where()mul(154,341),$~#^/ mul(469,16)^mul(328,795) from()what()who()when()from()mul(547,469)how()}<?#(/mul(365,823)where();]^^@{(mul(211,19)from()?-+?;@how()where(921,941)mul(816,990)/#)<when():<:'mul(698,62)&~@)+^&$mul(485,158)why()<when(),how()>when()-^}mul(736,421)^<^@?]#;mul(817,275))do()from()how()@where()<@mul(909,873)]:don't()!}&%why(418,225)}-(#mul(212,255)%} ;!]mul(707,897)how()$mul(837,220)when()(,-:+mul(560,935)mul(932,628)when()$&[mul(860,85)&where(){;*:mul(189,383)#'mul(219,523)(who()mul(950,9)';/mul(388,844):~,mul(66,658)where()what()&$&mul(871,390):-mul(587,687)?what()mul(905,131)]what()/+don't()->when()];<select()-where()mul(926,945)'mul(180,934)!don't()mul(736,865)//%mul(662,142)^+>where()'mul(108,216)@?]:mul(222,569)from(961,743):$&-/when()*where()@mul(669,307)$&]who(719,188)>#how()< mul(902,394)when()-^:mul(949,576)@mul(193,521)mul(319,755)?where()mul(494,883)(,>@where(533,792)/mul(579,616)&+?how()~select()mul(840,737)why()-+select()/how(313,74)//where())mul(895,693)from()<don't()mul(984,889),)}who()mul(233,534): ^&~;/<mul(257,146)'( -#!from()]^mul(870,750);select()-how(155,90)why(315,964)mul(298,2)$,how()!@from() #what()#mul(977,312)$&{!who():+$:mul(544,624)from()/mul(404,459)$:?}(@<@what()mul(607,342)who()@how()who()]mul(182,480)'what():@%>*~#mul(410,170){*{where()~~why()}who()mul(796,85)'+&^-)mul(603,101)who()*who()when()@when()where()%/mul(925,329) who()[& ] mul(788,146):^mul(959,154)#{;select(),:^+(from()mul(763,850)/+?mul!,&'what()from())+mul(241,655)>'^/)>why()who();mul(431,988)$from()mul(289,336) &how()what()mul(225,551)when(465,383)&!?['&when() %do()* when()#mul(677,661)what()?mul(688,941),!what(),who()?(who()mul(954,807)!'why()mul(414,536)'who()mul(614,164)mul(941,169){>:mul(755,577)@;!'^@{+mul(640,716)from()from()!where()where(503,241)(&mul(155,305)>([when())select()who(),>,mul(624,695);,what()[]select()!where()who()$mul(100,414)]where()how()!^:who()do())mul(116,506){<%/mul(922,523);why()&mul(850,674)[>^<$;select()what() mul(671,568))why()~?**[*how()mul(920,910)^^-@what()mul(783,710) ]#who():who()mul(492,190):%<how()mul(432,182)[%?mul(758,818)%+!@~mul(241,233)^mul(557,142)^?where()what()why()mul(400,622)%)$mul(251,504){#>+&+(how()#mul(771,755)~mul(709,707)<$[<~}why()[what()[don't()%(^mul(987,332)-]%+]<}who()!mul(144,70)~;*<:mul(218,330);*}what()who()mul(334,779)[@select()where(631,792),)mul(508,632))%;!what()select())>mul(411,371)(?who()select()>?:mul(526,934)mul(804,300) 2 + *+!#-select()where()mul(91,61)$'#&who()where()[,)who()mul(995,486)~(from()]mul(395what()[%from()'%mul(3,116)$-;>why()mul(80,100)don't()+<{mul(40,909){,from()-from()}*mul(5,637)~#don't()>{)#?~mul(710,464)mul(574,738)),'mul(529,787)])how()<who()?*/:#mul(989,869)]how(96,728)+?what()where()])mul(725>,':+<{}mul(805,948)#&!do()#>who()()mul(741,273)mul(183,374)@#{~from()+from()-#mul(155,454)^@#%+<[^{where()mul(24,698)^~!what()don't()^mul(807,271){*;#?&^;from()<mul(210,40):why()*^!$/@mul(392,727)!]:;[?>how()mul(95,214)>select()#~why(152,808)] do()mul(242,354){mul(118,780)<where()mul(237 what()/mul(943,660)mul(238,123)<+}#what()&+where()!mul(850,209):'*select()mul(832,641)mul(374,249) {*{>'@ )?mul(6,158)when()how())[#select()^+<mul(757,651),why()}(#!mul(113,873)-%!mul(157,958):don't()}where()where()why()?!mul(596,489)*from() &&mul(699,920)mul(528,834):^how()+$mul(766,867)*#do()&mul(548,545)(/,*$mul(65,784when(360,503)}from()mul(715,419)what()#/mul(629,49)# who():~mul(362,297)<<from()mul(355,704)>}[;how()[who(101,571)why()><mul(840,568)&,&from()don't()when()mul(706,400)}:'mul(745,820)from(){where()?/!~mul(520,697)*#when()mul(428,711)mul@how():who()*@%];mul(516,414)where()-how()]*;mul(669,963)~from()]select()how()(mul(723,742):,what();}& why(274,391)>mul(791,364)who(683,177);mul(590,613)from()when()why()*:mul(440,124)who(82,539)how()-*%' ,when()&mul(566,425)-;*//(how()<*don't()<%?!{%why()$>mul(37,637)(what()(]<':mul(591how()when()$>$:+#mul(919,784)>*}select()} mul(9,439)';{from()mul(774,58)!%':from()mul(382,161)/when()select(){>#%&mul(434,502)^&/(why()}when()why()from()mul(407,807)'<*{#mul(506,544)],+'[mul(288,577;}>+@who()(mul(684,3)>#mul(878,375){ mul(868,218)why(){mul(738from()+!who()&mul(226,71)from():-where(898,603)/$mul(429,484);}(&-,(]mul(373,23)+,mul)!who()where():;select()how()mul(619,655))mul(572,765)</-mul(422,415)select()how()/)how()mul(691,406);% [what()(from()mul(46,308)$where()'!mul(882,592)when()what(736,407)(why()?(< /-mul(42,917)mul(86,993)~~mul(243,489)*+:from()^who(777,604){[mul(54,523)}mul(675,809)}how();who()mul(52,681)${:who()mul(124,290>?;:&why();%(mul(662,820)from()when()+mul(451,488)* /mul(833,260)'mulwho()#]how()from()*@mul(796,371);{{@^<;~mul(82,742),who()[?:'what()do()@}-}mul(466,182),select()$}{^~how()^mul(263,924)?{??mul(979,300)/:*!mul(85,685)>mul(289,416why()?++$%}{mul(519,250)#&/mul(42,521)what()mul(665,935)where()>~<)who()[mul(457,738)-'$mul(459,702)$;~{;+mul(36,315)mul(881,516)*#$~from()why(967,755)mul(569,650when()>~!:*%&don't()}(^who() ~how()mul(84,748)how()mul(362,548)select()/:%mul(30,445%;;/(}who(971,849)<?^mul(688,9)when()mul(848,69),]mul(109,183)mul(764,444)[(]{[^(mul(505,559)%[mul(470,217)$@select()*why()$ mul(374,21)~what()[}who(); @}mul(387,945)how()),mul(990,737)where(),~*mul(947,938)[mul(603,229)#when()who()*select()mul(852,493)mul(537,342)mul(442,380]],$mul(122,335) 3 + -mul(510,616)mul(235,612><#}who()+?(mul(367,39){};mul(435,762)from()&<?,~select()#where()mul(465,421)'where(608,591)+&when()mul(422,877)$)/#)?{why()(mul(184,55)(select()[&mul(92,651);when()#*[mul(527,555)mul(208,942)({)how()[select()[who()do(){*who()-/$@mul(427,566)where()!&[when() mul(512,215)[select()[where()$how()'where()mul(725,463);#select()don't(),-~+when()%mul(174,734&?mul(929,59)#<what()~$/(mul(184,5)%{}mul(121,138)?where()mul(840,231)}mul(13,563)}?what()why()*>mul(967,363)what()-select()how()!select(),what(){mul(678>what()what()where()mul(32,798)(where(994,20)mul(657,41)when()select(949,914))^mul(790,381)where()mul(854,543)mul(133,378)%how()select()/from()mul(629,798)}mul(371select()do();/where()#''mul(218,299)$^from() ' +why()mul(401,872)!/select()mul(824,807^[mul(992,848)from()%what()when()(-(,mul(453,186)how()who()mul(320,220)who() why()mul(445,909)^>mul(535,611)who()%what()<&mul(760,213){mul(842,923)}'what():when()%where()--do()when()where(732,868)when():why()'why()why(242,296)#from()mulwhen()}{-'>}!why()mul(820,582)~mul(661,206)({don't()select()+when()*:who(544,855)$from()mul(463,28'<](who()mul(851,538)}#]who()who():from()#%mul(320,395)!/when()~$#{+-mul(822,348){)((what()}$mul(396,562)mul(597,851)mul(164,858):!>]mul(421,774)+(mul(302,479)@$mul(393,48 /)}who()@why()+$(mul(94,468))#from()mul(97,244)'?>-how()mul(801,524)+*mul(798,793))!where()~?*mul(803,188) ~when()''mul(276,321(select()do()$&]what()why(224,253)>>$&~mul/*-@'?!mul(273,411)when()-@;why()[when()mul(911,533)!+^how():@from(177,840)@from(951,534)?mul(870,233)from():when()who()where()who()mul(199,165)mul(807,41)what()'~**:mul(487,78)}};mul(392,620)^{why()*<?-when(542,189)mul(531,837)how()]{?mul(798,614)mul(864,588)what(856,979)+~,}select()?&mul(659,85)>who()&(who()~when()#how()!mul(22,783)?select()[&why()select()^mul(671,865)mul(927,45)*#;;how()&mul(519,741)mul(656-what()select()?where()mul(214,386),why()how()mul(924,777)why()%^ &when()what(998,86) [do() -:?how(235,349)%mul(567,616)from()from()mul(665,710)-:*+select()when()[do()[$from()-$%mul(113,895)#-][&when()#where()><do()(!mul(797,837)select()mul(524,378){>%when()mul(914,804)'why(88,694)]]}mul(52,954))why()don't(){[[>@-mul(988,821){],?'how()%:mul(448,457)+ who()?who()mul(62,38)^&>#*?mul(464,719)mul(251,921)mul(82,764)}*#mul(150{+who()+mul(659,141)}select()>why()/mul(270,268)how():mul(523,786);how()+why(685,187)mul(607,577)?(:mul(510+&!&$why()mul(263,702)from(),<^mul(679,458))'/!&do()select()mul(174,946);! :''mul(876,163)%what()/mul(182,358)-+what()^mul(510,134)>select()*who()mul(538,210)from(),how(362,521)@>select()what()who()why()from()mul(525,17)what()(mul(367,947) ?+mul(602,880)^,select():[why()mul(782,143)}]mul(310,79)mul(693,386),mul+~where()];from()?>where()mul(749,859)select() +,^where()mul(611,689)where())!+!!,:mul(486,599)>how()><where()%when()why()>mul(409,246 mul(220,151){select()where()^mul(168,729)>mul(42,222) ;mul(460,16)/({why()}&mul(378,136){@})mul(713,841where()mul(622,542)who()^}#from()mul(975,695)mul?):]mul(65,736)]from()[(,&#who()from()mul(601,954'~*()<;$> mul(332,193)-~when()/[+,/,#!/usr/bin/perl;mul(507@[how()#'where()why()mul(607,129)@where()*'who()~&mul(48,672) 4 + ;[?-+(@when(618,593)@mul(463,743)@&when()&~;<&mul(78,96)^]mul(857,303);~/select(),mul(980,536)who();#$mul(223,620){ -(where()mul(960,194)+! [((who()@%mul(530,458)~[?'from()%){%mul(547,623)%(:from(622,543),mul(484,923)why()who()&)mul(261,937)what()#>where()from()[)'mul(342,883)who()$mul(630,484)what()mul(29,250)]'%}when()~!&>mul(995,972)when()mul(15,702)(~#[where()mul(965,454)/,who()mul(739,675)@%-how()-what()*'%mul(810,99)when();[ #mul(22,38)+don't()~[#who()/mul(17,38) why()mul(778,682)how()@?<when()<%mul(695,791)&+%?-where()>[#~mul(780,237)#what()'mul(338,796)$what(825,687),><</how()<]mul(593,291)-:mul(107,558)&from()select() ,how()*[how()mul(811,501)*~(}[{@/,$mul(588,893)--select() ,*mul(291,200)@mul(380,703);~why()how()where()?-how()[mul(746,5),~-mul(271,992)*$*when()mul(626,216)(how()!<how()' how()mul(648,45) {(,what()where(946,541)}#mul(144,262){-#)when()~^mul(515@where()$ +]mul(357,55)^[)mul(404,638){mul(917,462)why()mul(826,942)what()$;][who()what()how()mul(829,811)~what()~when()-)mul(288,652) /who()mul(326,472),))mul(86,683)$/select()/$}where()-)+mul(561,359) '<)mul(304,38)select()>/+@^mul(885,827)?[ why()^when(364,10)>&mul(852,590)^<when()why()why(),~mul(311,677)*mul(707,282)when()mul(19,241)mul~:>/how()%from(699,716)mul(680,396)[!%}select()when(463,111)~who()#mul(363,227why()@,mul(487,707)how()[{+/what()'[}[mul(975,629)>>++{[$mul(336,79):from()mul(707,55)#)select()*<who();mul(602,976)mul(949,866)what()when()mul(72,693)+/$*(from():where()'{mul(202,519)%'mul(773,650)&}[when(): #(&mul;+/!##?why()mul(369,77)from()}#(,]who()>]mul(992,868))where()mul(106,687): $!where()mul(744,983)how()!mul(313,790)(+))]select()*!>:mul(210,868)+;why(672,934)how()when()why()>%]/mul(108,885)&/{how()mul(159,898),()who(),when()?<#mul(188,958):from(636,533)+&<*[select()how()mul(152,658)who()*;mul(477,718)when(720,25)!who(){&mul(795,952)select(435,575);!/how()select()^select()mul(281,344)from()$<>*:!mul(830,180))(select()how():&mul(397,50)*mul(413,309)where()~,/,mul(796,87)*<~&!(&don't()select()( what(709,443) &who()']mul(445,518)^:mul(655,75){from()mul(377,846)where()mul(321,815)mulfrom()>mul(937,444)where()?}how()mul(112,471)what()>%when()where()who()<$mul(318,492)-what()mul(78,20)select()?mul(851,874)&!#;select():?'^*mul(598,757)mul(326,573){/[%,why();mul(445,682'(who()^+why()why()from()mul(816,284)*%&^'^)>mul(274,211)@*,'^(mul(592,927) ;!~&how()~mul(195,155)mul(896,831)what()()+#who()&*mul(708,134}^who()where()&[mul(138,384)+select()who();where()-?&[mul(767,907)*mul(436,412);[;)-{#(where()mul(987,536)don't()#?mul(616,255)+]:when()when()}#mul(41,533)#^>from()<how(290,301)mul(63,747)what()(+;^,#who()how():mul(249,969)select()+ mul(387,732):+{what()~:!select(67,813)mul(788}!;:*where()<mul(291,542)why()('^&where()]/how()&mul(605,763)-]-why(),@mul(556,282)how()'>!what()mul(151,867);/]select(),mul(754,334)&:mul(97,118)select()mul(593,702) 5 + &*don't()]select()from()where()[mulwhen()^^/from()&mul(461,659)&mul(643[mul(572,503)mul(588,137){;mul(849,301)who()how()%;why()who()mul(233,687) why()*do()+who(),#how()( -mul(650,3)^+mul(14,551)who()^#? !<from()]mul(912,640)!?where()*%mul(328,45)/how();;where()(mul(843,155)who()what())?%what()what()@mul(923,667)) @how())+who()-mul(503,43)when(530,489)why()from()&select(617,173)what()mul(471,175>~>-mul(628,710)%;why()<('$&:when()mul;why(155,340):^+where()/[%@mul(931,55)%(~:why()from()mul(715,482)!{mul(766,239)how()mul(284,603)>where(897,837)mul(530,610),;-why()<select()/]!mul(389,108)'[~#mul(230,503)^)%~^how()^(&mul(216,268):mul(190,552$</who()!select()]do()}what()mul(144,685)%(don't()/[where(),>^}select()(mul(470,194)from()*,who()!mul(394,768):from()?{$ ;@~mul(571,519) what()[:mul(65,328)where()>~where()< :#mul(490,774)'why()>,@<mul(945,164)?,select()from()]mul(191,618);') #mul(984,94)^^mul(764,343)[!~?%why()-select()mul(802,97)#why()when()~,<?mul(817,989)![>mul(588who()}!-'mul(35,602)+ -%[' how()]:mul(502,722):why()!!mul(332,723)!{ ,[}{^who()don't()&@[when()>'mul(695,738)select()how()do()what(635,547)};>mul(50,148),,,mul(974,330)mul(973,477)+>mul/<how()why()])[+where()mul(727,316)&}#*];(~+do()>when()mul(74,42),how()who():,what(182,526)>mul(301,319)from()*how()#mul(808,632)don't()%- ~mul(671,835)who()}&mul(330,88)){+when()&who()<$who()where()mul(653,324))(select(){/!*select())<mul(933,167)/::?+~*how()mul(266,2):**!)what()mul(491,655)}?mul(949,984)~(,who()%mul(254,681)who()%from()-;from()?%{)do() [{mul(570,36)):^;{-who()<mul(820,352)/,>select()mul(800,74)mul(780>~where()[)/why():+mul(95,301)+#~-]^< mul(453,169))!)-who()}select()!/+mul(514,816)'>,)mul(188,237)'(*><<who()why())how()mul(738,289)what(639,365)$</]~'}what()when()mul(102,510)mul?!/%why()-why()who()where()how()don't()who()who()&',~%*where()mul(790,751)@;]mul(699,591)from(10,889)'from();~?%'mul(501,173)):mul(92,868)~>#@from()$&[mul(896,181)+why()[/}mul(292,818):what(933,189)when()where()+when(),how()mul(325,460)*!'?$}why()mul(868,19)]>do()]]'@-select()+?:,mul(705,664)why() :when(320,386):]where()mul(101,603)from()mul(584,674){*why()mul(527,341)mul(314,923),&*!#don't()from(),&: mul(610,911))(!when(12,857)how()&}/don't(){from(872,604)[]}}$when()from(393,26)mulwhy()why()from():;] }mul(618,762)who()>#' <-@why()#mul(342,769)#'-&<:from():>*mul(995,557)[':&when()&don't()%+}:who(699,463)}?mul(949,652):why()#'what()mul(466,912)how() ~where(){?mul(498,589)-:]}*(<?&mul(922,310)mul(469,882when()who()#{mul(553,266)!;&(%select()?#@how()mul(84,210)from()where():mul(7,362)~?{$~!:why()^mul(770,657)]%#mul(601,370)how()?#mul(81,96);who(){mul(519,362)what()} ##:~>mul(554,92)select();~how()&#mul(296,200)$why()why()don't()mul(718,92)[select()*?:where()mul(868,217)when()'what()]mul(608,255how():*~when()!:%{how(720,870)mul(857,876)+[how()select():[mul(926,987)why()]select()don't()%?,/&][]>^mul(20,520)mul(970,495); ?from(971,165)+@'{>mul(541,168)mul(697,290)/mul(724,20)/@/how()when()select()(]why()do()-(mul(250,857)}~<mul(670,830):mul(37,452)#%</who()@why()mul(258,824)'-^+#}how(683,511)from()who()mul(572,263))(mul(516,90)&# }where(161,891)$?>mul(612,107):>'}+{(@<mul(410,789)'@mul(41,356) 6 + how()who()from()why()&+'what()+mul(948,970)how()^^ what()what()mul(124,952)#?why()']?when()mul(559where()$/<}#mul(683,315),{*mul(835,821)@%{who()?mul(528,442)#{/+!#>&?mul(264,859):'{;+]who()-mul(671,460)}how()when()[{mul(383,254) !mul(3,918)mul(874,303)!@mul(279,457)why()*>from()do()#/?<mul(522,927)what()[)what()~~how()when()}>mul(567,487)<what()?,][*}mul(390,810)![why()$who()mul(632,35):~ ',mul(741,335)[how()+>]*&don't()(who()}'mul(522,610)when()${{]#'mul(311,306);{^{ '[mul(270,712)@'}%why()#~:^what()do()>mul(6,137);from()-*%,;~<mul(123,497)mul(47,167>how();+ from()[?&how()]do()~who())& &;%why()why()mul(742,979)$}#,what(609,482)^mul(506,252) -:what(362,209) who()mul(399,346)%'&?mul(229,623)!)how()~mul(436,283)!)@how(){?mul(237,965) #>mul(594,38)^-mul(516,90)who(441,355)[+from()/how()mul~%[mul(434,408)where(690,778)when(978,434)>]?what()[mul(907,397)?@do()?@,select()who()-%(]where()mul(36,78)(:+when()select()mul(477,631)[#when()}mul(45,264@who()select()(mul(656,657)]select()how()[))from()mul(444,181)]!+select(36,597){*who()!/ mul(543,648)from()from()from()$when()+-} mul(293,90)who(183,746)mul(872,855how()[!>~from()*?'<mul(449,852)$:why()!+mul(71,240)?@#}:where()+from(){mul(191,72)@&^&({from()mul(981,127)?&how()[}mul(78,213)*&where()when()^what()@&%mul(149,819)@why()from(376,630) when()+don't()(><] mul(664,827)'-from()#*]mul(912,740)'from()when(473,160)mul(459,94);do()?:, ],{mul(322,110)}>where()}when()when()mul(443,449)where()#}~]mul(94,385)where()>do()<*:@##?what()'mul(63,18)[mul(414,464)>do()what(858,375)%}<'^!*mul(855,863)(mul(557,951)select()$what()+?%/ ]mul(805,186)^who()'mul(549,457)mul(604,658)select()!*~mul(508,395)where()+~]^mul(404,113)*)&$-'where()mul(428,314)$($(%$/,?where()mul(33,256)?mul(199,365)&select()when()>what(111,916)from()mul(588,754)(},@-+who()when()mul(828,506)&select(),select()who()#mul(689,772)$-&@+~what()mul(96,741)}?{-where()when(891,721)~do()*#<%who()^&;#how()mul(365,858)*$mul(903,693)who(385,109)what()'%}'mul(27,403)who()mul(874,113)( ,-@@mul(260,787)@why()*from()mul(679,437)?why()from()-what()mul(240,527):,from()>#[$do()}what()]mul(632,184)&)[?when()mul(70,409):[^-where(585,55)]%^mul(779,948)?$}from();[+?mul(964,869)-?^when() [ mul(729,356)how()({>]+ why()how(908,783)from()mul(774,617)!how()')*;]mul(484,579),#select()&why()mul(873,5)(/(@mul(573,802)what()<(<*mul(759,343)?mul(301,853)when()][) don't()?+from()mul(556,868)?$how()@>*when()<:$don't()/<^)/what()!mul(434,251)mul(882,866),mul(744,572)(why(112,504)$-how()mul(154,96)mul(201,94)$[:@&%-,>!mul(188,433)!*?mul(546,999)%&@>*/mul(310,391)-<+{]mul(938,579)+,@%[why()why(75,712)+from():mul(472,593)^mul(733,69)why())mul(961,406)~@$* )-from()mul(932,700): %!mul(382,321)!mul(297,196)where()mul(444,227)what()where())^#who()from()-mul(65,99)$:why()mul(652,486)mul(446,486)mul(970,630)$~]mul(510,304)]*:>how()/}$
+112
2024/day_3/src/main.rs
··· 1 + #![feature(test)] 2 + 3 + extern crate test; 4 + 5 + use regex::Regex; 6 + use std::fs; 7 + 8 + enum Value { 9 + Flip(bool), 10 + Mult(usize, usize) 11 + } 12 + 13 + fn part_1(input: &Vec<Value>) -> usize { 14 + let sum = input.iter().map(|v| { 15 + match v { 16 + Value::Flip(_) => { 17 + 0 18 + }, 19 + Value::Mult(a, b) => { 20 + a*b 21 + }, 22 + } 23 + }).sum(); 24 + 25 + println!("Part 1: {sum}"); 26 + 27 + sum 28 + } 29 + 30 + fn part_2(input: &Vec<Value>) -> usize { 31 + let mut enable = true; 32 + 33 + let mut sum: usize = 0; 34 + for value in input.iter() { 35 + match value { 36 + Value::Flip(b) => {enable = *b}, 37 + Value::Mult(a, b) => { 38 + if enable { 39 + sum += a*b 40 + } 41 + }, 42 + } 43 + } 44 + 45 + println!("Part 2: {sum}"); 46 + 47 + sum 48 + } 49 + 50 + fn parse_input(input: &str) -> Option<Vec<Value>> { 51 + let mul_regex = Regex::new(r"mul\((\d+)\,(\d+)\)|(do\(\))|(don\'t\(\))").unwrap(); 52 + 53 + let caps = mul_regex.captures_iter(input); 54 + 55 + Some( 56 + caps 57 + .map(|cps: regex::Captures<'_>| { 58 + let t = cps.get(0).map_or("", |m| m.as_str()); 59 + match t { 60 + "do()" => Value::Flip(true), 61 + "don't()" => Value::Flip(false), 62 + _ => Value::Mult( 63 + cps.get(1) 64 + .map_or(0, |m| 65 + m.as_str().parse::<usize>().unwrap() 66 + ), 67 + cps.get(2) 68 + .map_or(0, |m| 69 + m.as_str().parse::<usize>().unwrap() 70 + ) 71 + ) 72 + } 73 + }) 74 + .collect::<Vec<Value>>() 75 + ) 76 + } 77 + 78 + fn main() { 79 + let file = fs::read_to_string("./input.txt").expect("Couldn't read file"); 80 + 81 + let input = parse_input(file.as_str()).unwrap(); 82 + part_1(&input); 83 + part_2(&input); 84 + } 85 + 86 + #[bench] 87 + fn full(b: &mut test::Bencher) { 88 + b.iter(|| main()); 89 + } 90 + 91 + #[bench] 92 + fn input_only(b: &mut test::Bencher) { 93 + let input = fs::read_to_string("./input.txt").expect("Couldn't read file"); 94 + 95 + b.iter(|| parse_input(input.as_str())); 96 + } 97 + 98 + #[bench] 99 + fn part_one(b: &mut test::Bencher) { 100 + let file = fs::read_to_string("./input.txt").expect("Couldn't read file"); 101 + 102 + let input = parse_input(file.as_str()).unwrap(); 103 + b.iter(|| part_1(&input)); 104 + } 105 + 106 + #[bench] 107 + fn part_two(b: &mut test::Bencher) { 108 + let file = fs::read_to_string("./input.txt").expect("Couldn't read file"); 109 + 110 + let input = parse_input(file.as_str()).unwrap(); 111 + b.iter(|| part_2(&input)); 112 + }
+1
2024/day_4/.gitignore
··· 1 + /target
+7
2024/day_4/Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "day_4" 7 + version = "0.1.0"
+6
2024/day_4/Cargo.toml
··· 1 + [package] 2 + name = "day_4" 3 + version = "0.1.0" 4 + edition = "2024" 5 + 6 + [dependencies]
+140
2024/day_4/input.txt
··· 1 + XASXMAXXMSXXSMMSXMMSMXSMXMSSMSSSMMSMAMXMXSMMMMAXAMXSASXSSMMSSMXAMXMSAMXMMXAXXXSAMXXXXXMMXSXMXXSMASAMXMXAXXMASAMXXXMAMMMSXSXMXMMMSAASXSMSSMMS 2 + XASAMSSMAMMMAMAAAMASMAMAAXMASAAASAAMAMAMAAAAASMSSSSMAXAAAXASASMMMMMMXMASXMAMXXXXSMSMSXSAAXAMXMASMXMMSMSAXSXMMSXSMMAAMXAMAAMMAAAAXMXSAAAAXAAM 3 + MXSXMAAMXAAAXMMSSMAXMASXSSSSMMSMMSXSASMSMSSMMMAAAXXXXMMMMMXXAMMAAAASMMAAAXMASMXXXAAASAMMXSASASMMMAMXSASASASMAXXMAMSSSMSSMMAXSMMSXMMMMMMMXAMX 4 + SAMMMSSMMXXSXXXAAMSMSASXAAXMXXAAXXXMAXAAAXXMASMMMMMMXMXXXXSMXMSSMSASASMMXMMXMAAMASMSMSMAASXSAAAASAXAMAMXAAXMASMSSMXAMMMAMXSAMAMAASXMMSSMSAMX 5 + MASAAAAMSMMMMMMSMMMAMAXMMMMMXMSSMMXMSMMMMMAMXASAXAASXMMASAAXAXAXMXMXMXAASXMAMSXSAMMXMMMMMSAMXMSMSMSMMAMSMXMMASAMXAMMSASAMMXASAMSXMAMXAAXSAMA 6 + SSMXMSMAAMAAXXAMXASMMSMAMXSXSAMXXMAAAAXSXSAMXMASMSXMASXAMSAMXMMMSASMXMXMMAMSMXAMASXMXAASXMMMMXMMXAAXXAMXXAAMAMAMXXXASXSASXMMSAMMASXMMMMMMMMS 7 + XXXXMAMMMSSSMXSXSASXAXSXMASAMXSMXMASMSMSXMASXXMMXMXSAMMXMAXAMAXXSXSAASMASXMXAMXMMMAASMXXAMXMMAXMXMSMSAMSSMSMMSSSSMMMSXMXMASXSMMXAXAXSSSMXAAX 8 + MMXSSXSMXAMAMAAAMSXMXMMXMASXMMSAMXXAAMXSASAMMXXSXMXMASXSSSMXSSMXXMXMMSAXMASMMMSMASAMXMASXSAMSSMSMAAAMAMAXAMAMAMXAXAXSAMXMXAXMMSMMSXMAAAMSAMX 9 + AXMXMASMMASAMXSXMMXSAMAAMXMMMAXMMSMMXMASAMXSXMXMAAMAMSAMAAAMSAMMSXMXSXMXAXMASAMXAXMASXMAMMAMAAASMMMSSSMSSMXSAMXSMSMXXAMXSSMASAMAMMASMMMASMMM 10 + XMAMSXSASASASMXXMAMMAASXSAAAMMXAAXXAMMMMSMSMXMAXMXMAMXAMSMMMSAMASAMXSAMMMMXMMAMMSXXAMAXXAMSMMSMMAXXXMAAAAMAMAXXAMXXSMSAXAAXAMMMAMSXMAXXMSASX 11 + MSSMXASAMXSMMMAXASMSMMAXMAMSASXMAXMMSAXSASAAASMXMASMSSMMMAAXSAMMSAMAMAMMSAMSSSMSAMMSSSMSMXMAXXASXMMMMMMMSMASASXSXMASAXXMSSMMXMXMMMMSAMMXSAMX 12 + MAMMMMMMMMMASAMMMXAAXXMASAAXASMMSXMAXMXSMSMSMSXAMMXXAMXASXMXXAMASAMSSXAAMAMAAMXMASAAAAAAXSSSMMAMASASXXXXMMXSASAXXAAMAMAXXMXSASASAMASAMXAMAMX 13 + MASXAXAMXXSAMMAAXMSMMXMAMXXMMMAAMMMSXMMSXMXAAXXMSAMMSSMMSMMMMAMASAMAXMASXMMMSXAXXMMMSMMMAXAAXXSSMSASMMSAMXXMAMAMXSSMSMSMAMAXXSXSASXMSSMXSAMM 14 + SXMXMSSSMMMASMSMSMAAMASXMMXSASMMXXAMXXASASMMXMAMAAXAMAMAXAASXMMXMMSMXXAXMSXMAXXSSSXAXAAXMMMMMMXAXMMMXAAMAMMMXMAMAMXAMAXAAMASAMASAMXMAMMXSASA 15 + MMMXMXXAXAMAMMAAAMSMMAXAASASAXXXSMSSSMAMXMAMXXASXSMMSMMXSMMXAXSXMAXAMMMXXMAMSAMXAAMSSSMMXAAAAXSAMXXAASMXAASMASXMSSMAMAMMXSAAAMAMAMSMAXSAXAMM 16 + SASASMXMMSXSXSMSMMXSMXXXMMASAXSXMAXAAMMMSSMMMXASXMXMAAXMXMMMXMSAMXSXSASMASAMMSSMMMMAAAXMSSSSMXXAMXMAXXXMSMSAAMAMAMAMMMMXXMMSSMMXAMXXAXMASXSM 17 + MASMMAMSAMMMMAMMXSAMXSMSAMXMMMAAMAMXMAMAMAAAAMSMXSASMXMAAAXSAMXAMAAMSAMSAMXSAMMASAMXSSMMMAMMXXMSMMXMSSMMXAMMXSAMMSAAAAMXAAMAXASXSMSMMSMAMAAX 18 + MMMMMSMMAMXAAMMAAMMXAMMAAAXAXSSXMAMXMAMASMMMXMAAXSASAMSSMSASASXMMMSXMAMXXMMMMXMAMAXAMXAXXSAAASAAAXXXAAMAMAMAAXAMXSASMXSASXMSSMMAMASAMSMMMSXM 19 + SAAMAMAMAMSSSXMMXSSMSSSSSMSSXAAMSXSXSASASAMAMSMSMMMMXAAXAXMSAMASXSMMXSMSMSXSSSMMXMMXSSSMAXMXSXMMAMXMSXMASMMMXSAMAXAXMASMMMMASAMXMAMAMXAXAMXA 20 + SSSMASXMMXMAMXMMAMXAAAAMMAAXAASMSXAAXAMASMMAXAMAAMSAMMMMSMMMXSAMXMAAMXAMAAXMAAXAAMMXMAMMAMMXXAXMAXSAAXSXSXXAASAMAMSMMMXXMXMMSMMSMXSXMSXMXMMS 21 + XAMMAMAMXMMSMMSMAXMMMSMMSMMXMAMAXXMSMSMMMXXMMSSSSMMXMAAAMAXXMMMSXMMMSMAMSMMMSMMSXXASMAMMASMMMAMSSMASMXSAXXMMMXXXMXMXXAMMSASMMMAXMXMXAMXSAMXA 22 + MMXMXSAMMXAXAXMSMSXXAAAAAMSMMXMAMXXAAMASMSXSAAXXAAMAMSSSSSMSXAAXMSMXAMXMAMAMXAMASXXMMMSMMMAMMSMMAMMAXAMAMSXSSMSSMMMASAXASMXAAMXSXAMXMAMXASMS 23 + AXMSMSXXAMXSMMMMXAMMMSMMMSAASAMMMSSMSSXMAAAMXSMXSSMAMMAMMAASXMMSAAXSXSSSSSSMMAMASXAXXASXSSMXAMAXAMXAMMMSMMASXAAXAASAMXMMXXSSMMSMMXSAMSMSMMMA 24 + SMAAAMASXMMSMMXMMMMXAAXASMMMMASXAAAXAXAMSMMMAAAXXAMXXMAMSMMMAXSMMMMMSAAAAAXAXSMMSMMMSAMAXXXMSSMSSSMMSAAXAMSMMMMXSMSASXXSXMMXAXMAAXXASMAAXASM 25 + XMSMSMAMAAAMMSASAAAMSSSXSAMXSAMMMSSMMSMMAMAXSXSXSAMAXSAMXMMSSMXAAXASMMMMMSMMXMAXMASASAMSMMSAMXXMXAAASMSSMMASAAXAXASAMAMMASMXSMSMMSSMMMSMSMSX 26 + MXXMAXASMMSSXMASMMMAMXMAMXMAMAMXAAXMMAAXMSAXMSMASMMSASAXSMAAXAMXMSXXSMXSAAMMAMAMXMMXSAMXMAXMASMSMMMMSMXAMAMXSMSXMAMXMXASMMSAAAMXAXXASAMXAASA 27 + MMSXMMMXMAAXMMXMMMSSMMMAMSMSMSMMSSSSSSMMXSXSMAMAMXAXASMMSMMSSSMSMAXMXSAMXSASASXSSXMASMMSXMMSMMAMXSAXXMXMAXXMAXSAMAMMAMXXSAMXMMMMMSSMMAXSMMMS 28 + MASMSASXMMMSSMAAAAMAAXSSMSAAAAXXAAMAAAMSXMASMXMASMMMMMAAMAMMXXMASMAMAMMSMXAMAMAAXXSASAXMASMASMMMASXXAXMSMSSSMAXMXSMSAXMAMXMSMSXXMAMASXMASAAX 29 + MXXAXAXMXAAMASXXMSSSMMMMAXSMSMSAMXMMMMMSAMAMAMAMXXAASAMXXAMMSSSMSXAMAMXAAMXMSMMMMXMAMXMSXASAMXSMAMMSSMXAAMAAXAXSAMXSASMSMAXAAMSAXASMMASAMMSM 30 + MAMSMSMSXMXSAMXASMMMAMAMMMMXXXAMXAMAMAXSAMASAMSSSSSSSMAMSMSAAAAAMXMSASXMSMSAXXXXMAMXXSMXSXMMSMSMSXMAMASMSMSMMSAMXSXMAMAMSSXMXMXXMAXXXAMASAXM 31 + MASAAMAAXSAMXSSXMASMMMAMXAMAXMMMSMXAMSXSAMAXAMXAAAXMXMAXAMXMMMMMMSXXMAXMMMSASXSMSMMMMSAMAXMAAAXAAMMMXMXXAMXMAXXMASAMMMXMAXXMSSMMASXMMSSXMASX 32 + MXSMMMMMXMASAXAMSAMAASMMSASXSAXAAAMSXMASMMSMSSMMMMMMXSSSXSMMSSMXXSAMXMSMAAMAMAXAAMSSMXAMMSASMSMSMAASMSMMSSSMMSAMXXAMXSSMAMXSASAMXXAXAAMAMAXA 33 + XMXMAXXAXSAMMXSAMAMXMMAAXAAASMMSXSXXAMAMXXMAAAMSAMASMAXAMMMXAAMSAXSAMXSMMSSSMMMSMAAAMSMMXMAXAXAXMSMMAAAXMAXAXSXXAMSMMAAMMMXXAXMMAMSMMMSAMASM 34 + MAASXXMMXMAXSXMXMASMMMMMMXMAMMAXXMAMSMXMAAMMMSXMASAXMMMMMAAMSSMSAXXXMXMAXAAMXAAMXMMSMAAASMMMSMAMAXAMSSSMMMMSMMMSMMXAMSXMASMMSMAMXSXXXXSXXAXX 35 + AMXMSXAMMMSMXMSMSASAXAXXMMMMSMMSSMAMMMMSMSXAAMMSMMXSAAASXXXXAAXMMMSMMASAMMSMMMMXAMAMXMXMMAAAMMXMAMXMXAMXMXMAAAAXXASXMAMSXSAAAMAMXAXXSAMXMXSM 36 + XXAAMSSMAAMXAAAAMXSMMSAMXAAXAAASASXMAAMAAAXMMSAXAAAXXMSSMAXMSSMSAMXASMSMSMMMSMMMSMAXAXSASXMSSXSMMSXSXMSAMSSSSMMXMXSAXXAMAMMSSSMMSMSMSXSASAAX 37 + MSMSMAMXMSSSXSMSSMMXMMXMSSSSMSMSAMXSSXSMSMMXAMXSMMSXXXAXMSMMXMASMSSXMAXMAMAAAAMAXMMMAXMAMAAAMXMAXXMMAXSASMMMXMXSAAXMMMSMAMXAXAMMAAAASAAASXSM 38 + XAAXMMSXMAXXAXMAMAMMMXMXAXMXAMXMAMXAMXSXXXSAMXMXMAMMAMMMXAMMAMAMXXXASXMSMSMXSXMXSAXMSMMASMMMSMSSMMMSXMSSMASMMAAMMSMMSAAMSSMASMMSMSMSMSMAMAXX 39 + MMMMAAMMXSMMSMMASAMAAASMMSSMXMMMAMXAXXSASAMXMASASASAAMAAXMMSASMXSAMMMAAXMAMXMXSXMAMSAMSAXAXMAXAMSAMMAMXXSAMAMMXSAXXAMXXSAMAAMXAXAMMXXXXAMMMS 40 + MASMMMMXAXMAMASASXSMSXSAMAMXMMMSSMSMMXMAMMMSSMSAMXSXMMXSSXASXSMMMMSSSMMXXAMASAMXMAMMAXMXSSMMSMMSMSXMAMMMMXSXMAMMMXMSXSXMMSSMMXSSXMASMSMMMXAX 41 + MAXAMXSMAXMAMMAMXASAMXSXMAMSXSAAAMAAXAMXMXAAAMMXMMMAMSAMXMMMAXAXSAMMAXAMSSXSAMXASXSMXMXAXAAAAAXXAAMASXMAMXSXMASAMSAXASXAXAXAXXMXMMXMASASMMMS 42 + MSSMMAMMMMSSSMASMMMAMXXASMMSAMMXSASMMMSSSMMSSMAXMASAMMXMXMMSMSMMMASXSMXXAMXXAMXXSASAASMSSSMMSMMMMMSAMASASMXASXXAXSAMAMSSMMSXMSSSMMAMSMAMAAXX 43 + XAAXMASASMMAAXSMMSMSMMSMMSAMXMAMAAAAAASMXMMMAMASMMMMSAMXMAAAXAAXSAMAXAXMMMAMAMMSMAMSMMAXAXXMAMMAMXMASXSAAASAMMMSMMAMMMMXXXMASAAAXMASMMASXMMM 44 + ASMMSXSXMAMSMMMAMXSAAMASMMMSXXAMMMMSMMSAASASXMASMASAXMASMMSXSXSMMXMSMSMMXMMSMMMXMAMXXMSMXMASMMXSMMSAMMMMMMMAMAXXASXMSAMXMMMXMMSMMMXXAXAXAMXM 45 + MXXAXXMASMMXSASAMXSSXSASXAXMASXSXMMXXSMMMSASAMAMXAMXSSXXAAXASAMXSAMAXAASMXXAMAMASMSMSXXAMAMAAMAXAMSAMXAMXMSSMMSSMMMMSASMSASXSAMAMSMMSMSSMMAM 46 + MSSMMXSASAASMMSSMAMAXMAXMMSXXMXAAMAAMXXAXMAMXMSSMXSAMXMSMMMAMAMXSASMSSSMAMSASASMXMAASAMSASXSAMAMAMMASMASMXAXAAXASAAXSAMXMMAMMXXAMASAXAMXXSAS 47 + XAAAAAMXSMMSSXXMMXSXMASMSXMASMMSSMMSSMSSSSXSAXXMXAMXXAMASAMXMAMMSAMXMMAMSXXASAMXSMMMMAMXSMAXAMMSMMSAMMXMAMXSMSSMMSAMMMSXSAASXMSSMMMXSAMAASAS 48 + MSSMMSSMXXAMAXMXXAXAMXXAXASMAAXAMMXAAAMAXAASMMSMXMMSSMSASMMMSMSAMMSXMSAMXMMXMXMXAAXAMXMXXXAMASAAAMMASXMMSAMXXAAAXMXSXAXMASXSXAMAAXXAXAMXMMAM 49 + AXAXMXAXSMSSMSMMMMSMMMXXSAMSMMMSSSSSMMMMMMMMXAAXXAAAAAMXMAMAAMMXMAMAXXMXAMAXMASXSMMSSMMXSMSSXMXSMMMAMAAAMXXXASXMMMAMMSMMAMMMASMAMMMMSSMMXSAS 50 + SMSMSXMMMAMXXSAMAAAXAMSAMXAXXMAMXMAAMXAXXSAMMSSMSMMSMMMXSAMMXSAMXAXMMSMSAMXAXXMAMAAMAAAXXAXMASAMMSMMSMMSSSMMMMSAAMAMAMAMASASAMXXMAXAAAAAXSAM 51 + XAXASASAMSMMMSAMSSXSAMASXMAXXMAXSMSMMSMSXSASAMAMXXXAXAXXMAXMAMASXMSAAAXMMMXSMXMAMMMSSSMXMSMMMMXSAAAXXXXAAAXSAAMMSMMXXXAMAXAMXXMXSXXMSXMMXMAM 52 + MAMAMSMXSAAAASAMAMAMMSMXXXMASMXSAAAXXMASXXXMMSXMSMMXSSSSSSSMMSXMAAAMMMSSSSMAAASASAXXAAXAXXMASMMMXSSMMMMMSMMSMXSXMMSAXXSMXMXXXAXAASXXAMMMASXM 53 + MXMAMASXSXXMXSAMAMXMXAMMASMMSASAMSMSSSMXASXSAMXMASAMXAAAAAAMAMXSMMMSXXAAAASMSMSSSXSMMXSXMAXASXAXXMAMAXAXAAXXMASAMAMMSAXAMSAMMAMSAMXMMASMXMMM 54 + MSSXSASXMAXSXSXMAMXXXAXSASAAMMMMMAXSAAMAMAAMAMXXAMMAMMMMMMMMAXXSAMAMXSXMSAMXXMXMMMXAMAMAMSMMSMSMAMSXMXSXXAMXXAMAMXAAMXMAAMASAXMMMSXASAMXAAAX 55 + MXXXMAMAMAXSAMXSXXMXSSMMASMMXAMXSXMMSMMAXMSXMMSMSXSSXXAAXSASXSASXMXSAMXXMASMSMAXAAXMMAXAAAAXXAASMMAASAMASMXMMXSAMSMXSXMAMSAMMSSXMAXMMMSSSMMA 56 + XMXMASMMMXMMAMXXAASXXXAMAMAMSMSMMAAMMXXXMXXAMXAAAASAMSMSSMAMAAMMXMMMXSMXSAMAXMASXSSSSSSMXSSMMSMAMMXAMAMMASAXXMXMAMXASASAXMASAXAMAMMXAMXAAASX 57 + SAXASXAXMAASXMMMXMMAAXXMMXXMAXAAMXSMMSSSMASMMSMSMMMAMAMMMMAMAMXMAMSSXAAAMMMSMMAMAAAAAAAAAXAMAAMMXSAMSMMSAMMMSAMXSAMXMAMMXMMMXMXXAMXXMMSMSMMA 58 + XXAXAMXMSSXMASAMASXMMMSAMSSMSSSXSAMAMXASMAMMASAXMASXMASMASASAXXSAAAMSMXMXSXMXMSSMMMMMMMMMXAASXSAAMAMXMAMAMAAMAMAMAAMMSMMASAAMSASXXSAXAXXAAXS 59 + MMSSSMSXAXAMASASMMAMMXMAMAAAAAMXMXSAMMMMMSSMAMMMMXAXSAXMAMXSXMXAMMXXXMAXXAASXXXAMXMASXMASMMMMASAMSSMMMAXSAMXSMMSXSMSAXAMAAMMSAASAASXMAXXXMXM 60 + SXAAAAAMSSMMAXMMMSAMMXSMMSSMMMMXSXSXMAXMXMAMMSMXMAMXMAMMMMXSAMXXXMXMASXSMMMMMSSMMXMASASMMASMMAMAMAMAAXASAXXXMASMAMSMASXMXSXXXMMMMMMXMASMAMAS 61 + AMMSMXMAMAXMXMSAMMXMMAMMMMAMXXSMMASMSSSMASXMAMXAXSXMSXSAXSAMAMASMMMXAMXMXAMAAAAXAAMMSXMXSMMMMSXXMAMSMSSMMMSMSXMMAMAMMXMXAMXMMXXSXAXMAAAMAMAS 62 + MXXXMAXMMAMXSXMASMSMMASAXSAMXAMAMAMMAAAXAMMMASMMXXAMAASAMMASAMAXAAAMSSMMXSSMMSMMSASASXMXSAMAAMXSMMXAMXAAXAXAXMAMSSMMMAMMSSMAAXXMAMXSMXXMXMXS 63 + XXSASXSSMSSXMXSAMXAASASXXAMXXMSSMMSMMMMMMXASAMMMAMMMMXMMMSAMAMSSMMMSAAAASMXXMAXAAMMMMAMAXAXMMSXMASXMSSSMMXMAMAXMAMAAMXSAMAASMMSMXAAXMAXMAAAX 64 + MMSASAAAAAXMSAMASXXMMAXMXMSASXAXAAMASXXMASMMMSSMMSSMMSAAAMASXMAAMMSMMXMMSXAXSSMMMXAAMMMAXSMSASAMAMAAXMAMSAMXSMXMAXMMSAMXSXMAAASXAMASXAAAXMMS 65 + MAMXMMSMMMSAMXSAMAMSSSXSAAAMAMXSAMXASXXMASAAAAMAAAAAAXXMXSAMMSXMMXAAXSAMXMAMMXMAXMSSSSMMMMAMASAMASMMMXSASXSAXMASMXSAMASXMMMMMMMAMSAAMMSXSAXX 66 + MXSXSXAXAMAXXXMAXAAXAAAAMSMMMSXMAAMXSXXMASXMMSSMMSMMMSMMMMASASAXXSXSMAMSSMMXSAMMXMAAMMASAMXMMMXMMXXMASMMMXMMMSMSAXXAMSXMAAXAXXSMMMXSXAAAMAMX 67 + AMAXMXMSSSMSMMMSXSSMMMMMXAASXMASMMSXMMMSAMAAXXXXXMAXMAMAAXMMASAMXMMXMXMAXMAMXASAXXMXMMASMSMSMMXSMSSSSXXAMMXSAMMMXMSAMXASMMSXMXSXSXMAAMMSMMXX 68 + MMMXSAXMAAAAAAMMAMXMXXSXSSSMASMMMAMAAAMMMSXMAMMAMSMMSSSSSSMMAMMMAAAAMAMXSMMSSMMMSSXAXMAXXMAAXXAASAAXMAXAMSAMXSXMXAMXMSAMXASXSMMMMXXMXXAMASMA 69 + XAAAXMMMMMSMSSSMSMASMASXXXAXAMXAMAXMXMMAMAAMXAAMXSAAAXMXMAMMAXAXXMMAMSXXSAAXAXAMXMASXSMMMMSMSMXSMMSMMMMMAMXSAMAMMMSAMXSMMXXMAAAAMXSXMAXSSMAX 70 + SMMSMXAAXMAXXXXAMXAMMAMXASXMSMSSSSSXSXSMSSXMASXSXSMMSXSMSAMSMMSAMXXSAMXASAMXMSXSAMXMAXAASXMAXXMMXSAMXASAAXASASASAAMASAMXMMMAXSMSAAMASMXMXASX 71 + XAXMASXSMAMMSMMXMMSMMASXMMSMMAAAAAMAXMMMAXXMXXASAMXXMAMAMSMXMAXXMAMXASAMXAXXXAMMAMAMXMSASAMMMSSSSSXMMASMSMMMMAAMMSMASXSAAAAMXAMXMXXMAMAMXSMX 72 + MAMMMMAAMXAXAAXAXAMASMAXMASMMMMSMMMMSASMMSSMAMSMSMAXMAMXAMMAMAMXXSAMXMXMXMMAMMMSAMXXXMMMSMMMXMAMAMMSMXMAMAXAAMXXXXMAMAMXSXSXMMMMMSMSASAXSAMX 73 + MMSXMMSMMSASMSSSMASXMAAXMASMAMXXAXAAMXMAXAAXXMMAMSMSSXMMSXSAMASMMMXMXMASXXSMMSASASMSMXAAXXASXMAMAXAAMAMXXMSSXXAASMMAAAXXXAMMAMXAXAAMAMAXSASM 74 + XMAAXAMAMXMSXAAXMXMAAMMSMSMMAMSSMMMSSMSXMXSMXMMMMAXAMXXAAAXMSASAAAAMAMXSMAMMAMASAMXAMSAMASXSASXSMSSMASXMXMAXAMXMMXSXSASAMAMXXASMSMSMSMSMSAMA 75 + XAMMMAXAMAAMMMMMSXSMMMAXXAMMSMMAAMAMAXMAMAXAMXAAMXMSSMMMXSXXMMSMSMMXASAMMMMMASMMMMSSXXAXXMASAMMXMAXXXMASXMAXXSAMSAMXMASMSAMASXXMAAAXMXXAMXMX 76 + MMSSXMSMMSMMASXMXASMSMXSMXXAXMXSMMAXSMSAMMXXAMXXSSMAAXMAAXMSMASAMASMMMASXMAXMXAXXXAXMXMXXXXMASAAMSSSMSXMMMMXASAXXAXXMXMXSXSMMMASMSMXSAMXMMAM 77 + XAAMAXAMAAASASAXMXMASAXAAMMSSMAMASXMXAMASAAXSSXXAMMSMMMMXSAMMASASASASXMMASMSSSMMMMXMXXMASXMSXAAXMXAAASMAMASMAMMMMAMXSXMXMASAASAMXAAAAASAMXAM 78 + MMMSXMAMSMMMASAMSMMXMXMMSMAAAMASAMXASMMAMMSMMAMMAMAMAAXAAMAMXAXXMASMMAAMMMAAAAXAXMASMMMAMXAAXMASXMMMMMAXMAMMMMSMASXMAXMASXMMMMASMMXMSAAXXMMS 79 + XMXMAMXMXXMMXMAMAASAMXSXMMSSSMAMAXMMMSMXMMAAMAMSAMASAMXMSXMMMSMMMAMMSSMMSMMMMMXSASMMAAMMSMMMSXXMXMXMMMSXMAXSAAAAMXAXMMXASASXXSAMXMMXXXMSMSMS 80 + MXAMSMAXMAMXSSXMSSMAMAAAMAAMXMSSMMSMAXSXXXSMMSXSXSXAXMAXXAASAMAAMMAAXXMAMMXMAXXMAXXSSMSMAAMSXMAMMXMSAAAXSAAMMMXXXXMMXSMMMAAAMMXMAXMAXMXAAAAX 81 + SSMSMMSASAMXMAMMXMMSSMMSMSMMSXMAMAMMMMMMSMAAXXAMXMAXAASASXMMSSSMSSMXSMMASXSMMMSMAMMXMASMMSSMAMAMAAASMSSMMMSXSASMSMXMASAMMSMMMSMXMAMXXAXMSMSM 82 + XASAMXMAAASXMSSSSMMXAAXAAXXMXASAMXMAAAMAAMSMMMAMMMMSSSMAAXMXXMAAAMMMMXMSAMXAAAAMMXMAMMMAMMMMSMAMSSXXMAAMXAAAMAMAAXXSASAMAAAXSAAASXSAASXMMXAA 83 + SMMMSAMMMMAAXMAXAASXSMMMMMAMMAMXSXSSSSSSSXXXASAMAXXAXXMXMSMSSMMMMXASAAXAAASXMSMMXAMMSXMAMMAAMXAMXXMAMSMMMSSXMAMMMMXMMMAMSMSXSMXMSASAMMAASMSS 84 + AXAASASAAMSMMMMSSMMAXAAXASAMXSMASAMXAMAAMASMMSASXSMMXSAAXAMAMXSASAMXASMSAMXXXXXSSMMMAMSMSMMMSMSMSASXMXAMAMXAMMSAAAMSXSAMMXXAMXSAMMMASXMMMAAM 85 + MMMMXXMXXMASAXXAMAMSMSASMXSMMXAXMASMMMMMMAMXMXXMMXASASMSXSMSXMMASAXXXMAMXSMXSAXMASAMAXAMMMMSXAAAXAMMAMAMSSSXMAXXMXAAXMASXMMAMSAXMASAMXASMMMX 86 + XMSMSSSMMSASMSMMSSMAAMMMXMAXAMMMSSXMXAMXASXMMSXMXSXMASAMAXAMXSMMMMMSSSMSAMXMMMMSAMXMMXMXAAMXMMMSMMAXMSSMXAXMXMSAMMMSAAAMAXMAMXMXSXXAMXMXAXAS 87 + XSAAXAAAAMMMMXAXAASMSMSAASXMMMAMXMASXXSAAMAAASAMAMXMXMASXMAMAXAAAXXAAAAMMMAMAMXMASAMSASXSSSMAMMXAMAXMAAXMMMSAMAMXXMAMMAMAMSMMXXMMMSMMMMSSMAM 88 + MSMSMSMMMSSMSMSMSXMXXAMSMSXAASMSMSAMXAMXXMXMAXAMSSSMXMXMASAMXSXMSSMMXMMMMMMMAMASXMAXAAMAMAMMAMXMAMAXMMSMASAMASMSAMSAMSXMXXAXMSSMAAAMMXAAXMAM 89 + AMAMAXXXAAAMAAAAXXMSMMMMMSMSMSAAXMASMSMAMSMMXSAMXMAMMSMMMMMSMMMAMMMSAAAXSASXXMAMMXSXMSMAMAMMXSSXSMSXXXMMMMASAMXMAMSAMAASXSXMAAAMXSSSXMMSXSSS 90 + MMAMXMMMMMSMMMMMMMMXAMXAASMMAMMMMMSMXMAMMAXAMXXMASAMMASAMMAMAAAXXSAMMMMXMASAMMSMMAXAMMMXSXSMSMMAMAMXMASAMSXMXSAMAMSAMSMXAMAMMSSMMMMAXMAMASMM 91 + XSMSSSMMSAMXXXSSMMSSSMSMMSAMSMXSAMXMXMAMSSMMMAMSAXAMSASMXSASMMSMXMXXASMMSAMAMAXAMASXMAMXMMAXMAMAMAMXAMMXMXAAMSASAMSXMMAMSSMMAAMMAAXMAMMSXMAS 92 + AXAMXXAAMAMSSXMAAAAXAAAXAMAMMMMMAMAMMMMMXXAAMAMMXXAMMAMMASAXXMAMXSSSMSAAMXMXMAXAMXSAMASAMSMMMAMXSXMMSSMASXMMMSAMMXMAMMAMAAXMMSSSSSSXSAASASAM 93 + MMMMMSMMXAMXXASXMMXMMMMMXSMMMAASASASMSASASMMSASXSAMSMSMMXSAMSSMSAMXAMSMMSMMSMSSMSAMXSMSXMAMASASXAAAAAAMMMMSAMMAMXAXMASASMMMMSXAAAXAAMMXXAMMS 94 + MAAAAAMMMSSMSXMXXXSMSAXXAAAASMMSASAMASASXAXASASAMSMAAAAXAMAMXAAMMSSSMSAAXAXSAXAAAMMMMAMMSXSAAMAMMMMMMSAMSASASXMAMMMSXSASMMMXAXMMSSMXMSSMAXMX 95 + SSMSSSXSAAAAXMSAMXAXAASMMSSMSMMMMMMMMMAMMMSXSAMXMAMMMMXMMSAMXMMMAMAAASMMSSMMAMMMMXAMSMSASAMXXSAMXAMMMMASMASXMASMXSASMMAMAASMMXSAAAXSXAXMMMMM 96 + MMAAXAAMMSMMMXSXAXMASMMMXAXXXXMAMAAMMMMMAXMAMMMXSSMSASAAMMASXMXMMSMMMMMAMAXMAXSSXMXXAAMXMXXSMMAMSASAAMSMMMMMMMMAAMAMXMSMSMSAXAMMXMMMMXXAMAAA 97 + AMXMSMMMXAXAXAXXXAXAMAAXMASXMMSMSSSMXAMMSAMSMMMAMAASASMSMMMMAAXSMMXXAXMASMSSSSXXAMAMMSMSAMXMASAMXAXMMSXMAMXSASMMMMAMAAXAXMSAMXSAASMMAMSXSASX 98 + XXAXAMXXSMMMMMSMSMMMSMMMMMMXMAAMMMAASAMAXXXAAAMXSMMMAMMMMASMMMMSAMASMXSASAAAXAMXAMAAMMMMAAAXMMAMMSMSMXMSMSAXAXSAMXXASAMXMASASAMMXMAMMXAAXAAM 99 + MSMMMSXMXXMSAMAMAXMASXMAXAXXMSSSMMMMMAMMSMSSSMXASMSMXMAMSAXAAMAXAMMSMAMAMAMXMAASXSSSMAASXSMSXSSMAAAXMAMAAMMSMSAMXASXMXSASAMXMASMSSMMSMMMMXMA 100 + MAXXAMMMAAXASXSSSMMASASMSMXSAAAAXSMXSXMXMAXMAMMASAAMXSAMMSSSMMSSXMXXMAMSMSMAAXAAAXMAXMMSXAMAMAXMSMMMMMMMMMXAXMAMXMMXMMXMASXMMXXAAMAXSAMXSAXM 101 + SASMAMSMMSMXMMMAXXMAXMMAAASMMMSMMSMAXSMAMSMXAXMAMXAMAMXXAAMASAMAMSXSMMSAAAMMSSMMXMSAMMMMXXMASMMMMAAAXAXMASXMMSASAMXAXAMSAMSAXAMMMSSMSAMAXAMX 102 + MASXMAAXAAMASMMAMXMSSMMMMMMAAMAXAMMMXMMASAMMAMMXSSSMXSAMMMSAMXMAMMAAASXMSMSMXMASMAMASMAMXXXAMMAAMMSMSXSAAXAAAXXXXMXAXSMSAAASMXSMAAAMSXMXSMSS 103 + XMXAMSSSSMSASAMMXAAAAASMSMSMMSAMXSASASMMSAMSSMSSMAMMAXMXSXMXSAMMXMMMMMAMAAAMMXMSAMSAMMAMMSMSSSSXSAAXXAAMASMMMSSXSMSSXXASMXSXMAXMMSMMMMSXAAAX 104 + MMMXMXAAMXMXXMSASMMMSMMAMAAXXMASXSASASAXMMMMAAXAMAMMMSMXSAMAXMASMMSAXXSMMSXMXSXXMAMXSSMSAAAXAAAMMMMSMXMMASAXMXMAMAAXAMAXAXXAMSMMXMXSAAXSMMMS 105 + AXMASMMXMMSSMXXMAMXAAAMSMMMXXXAMXSXMAMMSAXSSMMMASXSXMSAAMAMXSXAAAASXSMXXXMAMSMSAMXAAXAMMXSMMMMXMASXSXMXSASMMSAMAMMMSXMSMMMXAMAAXAMASMSXMMAMA 106 + XSMMXXMMMXAASAMXMMSSSMMAMXSAMSSXMSAMXMXMXMXXAMSXSAAAMXMASXMMMXAMMMMASMXMXMAMAAAMXSXMMXMAXMAASASMAXXXAXXMASMASAMXMAAMAMMAMASXMSMMXSAXMMAMXMXA 107 + MSASMMXAXMSMMXMAXXAAMASXSAMAMAMMMSAMXSASAMXSXMMAMMMSXMXMAMAASASMXMMXMMAXASASMSMMAAAXXSMSSSMMSASMMXSSMMMMAMMMSAMSSMMSAMMXMMMAAAMAMMMXMSAMMSMX 108 + ASAMXAXSSXMASMSSSMMSMAMAMMMAMASXAXXMASASASAXAMMXMSAMASXMAMXMAAXAAXSMMSSMXSASAMAMXSAMAAAMXXXAMAMAAAXXSASMAMXAMAMAAAASMSMSMSSMSMMMSAMAAXAMXAAM 109 + XMAMMSMAAMSAMAAAAXXXMAMMMXSXSASMMSXSAMXMAMXMMMAAAMAXAMXMASMXMAMSXMSAMAAAMMXMMSAMAXAMXMXMASMMMSSMMMSASXSSXSAXSMMSSMMMXAMXAMAXMAMMSASXSMMSSMSX 110 + MSAMAAMMMMMSSSMSMMMMSXSAMAAAMASAAAMMXSSSSXSXMAXMSSSMSSXMMSAASXMMMXSSMMMMSAAXAMMSMXXMAMXMMSAMXXAXAXMXMAXAMMMMXMMAMMXSSMSMMMMXMAMXMXMAAAXAAMAX 111 + XSAMSXSAXSAAXAAXXSAAXASMSSSXMASMMSMXMAXAAAMASMSMAAMAMXMXMSMMXAAMXAMXSXAAXXMSMSMXMAMXASXMASMMMMMMMMMAMSMMMAMSAXMXXSAMMAXMXSXSXXXAXMMSSMMSSMAS 112 + ASAMXXXASMMXSXMMASAMSAMXAMAXMASMAAASMMMMMMMAMAAMMMMAMMMSMMXXSSMAMMSAMSMSMMMXXAMAMAMSAMAMASXMAAXAXXXAXASMMAMMXXMXMMASMMXMASXSAXSMSAMAMAAXXMAS 113 + MMXXXMSMMAAMMXXMAMAXMMMMSSMSMMSMMXAXAAAXAAMASXSMXSSSMSAXAXSAXASAAXMAXXMAMAMXSAXAXAMXAMXMASAMSXSAASMMSAMSMSMMSSXMASAMAXAMAXAMXMAAXAMXMSMMAMAS 114 + XAXSMAAMMXMAAASMXSAMXSAMXAXSAMXMAXSSMSAMMXMMXAAAAAAXAMMSXMMMSAMMSAXMMXXAXMSAMMSSSSMSSMXSASMXAAMXMXAAMMMSMXAMXAASXMMSAAXMMSXSASMMMSXMAMASXMAS 115 + MMSMASMXXAXMXMXAAXASASASXSMSAMAMMSMAXMASMSSSMSMMMSMMSMXXMAAAAXXAAAASASXSSMMASAAAAAAXMAXMASXMMMMAXMMMMXXMASXMMSMMAMMXMASMXAMMASMMMAASASAMXMAX 116 + MXAXMAMXSMSAMXMMMSMMASAMXXAXAMXAMMXMMMMAAAAXMAMXXXXAAMXSAXASMSASMXMMASMMAMSAMXSMXMMMASXMAMMXAASXSXAXMXXMXMXSXAXSXMAAXMAMMXSMAMAAMMAMAMXMXMMM 117 + SSSSXSXMAAAMAAMAXXAMAMMMMMAMSMSSSMASASASMMMMSMSSXAMSSSMMSXAAAXMAMAXMAMASAMXXMAXXXSSSMAMSXSAMSXMAMXMMSMASAXXXXMMMMSSSSMAMXSXMASMMSXAMXMAMAAAA 118 + XAXMAMSAMXMSSXSAXXMMXSMMASAMAAAXAXMSASAXMSSMSXAMAMXMAMAAXMMMXMXXXMMMMAMXXMASMASXAMAAXMMMAMXXMAMXMMSAAAMSASXSMSAAAMAAXXASXMAMAAAXMMMMAMAMXXAS 119 + MAMAASAMXSXAMAMXSMMAXAASASAXXMMXSMMMMMXMASAASMAXAMXXAMSMMAXAMSMSASMSMSXSAMXXMASXMMXMMXAMAXMXMAAXMAMMXSAMAMXSASMMSSMSMSMSAMAMSSMASXMSSSSSMSAA 120 + MXASXSASAXMASMAMAAMMSSMMXSMMSASXAMSSSMSAXSMMMSASMXSMXXAASAMXSAAMAMAAAAXAMXSXMXSASXSSXSASAMXMSASMMSSMSXMMAMXMAMAXAAXMASAMXSMMAAAAAAAAXAAAAXAM 121 + MXMMASAMXMAXAAAAXXMAAAMMMXMASAMSMMAAAAMSXMXXAMXXAASAMSSMMSMXMMSMSMXMMMSXMASMMAMAMAAXMMAMXAMXMSAAXMAMSAXSXSASASAMSSMSSXAXAAXMSMMMSMMMSMMMMXAX 122 + XMMMMMMMAASAMSSSSMMMSXXXXXMXMAMMXMMSMMMMMMAMXSSMMMMAMMAMAAXXMXAXMASXXAAAMAMAMXMSMMMMXAAMXSAMXMXSMSSMSXMXMSMSAMMXXMAXMMMMMSSXXXMAXXXXAXMMSSMM 123 + MAXSSXMSXSMMXMAAAXXXMMSMSMXXSAMXXMXMAXXAAMXSAAMMXXMSMMAMMSMMSMSMSMAMMMSXMSMSAMXXAXMSSMXSAMXMXSAMXMXAMMXAMMAMMMSXXMSMSMMAXAXAMXMMSMMXMMMAAAAX 124 + ASMXSAAXMXMASMMSMMXMAXAAMSAXMXMASXMXMASMMSAMMSMMXSXXASMMXAXMAAAAAAAXAXMMMXAAMMMSMMSAMAMMXMAXAMMXXMMSMMSSSMAMAXXAXXAAXMASXXMSMXSAAAASMSMMSSSM 125 + MXMMSMMSXSMAMSAXAMXMSSMMMXXSMAMAMAMSSMSAAMXMMMAMASMAMMAASAXMAXMSMSMSMXMAAMXMMAXAAXMAMSMAAMMMMSSMSMAAAXSAMXMMAMXMMSMSMMAXAMXAXAMSSSMMAAMAMAMA 126 + ASAMXMASMMMSSMSSSSSMAAMSMMMAMAMAMAMMAXXMXMMMAXXMAMMAMAXMMASXSMAXAAAAASXSMSMSSXSMSXSXMAMSMSASAAAXXMSSSMMAMXXMMSAXMXXAAMXSAMXMMMMMXAMMXMMMMMMA 127 + XSAMAMAXAXMMAAASAAAMSSMAAAAMSAXSXSMXMSMSAMSSMXAMXSMXMXSMXXMAMXAMSMSMSMAAXMAMXAXXMASMSXMAXMAMMSMSAMAAMASXMASXMSASXMMSSMMAMMAXAAAMSMMSMMMXASXS 128 + ASAMXMAXSMMSMMMMMSMMMAXSSMMXMAXXAMSMXAMXASXAAASXAMASXMMAXMAMXAXAXMXXMMSMMMMMXXSSMMMXMXAMMMSMMAXSAMMSMXAMMAXMAMAMXAAAAAXXMSXMXXXXAMXAAXASXSAM 129 + XSAMXMMMMAXSXSSXXAMAMXAMXAASMMSMAMASMASXMMXMMMXAMMAMAASMXXMMXSSSXMMXMAMXMSAMXXMAMSXMAMXAMMXASMXSAMXXMMMAMASXXMMMSMMSSSMMASXSASXMSAMMSMMXMMAM 130 + MSAMMAMASXMXAAMXMSMMSMMSMSMSAAXMXMAMXAMXMAMXAXAMXMSSSMMMMSMMAMAMAAAAMXSAASASMXSAMMAMAASXSMSMMXMSXMXXAAXXSASMASMAMAMAMXAXAXAMASMAAMAMMXMAAMXM 131 + ASMMAXSASAMMSMMSMASAAXXAAAASMMMSMMMSAMXAMASMMMMMXSAMXMAXAAAMXSMSXMSXXAMXMMXAAXAASAMXMXMAAASMSMMMAMASMMSXMAMMAMMAMMMSMMSMMSMMAMMSMXSXMASXMXAX 132 + XXMASXMXSAMMAXAAXMASMSAMXMXMASXMAXAXAMSSXXXAMASAMXMXASMMSSSMAMXMMMAAMSAMXMSSSMMXMAMXSAMXMAMAXXASAMXXAAMAMAMMXSXMXSAMAAXMXSXAMXAXXAMMSMMAMSXM 133 + AAXXAMMASXSSMMSSXSAAXMAXXXAAXMASAMSSSMAMMSSXMASAASXMXSAAAMAMSMAMAMMXMAAAXAAAXMXSSMMASASAMSMXMSXSMXSXMMMXMAMMMSAAXMASMMXSAMASXMASMXXMAMMAXMAM 134 + SXMASAMASAMAAAAAAMSMSAMXSSMXSXXMAMMAMMXMAMAXMMSMMSAXMSMMMSXMAAMMSSXASXMMMMXSMMAAAAMMSAMXSXSAASAMMASMAAXXMXSAAXMMMMMMAMSMMSAMAMSXMAXSMXSMXMAA 135 + XMAAAXMASMSSMMMMMMMXSAMXAXMASMSSSMMAMSMMSSMXXMXMXSAMAMXMASASMMXAAMXXMAAXXMAMAMXSSMMMMMMXMASMAMAMMASASMSMSASMSSXMASASAMAAAMASXMXAMSXMXXAMXSXM 136 + MAMXXXSXSXMMXAMASXMASAMXMXSAXAMAAXMAMMMAMAXSMMMMMMSAMXAXMXXAXAMSSSSSSSMMAMAMSMMXMASAAAMAMXMMASAMMMSAXAXXMAMAAXMXMSASXSMMMSAMXSMMMXAMASASMMSM 137 + ASMMSASAMMMMSXSASAXXXMAXXMMAMSMSMSSSMSMSXMMMAAXMAAAMMXMSMSMMMMMAAMAXAXMSASXSAMMASXMMSMSMSMXSASASXXMAMXMMMSMMMSSMMMXMAXXAXMASAXXXAMAMXSAMMAAX 138 + MXAASAMAMAAXMXMASMMMSAMXMSSSMAMMAMAMASAMASMSSMSSMXMMSAAXAASAAMMMSMMMASXMASXAAXMASAXAMXAAMAXMMSAMXAMMMASAAXASAMXASXSMSMSMSSMMMMXMSSSMXMAMMSSX 139 + XSMMMASMMSSXSAMXMAAMASXXMAAASXMMSMAMMMASAMXAASAXXXSASMMMSMSMSSXXAMXMXMASXMASMMMASXMASXMMMXSAAMAMSMAAAASMXSAMSSSMMASAAAAMMAXMAMXAXAAMAMAMXAXX 140 + AXXXSXMAXXMXSSSMSSMSXMSSMMSMMMXXXAMXSMXMXMMSSMSMSAMXSAMXXXXMMMMAMXXXSSXMXSAMXXMXMXAXXMASXMSMMSMMSXSAMMSXMMMSXMAXMAMXMSMXSAMSXSXSMSMMXSASMASX
+136
2024/day_4/src/main.rs
··· 1 + #![feature(test)] 2 + 3 + extern crate test; 4 + 5 + use std::fs; 6 + 7 + fn get_char(grid: &Vec<Vec<char>>, (y, x): (usize, usize)) -> char { 8 + let mut c = '.'; 9 + // println!("{x}, {y}"); 10 + if y < grid.len() && x < grid[y].len() { 11 + c = grid[y][x]; 12 + } 13 + 14 + c 15 + } 16 + 17 + fn check_surround(grid: &Vec<Vec<char>>, (x, y): (usize, usize)) -> usize { 18 + let mut n = String::from("X"); 19 + let mut ne = String::from("X"); 20 + let mut e = String::from("X"); 21 + let mut se = String::from("X"); 22 + let mut s = String::from("X"); 23 + let mut sw = String::from("X"); 24 + let mut w = String::from("X"); 25 + let mut nw = String::from("X"); 26 + 27 + 28 + for diff in 1..4 { 29 + n.push(get_char(grid, (y.checked_sub(diff).unwrap_or(grid.len()),x))); // y-, x 30 + ne.push(get_char(grid, (y.checked_sub(diff).unwrap_or(grid.len()), x+diff))); // y-, x+ 31 + e.push(get_char(grid, (y,x+diff))); // y. x+ 32 + se.push(get_char(grid, (y+diff, x+diff))); // y+, x+ 33 + s.push(get_char(grid, (y+diff, x))); // y+, x 34 + sw.push(get_char(grid, (y+diff, x.checked_sub(diff).unwrap_or(grid[y].len())))); // y+. x- 35 + w.push(get_char(grid, (y, x.checked_sub(diff).unwrap_or(grid[y].len())))); // y, x- 36 + nw.push(get_char(grid, (y.checked_sub(diff).unwrap_or(grid.len()), x.checked_sub(diff).unwrap_or(grid[y].len())))); // y-, x+ 37 + } 38 + 39 + // println!("({x},{y}): {n}:{ne}:{e}:{se}:{s}:{sw}:{w}:{nw}"); 40 + let count = [n, ne, e, se, s, sw, w, nw].iter().filter(|s| **s == String::from("XMAS")).count(); 41 + 42 + count 43 + } 44 + 45 + fn check_middle(grid: &Vec<Vec<char>>, (x, y): (usize, usize)) -> bool { 46 + let neg_y = y.checked_sub(1).unwrap_or(grid.len()); 47 + let neg_x = x.checked_sub(1).unwrap_or(grid[y].len()); 48 + 49 + let nesw = format!("{}A{}", get_char(grid, (neg_y, neg_x)), get_char(grid, (y+1, x+1))); 50 + let nwse = format!("{}A{}", get_char(grid, (neg_y, x+1)), get_char(grid, (y+1, neg_x))); 51 + 52 + let check = (nesw == "MAS" || nesw.chars().rev().collect::<String>() == "MAS") && (nwse == "MAS" || nwse.chars().rev().collect::<String>() == "MAS"); 53 + // println!("({x},{y}): {nesw} / {nwse} = {check}"); 54 + 55 + check 56 + } 57 + 58 + fn part_1(input: &Vec<Vec<char>>) -> usize { 59 + let mut count: usize = 0; 60 + 61 + for (y, line) in input.clone().iter().enumerate() { 62 + for (x, letter) in line.iter().enumerate() { 63 + if letter == &'X' { 64 + count += check_surround(input, (x,y)); 65 + } 66 + } 67 + } 68 + 69 + println!("Part 1: {count}"); 70 + 71 + count 72 + } 73 + 74 + fn part_2(input: &Vec<Vec<char>>) -> usize { 75 + let mut count: usize = 0; 76 + 77 + for (y, line) in input.clone().iter().enumerate() { 78 + for (x, letter) in line.iter().enumerate() { 79 + if letter == &'A' { 80 + count += if check_middle(input, (x,y)) {1} else {0}; 81 + } 82 + } 83 + } 84 + 85 + println!("Part 2: {count}"); 86 + 87 + count 88 + } 89 + 90 + fn parse_input(input: &str) -> Option<Vec<Vec<char>>> { 91 + Some(input.lines().map(|l| l.chars().collect::<Vec<char>>()).collect::<Vec<Vec<char>>>()) 92 + } 93 + 94 + fn main() { 95 + let file = fs::read_to_string("./input.txt").expect("Couldn't read file"); 96 + 97 + let input = parse_input(file.as_str()).unwrap(); 98 + part_1(&input); 99 + part_2(&input); 100 + } 101 + 102 + #[test] 103 + fn test_main() { 104 + let file = String::from("MMMSXXMASM\nMSAMXMSMSA\nAMXSXMAAMM\nMSAMASMSMX\nXMASAMXAMM\nXXAMMXXAMA\nSMSMSASXSS\nSAXAMASAAA\nMAMMMXMMMM\nMXMXAXMASX"); 105 + let input = parse_input(file.as_str()).unwrap(); 106 + part_1(&input); 107 + part_2(&input); 108 + } 109 + 110 + #[bench] 111 + fn full(b: &mut test::Bencher) { 112 + b.iter(|| main()); 113 + } 114 + 115 + #[bench] 116 + fn input_only(b: &mut test::Bencher) { 117 + let input = fs::read_to_string("./input.txt").expect("Couldn't read file"); 118 + 119 + b.iter(|| parse_input(input.as_str())); 120 + } 121 + 122 + #[bench] 123 + fn part_one(b: &mut test::Bencher) { 124 + let file = fs::read_to_string("./input.txt").expect("Couldn't read file"); 125 + 126 + let input = parse_input(file.as_str()).unwrap(); 127 + b.iter(|| part_1(&input)); 128 + } 129 + 130 + #[bench] 131 + fn part_two(b: &mut test::Bencher) { 132 + let file = fs::read_to_string("./input.txt").expect("Couldn't read file"); 133 + 134 + let input = parse_input(file.as_str()).unwrap(); 135 + b.iter(|| part_2(&input)); 136 + }
+1
2024/day_5/.gitignore
··· 1 + /target
+7
2024/day_5/Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "day_5" 7 + version = "0.1.0"
+6
2024/day_5/Cargo.toml
··· 1 + [package] 2 + name = "day_5" 3 + version = "0.1.0" 4 + edition = "2024" 5 + 6 + [dependencies]
+1366
2024/day_5/input.txt
··· 1 + 48|39 2 + 39|84 3 + 39|23 4 + 95|51 5 + 95|76 6 + 95|61 7 + 14|52 8 + 14|49 9 + 14|39 10 + 14|53 11 + 85|19 12 + 85|25 13 + 85|61 14 + 85|35 15 + 85|58 16 + 74|86 17 + 74|55 18 + 74|49 19 + 74|18 20 + 74|83 21 + 74|47 22 + 45|49 23 + 45|76 24 + 45|86 25 + 45|22 26 + 45|35 27 + 45|18 28 + 45|37 29 + 52|58 30 + 52|16 31 + 52|23 32 + 52|12 33 + 52|31 34 + 52|27 35 + 52|46 36 + 52|15 37 + 49|71 38 + 49|44 39 + 49|54 40 + 49|91 41 + 49|58 42 + 49|25 43 + 49|52 44 + 49|84 45 + 49|46 46 + 86|26 47 + 86|95 48 + 86|52 49 + 86|51 50 + 86|48 51 + 86|91 52 + 86|55 53 + 86|22 54 + 86|11 55 + 86|37 56 + 69|18 57 + 69|86 58 + 69|98 59 + 69|34 60 + 69|79 61 + 69|95 62 + 69|22 63 + 69|27 64 + 69|15 65 + 69|65 66 + 69|37 67 + 66|83 68 + 66|65 69 + 66|18 70 + 66|92 71 + 66|48 72 + 66|32 73 + 66|16 74 + 66|47 75 + 66|22 76 + 66|95 77 + 66|37 78 + 66|49 79 + 15|22 80 + 15|83 81 + 15|37 82 + 15|49 83 + 15|65 84 + 15|85 85 + 15|31 86 + 15|95 87 + 15|79 88 + 15|47 89 + 15|74 90 + 15|16 91 + 15|86 92 + 71|16 93 + 71|66 94 + 71|92 95 + 71|84 96 + 71|15 97 + 71|54 98 + 71|25 99 + 71|53 100 + 71|31 101 + 71|98 102 + 71|46 103 + 71|69 104 + 71|74 105 + 71|58 106 + 79|49 107 + 79|34 108 + 79|86 109 + 79|26 110 + 79|18 111 + 79|14 112 + 79|22 113 + 79|91 114 + 79|77 115 + 79|48 116 + 79|37 117 + 79|52 118 + 79|95 119 + 79|35 120 + 79|74 121 + 76|39 122 + 76|84 123 + 76|94 124 + 76|77 125 + 76|12 126 + 76|24 127 + 76|46 128 + 76|69 129 + 76|15 130 + 76|53 131 + 76|23 132 + 76|19 133 + 76|52 134 + 76|11 135 + 76|66 136 + 76|25 137 + 19|94 138 + 19|79 139 + 19|71 140 + 19|92 141 + 19|66 142 + 19|16 143 + 19|53 144 + 19|45 145 + 19|69 146 + 19|31 147 + 19|24 148 + 19|25 149 + 19|12 150 + 19|54 151 + 19|84 152 + 19|58 153 + 19|98 154 + 11|25 155 + 11|27 156 + 11|84 157 + 11|12 158 + 11|24 159 + 11|66 160 + 11|19 161 + 11|51 162 + 11|69 163 + 11|16 164 + 11|53 165 + 11|94 166 + 11|58 167 + 11|44 168 + 11|23 169 + 11|39 170 + 11|35 171 + 11|52 172 + 92|37 173 + 92|91 174 + 92|31 175 + 92|48 176 + 92|76 177 + 92|14 178 + 92|34 179 + 92|55 180 + 92|32 181 + 92|85 182 + 92|86 183 + 92|98 184 + 92|83 185 + 92|49 186 + 92|18 187 + 92|26 188 + 92|95 189 + 92|11 190 + 92|74 191 + 23|16 192 + 23|18 193 + 23|86 194 + 23|74 195 + 23|92 196 + 23|66 197 + 23|79 198 + 23|55 199 + 23|45 200 + 23|47 201 + 23|26 202 + 23|37 203 + 23|15 204 + 23|24 205 + 23|12 206 + 23|98 207 + 23|34 208 + 23|48 209 + 23|65 210 + 23|27 211 + 37|51 212 + 37|61 213 + 37|26 214 + 37|47 215 + 37|49 216 + 37|84 217 + 37|52 218 + 37|34 219 + 37|55 220 + 37|39 221 + 37|14 222 + 37|19 223 + 37|77 224 + 37|35 225 + 37|58 226 + 37|91 227 + 37|83 228 + 37|76 229 + 37|85 230 + 37|11 231 + 37|32 232 + 55|44 233 + 55|19 234 + 55|52 235 + 55|39 236 + 55|84 237 + 55|54 238 + 55|32 239 + 55|47 240 + 55|71 241 + 55|51 242 + 55|83 243 + 55|35 244 + 55|91 245 + 55|85 246 + 55|76 247 + 55|11 248 + 55|58 249 + 55|61 250 + 55|53 251 + 55|49 252 + 55|25 253 + 55|77 254 + 27|48 255 + 27|18 256 + 27|65 257 + 27|34 258 + 27|74 259 + 27|37 260 + 27|47 261 + 27|98 262 + 27|55 263 + 27|83 264 + 27|79 265 + 27|16 266 + 27|86 267 + 27|85 268 + 27|45 269 + 27|66 270 + 27|22 271 + 27|49 272 + 27|15 273 + 27|26 274 + 27|14 275 + 27|92 276 + 27|95 277 + 51|16 278 + 51|84 279 + 51|54 280 + 51|77 281 + 51|27 282 + 51|94 283 + 51|66 284 + 51|23 285 + 51|19 286 + 51|25 287 + 51|71 288 + 51|65 289 + 51|15 290 + 51|52 291 + 51|39 292 + 51|44 293 + 51|46 294 + 51|24 295 + 51|12 296 + 51|31 297 + 51|92 298 + 51|69 299 + 51|58 300 + 51|53 301 + 83|32 302 + 83|52 303 + 83|35 304 + 83|76 305 + 83|94 306 + 83|44 307 + 83|84 308 + 83|14 309 + 83|71 310 + 83|77 311 + 83|61 312 + 83|12 313 + 83|85 314 + 83|23 315 + 83|39 316 + 83|51 317 + 83|19 318 + 83|54 319 + 83|25 320 + 83|49 321 + 83|11 322 + 83|53 323 + 83|58 324 + 83|91 325 + 94|66 326 + 94|15 327 + 94|74 328 + 94|12 329 + 94|55 330 + 94|86 331 + 94|16 332 + 94|69 333 + 94|26 334 + 94|45 335 + 94|34 336 + 94|65 337 + 94|98 338 + 94|18 339 + 94|23 340 + 94|48 341 + 94|46 342 + 94|92 343 + 94|37 344 + 94|31 345 + 94|22 346 + 94|27 347 + 94|24 348 + 94|79 349 + 54|15 350 + 54|26 351 + 54|92 352 + 54|46 353 + 54|69 354 + 54|22 355 + 54|23 356 + 54|66 357 + 54|24 358 + 54|74 359 + 54|31 360 + 54|37 361 + 54|16 362 + 54|48 363 + 54|34 364 + 54|94 365 + 54|65 366 + 54|79 367 + 54|45 368 + 54|18 369 + 54|12 370 + 54|27 371 + 54|86 372 + 54|98 373 + 58|23 374 + 58|31 375 + 58|48 376 + 58|25 377 + 58|79 378 + 58|65 379 + 58|15 380 + 58|24 381 + 58|16 382 + 58|54 383 + 58|86 384 + 58|22 385 + 58|94 386 + 58|46 387 + 58|27 388 + 58|12 389 + 58|45 390 + 58|69 391 + 58|92 392 + 58|74 393 + 58|66 394 + 58|44 395 + 58|98 396 + 58|18 397 + 61|65 398 + 61|46 399 + 61|54 400 + 61|19 401 + 61|77 402 + 61|52 403 + 61|39 404 + 61|25 405 + 61|66 406 + 61|12 407 + 61|24 408 + 61|94 409 + 61|44 410 + 61|51 411 + 61|27 412 + 61|15 413 + 61|69 414 + 61|71 415 + 61|23 416 + 61|84 417 + 61|58 418 + 61|92 419 + 61|16 420 + 61|53 421 + 77|53 422 + 77|84 423 + 77|24 424 + 77|58 425 + 77|65 426 + 77|12 427 + 77|31 428 + 77|92 429 + 77|46 430 + 77|23 431 + 77|66 432 + 77|27 433 + 77|25 434 + 77|39 435 + 77|19 436 + 77|71 437 + 77|16 438 + 77|45 439 + 77|52 440 + 77|94 441 + 77|69 442 + 77|44 443 + 77|54 444 + 77|15 445 + 32|35 446 + 32|61 447 + 32|51 448 + 32|71 449 + 32|91 450 + 32|53 451 + 32|46 452 + 32|39 453 + 32|52 454 + 32|11 455 + 32|23 456 + 32|77 457 + 32|76 458 + 32|12 459 + 32|27 460 + 32|54 461 + 32|94 462 + 32|19 463 + 32|58 464 + 32|44 465 + 32|25 466 + 32|24 467 + 32|69 468 + 32|84 469 + 31|85 470 + 31|79 471 + 31|35 472 + 31|91 473 + 31|86 474 + 31|18 475 + 31|76 476 + 31|98 477 + 31|55 478 + 31|45 479 + 31|95 480 + 31|11 481 + 31|49 482 + 31|22 483 + 31|14 484 + 31|74 485 + 31|34 486 + 31|32 487 + 31|26 488 + 31|48 489 + 31|83 490 + 31|61 491 + 31|37 492 + 31|47 493 + 34|26 494 + 34|77 495 + 34|85 496 + 34|47 497 + 34|61 498 + 34|52 499 + 34|19 500 + 34|11 501 + 34|58 502 + 34|91 503 + 34|35 504 + 34|95 505 + 34|39 506 + 34|25 507 + 34|14 508 + 34|53 509 + 34|71 510 + 34|84 511 + 34|76 512 + 34|51 513 + 34|83 514 + 34|55 515 + 34|49 516 + 34|32 517 + 46|22 518 + 46|26 519 + 46|98 520 + 46|27 521 + 46|45 522 + 46|15 523 + 46|83 524 + 46|86 525 + 46|24 526 + 46|18 527 + 46|65 528 + 46|79 529 + 46|34 530 + 46|16 531 + 46|55 532 + 46|74 533 + 46|95 534 + 46|66 535 + 46|92 536 + 46|37 537 + 46|47 538 + 46|48 539 + 46|69 540 + 46|31 541 + 26|53 542 + 26|95 543 + 26|35 544 + 26|47 545 + 26|19 546 + 26|76 547 + 26|83 548 + 26|55 549 + 26|11 550 + 26|51 551 + 26|77 552 + 26|52 553 + 26|39 554 + 26|71 555 + 26|91 556 + 26|44 557 + 26|32 558 + 26|84 559 + 26|85 560 + 26|14 561 + 26|49 562 + 26|61 563 + 26|25 564 + 26|58 565 + 91|24 566 + 91|23 567 + 91|94 568 + 91|69 569 + 91|46 570 + 91|27 571 + 91|76 572 + 91|58 573 + 91|53 574 + 91|11 575 + 91|19 576 + 91|39 577 + 91|52 578 + 91|61 579 + 91|84 580 + 91|51 581 + 91|25 582 + 91|54 583 + 91|77 584 + 91|35 585 + 91|44 586 + 91|12 587 + 91|15 588 + 91|71 589 + 53|48 590 + 53|69 591 + 53|44 592 + 53|94 593 + 53|92 594 + 53|66 595 + 53|79 596 + 53|98 597 + 53|31 598 + 53|27 599 + 53|45 600 + 53|15 601 + 53|16 602 + 53|22 603 + 53|12 604 + 53|86 605 + 53|54 606 + 53|24 607 + 53|58 608 + 53|23 609 + 53|74 610 + 53|46 611 + 53|65 612 + 53|25 613 + 12|74 614 + 12|16 615 + 12|65 616 + 12|66 617 + 12|95 618 + 12|31 619 + 12|34 620 + 12|37 621 + 12|47 622 + 12|24 623 + 12|98 624 + 12|92 625 + 12|15 626 + 12|22 627 + 12|69 628 + 12|86 629 + 12|27 630 + 12|46 631 + 12|55 632 + 12|26 633 + 12|45 634 + 12|18 635 + 12|79 636 + 12|48 637 + 24|34 638 + 24|15 639 + 24|26 640 + 24|27 641 + 24|95 642 + 24|55 643 + 24|37 644 + 24|14 645 + 24|74 646 + 24|48 647 + 24|31 648 + 24|66 649 + 24|45 650 + 24|98 651 + 24|18 652 + 24|86 653 + 24|92 654 + 24|16 655 + 24|65 656 + 24|47 657 + 24|83 658 + 24|79 659 + 24|22 660 + 24|85 661 + 84|54 662 + 84|98 663 + 84|53 664 + 84|46 665 + 84|58 666 + 84|23 667 + 84|22 668 + 84|12 669 + 84|16 670 + 84|94 671 + 84|45 672 + 84|66 673 + 84|65 674 + 84|31 675 + 84|86 676 + 84|79 677 + 84|25 678 + 84|24 679 + 84|69 680 + 84|15 681 + 84|74 682 + 84|27 683 + 84|92 684 + 84|44 685 + 18|53 686 + 18|35 687 + 18|55 688 + 18|77 689 + 18|85 690 + 18|37 691 + 18|83 692 + 18|26 693 + 18|52 694 + 18|14 695 + 18|39 696 + 18|51 697 + 18|19 698 + 18|71 699 + 18|11 700 + 18|84 701 + 18|91 702 + 18|49 703 + 18|32 704 + 18|34 705 + 18|76 706 + 18|95 707 + 18|61 708 + 18|47 709 + 25|65 710 + 25|12 711 + 25|94 712 + 25|37 713 + 25|45 714 + 25|24 715 + 25|92 716 + 25|66 717 + 25|79 718 + 25|74 719 + 25|22 720 + 25|86 721 + 25|98 722 + 25|18 723 + 25|44 724 + 25|48 725 + 25|23 726 + 25|27 727 + 25|16 728 + 25|69 729 + 25|31 730 + 25|46 731 + 25|54 732 + 25|15 733 + 98|83 734 + 98|11 735 + 98|22 736 + 98|49 737 + 98|37 738 + 98|61 739 + 98|85 740 + 98|79 741 + 98|95 742 + 98|32 743 + 98|35 744 + 98|34 745 + 98|48 746 + 98|76 747 + 98|77 748 + 98|91 749 + 98|47 750 + 98|74 751 + 98|86 752 + 98|26 753 + 98|51 754 + 98|14 755 + 98|18 756 + 98|55 757 + 22|76 758 + 22|61 759 + 22|47 760 + 22|35 761 + 22|85 762 + 22|77 763 + 22|51 764 + 22|95 765 + 22|26 766 + 22|14 767 + 22|37 768 + 22|71 769 + 22|83 770 + 22|32 771 + 22|55 772 + 22|39 773 + 22|52 774 + 22|49 775 + 22|91 776 + 22|19 777 + 22|18 778 + 22|34 779 + 22|11 780 + 22|48 781 + 47|95 782 + 47|11 783 + 47|14 784 + 47|51 785 + 47|49 786 + 47|54 787 + 47|39 788 + 47|94 789 + 47|85 790 + 47|44 791 + 47|61 792 + 47|71 793 + 47|58 794 + 47|83 795 + 47|19 796 + 47|32 797 + 47|77 798 + 47|25 799 + 47|84 800 + 47|53 801 + 47|76 802 + 47|52 803 + 47|35 804 + 47|91 805 + 35|54 806 + 35|27 807 + 35|77 808 + 35|84 809 + 35|71 810 + 35|46 811 + 35|12 812 + 35|16 813 + 35|51 814 + 35|39 815 + 35|52 816 + 35|61 817 + 35|15 818 + 35|92 819 + 35|94 820 + 35|53 821 + 35|66 822 + 35|58 823 + 35|44 824 + 35|19 825 + 35|25 826 + 35|24 827 + 35|23 828 + 35|69 829 + 65|45 830 + 65|86 831 + 65|95 832 + 65|83 833 + 65|31 834 + 65|11 835 + 65|35 836 + 65|34 837 + 65|18 838 + 65|74 839 + 65|32 840 + 65|91 841 + 65|26 842 + 65|22 843 + 65|49 844 + 65|37 845 + 65|14 846 + 65|79 847 + 65|55 848 + 65|85 849 + 65|76 850 + 65|47 851 + 65|98 852 + 65|48 853 + 44|74 854 + 44|16 855 + 44|86 856 + 44|27 857 + 44|48 858 + 44|24 859 + 44|94 860 + 44|15 861 + 44|65 862 + 44|69 863 + 44|66 864 + 44|12 865 + 44|22 866 + 44|34 867 + 44|23 868 + 44|79 869 + 44|92 870 + 44|98 871 + 44|31 872 + 44|37 873 + 44|18 874 + 44|54 875 + 44|45 876 + 44|46 877 + 16|18 878 + 16|55 879 + 16|92 880 + 16|22 881 + 16|79 882 + 16|98 883 + 16|26 884 + 16|74 885 + 16|45 886 + 16|86 887 + 16|76 888 + 16|31 889 + 16|47 890 + 16|32 891 + 16|83 892 + 16|91 893 + 16|48 894 + 16|49 895 + 16|85 896 + 16|34 897 + 16|65 898 + 16|14 899 + 16|95 900 + 16|37 901 + 48|71 902 + 48|61 903 + 48|52 904 + 48|95 905 + 48|76 906 + 48|37 907 + 48|91 908 + 48|51 909 + 48|77 910 + 48|84 911 + 48|34 912 + 48|49 913 + 48|18 914 + 48|83 915 + 48|11 916 + 48|47 917 + 48|26 918 + 48|35 919 + 48|32 920 + 48|55 921 + 48|14 922 + 48|85 923 + 48|19 924 + 39|15 925 + 39|65 926 + 39|79 927 + 39|19 928 + 39|69 929 + 39|53 930 + 39|44 931 + 39|31 932 + 39|45 933 + 39|54 934 + 39|46 935 + 39|92 936 + 39|98 937 + 39|16 938 + 39|24 939 + 39|58 940 + 39|94 941 + 39|25 942 + 39|71 943 + 39|66 944 + 39|12 945 + 39|27 946 + 95|58 947 + 95|11 948 + 95|39 949 + 95|44 950 + 95|19 951 + 95|94 952 + 95|35 953 + 95|83 954 + 95|71 955 + 95|91 956 + 95|54 957 + 95|77 958 + 95|53 959 + 95|52 960 + 95|14 961 + 95|84 962 + 95|49 963 + 95|85 964 + 95|32 965 + 95|23 966 + 95|25 967 + 14|35 968 + 14|76 969 + 14|94 970 + 14|25 971 + 14|46 972 + 14|58 973 + 14|84 974 + 14|23 975 + 14|11 976 + 14|71 977 + 14|12 978 + 14|77 979 + 14|32 980 + 14|19 981 + 14|61 982 + 14|44 983 + 14|54 984 + 14|85 985 + 14|91 986 + 14|51 987 + 85|53 988 + 85|49 989 + 85|76 990 + 85|71 991 + 85|44 992 + 85|94 993 + 85|11 994 + 85|12 995 + 85|39 996 + 85|91 997 + 85|77 998 + 85|52 999 + 85|54 1000 + 85|69 1001 + 85|46 1002 + 85|23 1003 + 85|51 1004 + 85|84 1005 + 85|32 1006 + 74|61 1007 + 74|95 1008 + 74|26 1009 + 74|91 1010 + 74|48 1011 + 74|14 1012 + 74|37 1013 + 74|52 1014 + 74|34 1015 + 74|39 1016 + 74|32 1017 + 74|77 1018 + 74|22 1019 + 74|51 1020 + 74|76 1021 + 74|35 1022 + 74|11 1023 + 74|85 1024 + 45|83 1025 + 45|91 1026 + 45|11 1027 + 45|51 1028 + 45|79 1029 + 45|34 1030 + 45|47 1031 + 45|98 1032 + 45|55 1033 + 45|14 1034 + 45|74 1035 + 45|48 1036 + 45|26 1037 + 45|61 1038 + 45|32 1039 + 45|85 1040 + 45|95 1041 + 52|19 1042 + 52|98 1043 + 52|54 1044 + 52|71 1045 + 52|45 1046 + 52|25 1047 + 52|65 1048 + 52|92 1049 + 52|53 1050 + 52|66 1051 + 52|39 1052 + 52|84 1053 + 52|94 1054 + 52|69 1055 + 52|24 1056 + 52|44 1057 + 49|23 1058 + 49|11 1059 + 49|39 1060 + 49|51 1061 + 49|53 1062 + 49|35 1063 + 49|61 1064 + 49|24 1065 + 49|19 1066 + 49|94 1067 + 49|12 1068 + 49|77 1069 + 49|32 1070 + 49|69 1071 + 49|76 1072 + 86|49 1073 + 86|14 1074 + 86|83 1075 + 86|32 1076 + 86|76 1077 + 86|85 1078 + 86|61 1079 + 86|77 1080 + 86|18 1081 + 86|19 1082 + 86|34 1083 + 86|35 1084 + 86|47 1085 + 86|39 1086 + 69|92 1087 + 69|16 1088 + 69|83 1089 + 69|66 1090 + 69|48 1091 + 69|24 1092 + 69|26 1093 + 69|47 1094 + 69|14 1095 + 69|45 1096 + 69|55 1097 + 69|74 1098 + 69|31 1099 + 66|26 1100 + 66|79 1101 + 66|91 1102 + 66|31 1103 + 66|34 1104 + 66|85 1105 + 66|45 1106 + 66|98 1107 + 66|86 1108 + 66|14 1109 + 66|55 1110 + 66|74 1111 + 15|45 1112 + 15|14 1113 + 15|26 1114 + 15|32 1115 + 15|18 1116 + 15|98 1117 + 15|48 1118 + 15|34 1119 + 15|66 1120 + 15|92 1121 + 15|55 1122 + 71|45 1123 + 71|24 1124 + 71|44 1125 + 71|86 1126 + 71|12 1127 + 71|79 1128 + 71|23 1129 + 71|65 1130 + 71|94 1131 + 71|27 1132 + 79|85 1133 + 79|55 1134 + 79|11 1135 + 79|83 1136 + 79|61 1137 + 79|51 1138 + 79|76 1139 + 79|47 1140 + 79|32 1141 + 76|51 1142 + 76|27 1143 + 76|44 1144 + 76|35 1145 + 76|54 1146 + 76|58 1147 + 76|61 1148 + 76|71 1149 + 19|65 1150 + 19|23 1151 + 19|46 1152 + 19|15 1153 + 19|27 1154 + 19|74 1155 + 19|44 1156 + 11|61 1157 + 11|15 1158 + 11|77 1159 + 11|71 1160 + 11|54 1161 + 11|46 1162 + 92|47 1163 + 92|22 1164 + 92|79 1165 + 92|45 1166 + 92|65 1167 + 23|46 1168 + 23|22 1169 + 23|69 1170 + 23|31 1171 + 37|95 1172 + 37|53 1173 + 37|71 1174 + 55|95 1175 + 55|14 1176 + 27|31 1177 + 1178 + 61,58,51,32,12,14,71 1179 + 58,25,54,14,12,94,32,76,39 1180 + 35,53,26,77,14,71,25,76,85,55,51,49,95 1181 + 32,91,76,11,35,61,51,77,52,19,71,84,53,58,25,44,54,94,23,12,46,69,24 1182 + 18,37,26,47,83,85,49,32,76,35,61,77,52,19,71 1183 + 39,19,84,53,58,25,54,12,69,66,31 1184 + 61,52,71,84,44,66,92 1185 + 71,84,44,46,45 1186 + 32,91,76,35,51,77,52,71,84,53,58,25,44,54,94,23,12 1187 + 48,18,37,34,26,55,47,95,83,49,32,91,11,35,61,77,52,39,71 1188 + 25,54,12,46,79,74,18 1189 + 94,65,44,39,46,66,52,15,54,71,84,92,12,77,23,27,31,16,25,58,19,69,53 1190 + 19,71,53,25,44,54,94,23,46,69,24,15,66,16,65,31,79 1191 + 49,76,11,35,77,52,39,71,54,23,12,46,69 1192 + 69,58,19,71,35,61,16,46,54 1193 + 54,16,35,94,25,15,51 1194 + 34,26,55,47,95,14,85,49,32,91,76,11,35,61,51,77,52,39,19,71,84,53,58 1195 + 76,54,77,24,46,12,27,35,53,52,61,39,58,69,94,71,91,23,51 1196 + 14,27,83,85,37,65,16,18,79,22,48,66,86,92,47 1197 + 19,52,61,58,44,84,51 1198 + 27,15,66,16,92,31,98,79,74,86,18,37,26,55,85 1199 + 94,46,27,66,65,45,98,74,86,48,18,37,34 1200 + 66,46,53,52,77,35,16,27,61 1201 + 18,37,34,55,47,95,83,14,85,49,32,91,76,11,35,61,51,77,39,71,84 1202 + 61,51,77,52,39,19,71,84,53,58,25,54,94,23,12,46,69,24,27,15,66,16,92 1203 + 98,74,86,22,48,18,37,34,26,55,47,95,83,14,85,49,32,91,76,11,51 1204 + 49,32,51,39,84,53,69 1205 + 46,15,66,65,45,98,86,48,18,34,55,47,95 1206 + 25,94,23,12,66,16,92,31,79,86,22,48,18 1207 + 32,91,76,51,77,52,39,19,53,58,25,54,94,23,12,69,24 1208 + 34,26,55,47,83,14,76,35,61,51,77,39,19,84,53 1209 + 34,18,95,74,35,37,47,52,76,32,22,48,51,86,77,85,11,55,83,14,26 1210 + 25,44,54,23,46,69,27,16,92,31,45,98,22,48,18 1211 + 91,58,11,76,26,49,19,95,14,61,39 1212 + 48,18,37,34,55,47,95,14,85,49,32,91,76,35,61,51,77,52,39,19,71 1213 + 31,66,27,79,23,86,22,92,15,44,54,94,16,37,12,18,45 1214 + 16,24,66,53,12,77,19,65,15,51,27,94,23,52,39,46,58,69,92,84,71,54,25 1215 + 44,54,94,12,46,24,27,15,92,31,86,22,37 1216 + 39,71,53,54,15,45,98 1217 + 69,53,44,54,77,58,27,39,61,25,12,94,23,51,35,84,71,15,46,66,16,19,52 1218 + 94,46,69,31,66,84,86,58,98,16,24 1219 + 55,47,95,49,76,51,19,71,84,58,44 1220 + 12,46,69,16,92,65,31,45,98,79,74,86,22,48,18,37,34,26,47 1221 + 52,11,77,58,27,35,39,24,44,19,46,23,54,53,71,76,12 1222 + 71,66,94,15,84,46,61,52,11,19,53,23,51,69,27,54,58,12,39,44,24 1223 + 79,86,22,18,37,47,83,14,91,76,51 1224 + 79,48,47,95,11 1225 + 12,24,46,34,66,74,86,98,69,37,45,92,26,55,47,18,65,22,16 1226 + 71,65,54,15,39,69,98,23,46,58,94,24,45 1227 + 79,74,86,83,14 1228 + 35,19,84,69,27 1229 + 54,46,66,31,98,48,18,37,34 1230 + 18,65,34,14,55,66,24 1231 + 94,46,27,65,98,22,26 1232 + 66,69,45,46,79,23,86,92,58,94,84,53,24,31,44,54,16,12,65,27,98 1233 + 27,66,92,65,31,98,86,18,26,55,95,83,85 1234 + 86,34,79,83,66,55,22,16,32 1235 + 85,49,32,76,11,77,52,39,84,53,25,54,94,12,46 1236 + 74,47,31,22,92,18,79,37,48,14,16,85,98,83,34,45,65,95,66,27,86 1237 + 86,22,18,37,34,26,47,95,83,85,49,32,11,35,61,77,39 1238 + 79,55,95,49,91 1239 + 54,94,23,12,46,69,24,27,15,66,16,65,31,45,98,79,74,86,22,48,18,37,34 1240 + 27,53,58,92,69,79,94 1241 + 83,14,85,49,32,91,76,11,35,61,51,77,52,39,19,71,84,53,58,44,54,94,23 1242 + 23,12,46,69,24,27,15,66,16,92,65,31,98,79,74,86,22,48,18,37,34,26,55 1243 + 53,54,19,85,46,91,84,71,44,52,23,51,77,76,39,32,25,94,49,11,61 1244 + 32,35,55,22,74 1245 + 35,61,51,77,39,19,71,84,53,58,25,44,54,94,23,12,46,69,24,27,15,66,16 1246 + 95,74,11,49,85,83,45,34,32,61,37,35,14,55,18,79,26,22,98,86,91,47,48 1247 + 66,31,45,98,22,48,47,95,83,14,85 1248 + 61,51,77,52,39,19,71,84,53,58,25,54,94,23,12,46,69,27,15,16,92 1249 + 85,49,91,35,61,77,52,39,19,71,84,53,58,25,94,12,46 1250 + 47,26,79,65,34,37,74,83,98,22,45,55,18,16,66,69,15,86,95 1251 + 61,51,46,23,12,25,85,58,52,39,54,19,76,91,94,32,35 1252 + 48,37,95,85,32,91,76,51,71 1253 + 84,58,25,44,54,94,23,12,46,69,24,27,15,66,16,92,65,31,98,79,86 1254 + 77,54,14,35,49,84,76,51,11,44,94,95,52,71,19 1255 + 69,24,27,15,66,16,92,65,31,45,98,79,74,22,48,18,37,34,26,55,47,95,83 1256 + 61,71,53,44,46,24,66 1257 + 66,16,45,18,55,47,83,85,32 1258 + 69,24,27,66,98,79,86,22,48,18,37,34,26,55,47,95,83 1259 + 85,19,71,84,44,11,53,47,77,49,76,54,14,91,25 1260 + 11,83,61,77,51,35,58,94,95 1261 + 49,32,91,76,11,35,61,51,77,52,39,19,84,58,25,44,94,23,12,46,69 1262 + 25,44,54,94,23,12,24,27,15,66,16,92,65,31,79,74,86,22,18 1263 + 71,49,48,95,76,83,34,47,37 1264 + 14,49,32,91,61,77,52,19,84,58,44 1265 + 45,44,79,53,16,23,15,58,92,31,66,22,98,74,25,24,46,69,65,86,54,27,94 1266 + 11,61,52,53,58,94,66 1267 + 77,84,54,69,71,76,24,23,94,11,44,27,91,12,61,53,35,19,39,46,25 1268 + 92,65,31,45,74,86,48,18,37,34,26,55,47,95,83,14,85,91,76 1269 + 46,24,15,66,16,92,98,79,86,18,34,26,55 1270 + 11,35,61,51,77,52,39,19,71,53,58,25,44,54,94,23,12,69,24,15,66 1271 + 49,76,39,53,58 1272 + 71,84,53,58,25,44,54,94,23,12,69,24,27,15,66,16,92,65,31,45,98,79,74 1273 + 14,25,47,32,54,19,85,95,58 1274 + 53,12,25,19,15,54,52,31,44,39,69 1275 + 32,91,76,35,61,51,77,52,39,19,84,58,25,44,54,94,23,12,46,69,24 1276 + 55,83,91,49,86,22,76,37,32,14,39,47,34 1277 + 94,23,12,46,69,24,27,66,16,92,65,31,45,98,79,74,86,22,48,18,37,34,26 1278 + 55,83,49,32,35,39,19 1279 + 19,16,92,46,31,69,44,52,39,12,71,45,53,15,84,66,58 1280 + 71,84,35,53,58,11,91,61,51,83,25,14,47,77,32,76,44,55,95,52,19,49,39 1281 + 24,27,65,31,45,98,22,48,18,34,26,55,47,95,14 1282 + 46,23,58,31,98,12,92,24,45,54,71,94,19,16,53,25,39,44,69 1283 + 92,65,98,18,47,83,14,85,76 1284 + 26,32,34,83,49,91,52,85,47,11,51,76,74,35,48 1285 + 65,45,98,79,74,22,48,18,55,47,95,83,14,85,49,32,91,76,11 1286 + 47,39,26,22,49,34,76 1287 + 77,52,84,54,23,46,27,16,31 1288 + 15,66,16,92,65,31,98,74,86,48,18,37,34,55,47 1289 + 92,55,48,18,27,45,65,24,66,83,69 1290 + 22,18,37,95,85,49,32,35,61,77,19 1291 + 49,91,77,71,58,25,54,94,69 1292 + 39,51,85,77,49,19,61,18,22,37,14,34,11 1293 + 47,85,32,91,76,52,39,19,71,84,53,44,54 1294 + 76,35,61,52,39,71,53,58,25,94,12,46,24,27,15 1295 + 61,51,84,25,46,35,76,32,52,12,23,69,19,94,58,11,39,53,24,54,77,44,91 1296 + 31,45,66,49,79,95,26,98,65,48,14,55,22,74,92 1297 + 92,46,48,26,66 1298 + 25,44,94,12,65,31,79,22,18 1299 + 45,98,79,55,14,34,26,83,74,15,86,92,85,49,18,66,65,16,22 1300 + 25,32,53,58,94,23,19,54,71,11,39,77,52,84,69,76,49 1301 + 52,39,84,53,25,44,12,24,15,66,16,92,65,31,45 1302 + 52,39,19,58,44,54,94,23,12,69,24,15,66,16,92,31,45 1303 + 95,66,47,26,18,83,32,45,85,98,86,37,55 1304 + 31,45,86,48,37,26,95,83,14,85,32,76,35 1305 + 94,24,92,58,19,54,69,16,84,53,27,51,77,12,15,61,39,25,52,23,71,66,44 1306 + 44,54,94,23,12,46,69,24,66,92,31,98,79 1307 + 66,16,92,65,45,98,79,74,86,22,48,18,37,26,55,47,95,83,14,49,32 1308 + 98,18,47,14,85,49,51 1309 + 55,85,91,11,84 1310 + 32,91,11,35,51,77,52,39,19,84,58,54,94,23,69 1311 + 83,84,11,26,77,34,14,85,71,52,18 1312 + 32,49,91,76,83,94,71,19,23,61,58 1313 + 44,69,16,98,65,58,12,84,94,25,79,27,31,54,46,24,86,66,74,45,92 1314 + 65,94,15,12,45,74,23,58,16,84,86,31,69,24,98,92,66 1315 + 61,51,77,52,19,71,84,53,25,44,94,23,12,46,69,24,27,15,66 1316 + 79,34,55,61,98,45,47,74,83,49,76,11,32 1317 + 86,22,48,18,37,83,85,32,91,76,11,35,61,51,77,52,39 1318 + 65,45,86,55,95,85,32,76,11 1319 + 15,66,16,92,31,45,98,79,74,86,22,48,18,37,34,26,95,83,14,85,49 1320 + 54,58,53,16,71,15,98,69,94,65,46,31,66,25,92,84,44,24,19,23,27 1321 + 26,61,37,14,71,51,19,76,91 1322 + 15,92,79,74,86,22,48,26,55,83,14,85,49 1323 + 26,74,83,76,49,31,47,35,37,95,86 1324 + 71,83,95,34,19,39,14,51,85,49,52,61,32,48,55 1325 + 69,15,66,92,79,74,37,34,55,47,95 1326 + 47,51,19,39,35,85,84,91,26,71,49,55,25,11,52 1327 + 26,14,76,32,37,95,86,35,55,79,83,11,91,47,34,22,31,98,85,45,48 1328 + 35,53,19,32,91,46,12,25,11,61,54,51,71 1329 + 98,79,74,86,22,18,37,34,26,55,47,95,83,85,49,32,91,11,51 1330 + 79,22,34,47,32,11,77 1331 + 31,69,45,95,83,16,55,65,98,22,26,37,74 1332 + 74,86,22,37,34,26,55,95,85,32,91,76,11,77,52 1333 + 39,19,71,53,25,44,54,46,69,24,27,66,16,65,31,45,98 1334 + 47,51,11,77,58,85,52 1335 + 45,48,37,83,49,32,91 1336 + 85,26,77,95,19,18,51,34,55,52,91,32,11,84,39 1337 + 79,45,18,94,48,74,16,12,92,98,37,26,27,23,69,46,34,86,31 1338 + 48,34,14,45,86,98,18,85,47,22,55,76,79,32,31,91,35,83,37 1339 + 76,77,52,71,44 1340 + 26,55,47,95,83,14,85,49,32,91,76,11,35,61,51,77,52,39,19,71,84,58,25 1341 + 45,98,79,86,48,18,34,26,47,95,85,91,61 1342 + 24,44,19,71,15,12,27,51,52,92,84 1343 + 69,24,27,65,98,22,48,18,55,47,83 1344 + 61,34,11,74,91,51,48,55,52,86,37,85,14,49,95,76,22 1345 + 71,46,27,15,66,92,79 1346 + 58,46,16,31,27,54,53,66,12,23,71,52,84,25,44,94,77 1347 + 61,77,39,19,71,84,25,44,54,94,24,27,15,66,16 1348 + 51,52,15,12,24,66,54,35,46,16,69,84,53 1349 + 74,86,22,48,18,34,26,55,47,95,83,14,85,49,32,91,76,11,35,61,51,77,52 1350 + 34,26,47,14,32,76,35,39,71 1351 + 37,26,47,83,85,49,76,11,35,61,51,77,53 1352 + 66,24,98,86,15 1353 + 91,76,35,61,51,52,39,19,53,58,54,94,23,46,27 1354 + 16,92,45,74,86,22,18,37,34,26,55,85,49,32,91 1355 + 12,74,58,79,23,31,22,25,86 1356 + 98,79,22,48,18,14,85,49,32,76,11,61,51 1357 + 34,26,55,47,95,83,14,85,49,32,91,76,11,35,61,51,52,39,19,71,84,53,58 1358 + 51,52,39,58,25,44,54,12,46,69,24,66,16,92,65 1359 + 24,44,58,12,46,92,22,79,86,74,54,65,23 1360 + 86,22,18,26,95,32,91,76,51 1361 + 71,54,69,24,15,66,16,31,45,98,74 1362 + 15,92,65,31,45,98,79,74,86,22,48,18,34,26,55,95,14,85,49 1363 + 53,44,54,94,23,12,46,69,24,27,15,66,92,98,74,86,22 1364 + 16,92,65,31,45,98,22,18,37,34,55,95,83,14,32 1365 + 34,47,95,83,14,85,49,91,76,11,35,51,77,52,19,71,84,53,58 1366 + 55,45,76,37,35,83,31
+166
2024/day_5/src/main.rs
··· 1 + #![feature(test)] 2 + 3 + extern crate test; 4 + 5 + use std::fs; 6 + 7 + #[derive(Debug)] 8 + enum Input { 9 + Rule(String, String), 10 + Update(String), 11 + None 12 + } 13 + 14 + impl Input { 15 + fn is_rule(&self) -> bool { 16 + match *self { 17 + Input::Rule(_, _) => true, 18 + _ => false 19 + } 20 + } 21 + 22 + fn is_none(&self) -> bool { 23 + match *self { 24 + Input::None => true, 25 + _ => false 26 + } 27 + } 28 + } 29 + 30 + fn part_1(input: &Vec<Input>) { 31 + let rules = input.iter().filter(|i| i.is_rule()).collect::<Vec<&Input>>(); 32 + 33 + let mut sum: usize = 0; 34 + 35 + for item in input { 36 + match item { 37 + Input::Update(update) => { 38 + let mut c = true; 39 + for rule in rules.clone() { 40 + match rule { 41 + Input::Rule(before, after) => { 42 + if update.find(before).is_some() && update.find(after).is_some() { 43 + let i_b = update.find(before).unwrap(); 44 + let i_a = update.find(after).unwrap(); 45 + 46 + if i_b > i_a { 47 + c = false; 48 + } 49 + } 50 + }, 51 + _ => () 52 + } 53 + }; 54 + 55 + if c { 56 + let sp = update.split(',').collect::<Vec<&str>>(); 57 + sum += sp[sp.len() / 2].parse::<usize>().unwrap(); 58 + } 59 + }, 60 + _ => () 61 + } 62 + } 63 + 64 + println!("Part 1: {sum}") 65 + 66 + } 67 + 68 + fn part_2(input: &Vec<Input>) { 69 + let rules = input.iter().filter(|i| i.is_rule()).collect::<Vec<&Input>>(); 70 + 71 + let mut sum: usize = 0; 72 + 73 + for item in input { 74 + match item { 75 + Input::Update(update) => { 76 + let mut updated = update.split(',').collect::<Vec<&str>>(); 77 + let mut c = true; 78 + for _ in 0..2 { 79 + for rule in rules.clone() { 80 + match rule { 81 + Input::Rule(before, after) => { 82 + if update.find(before).is_some() && update.find(after).is_some() { 83 + let b_idx = updated.iter().position(|i| *i == before).unwrap_or(usize::MAX); 84 + let a_idx = updated.iter().position(|i| *i == after).unwrap_or(usize::MAX); 85 + 86 + if b_idx > a_idx { 87 + updated = [&updated[0..a_idx], [updated[b_idx]].as_slice(), &updated[a_idx..b_idx], &updated[b_idx+1..]].concat().to_vec(); 88 + c = false; 89 + } 90 + } 91 + }, 92 + _ => () 93 + } 94 + }; 95 + } 96 + 97 + if !c { 98 + sum += updated[updated.len() / 2].parse::<usize>().unwrap(); 99 + } 100 + }, 101 + _ => () 102 + } 103 + } 104 + 105 + println!("Part 2: {sum}") 106 + } 107 + 108 + fn parse_input(input: &str) -> Option<Vec<Input>> { 109 + Some(input.lines().map(|line| { 110 + if line.find('|').is_some() { 111 + let mut s = line.split('|'); 112 + Input::Rule(s.next().unwrap().to_string(), s.next().unwrap().to_string()) 113 + } else { 114 + if !line.is_empty() { 115 + Input::Update(line.to_string()) 116 + } else { 117 + Input::None 118 + } 119 + } 120 + }).filter(|i| !i.is_none()).collect()) 121 + } 122 + 123 + fn main() { 124 + let file = fs::read_to_string("./input.txt").expect("Couldn't read file"); 125 + 126 + let input = parse_input(file.as_str()).unwrap(); 127 + part_1(&input); 128 + part_2(&input); 129 + } 130 + 131 + #[test] 132 + fn test_main() { 133 + let file = fs::read_to_string("./text_input.txt").expect("Couldn't read file"); 134 + 135 + let input = parse_input(file.as_str()).unwrap(); 136 + part_1(&input); 137 + part_2(&input); 138 + } 139 + 140 + #[bench] 141 + fn full(b: &mut test::Bencher) { 142 + b.iter(|| main()); 143 + } 144 + 145 + #[bench] 146 + fn input_only(b: &mut test::Bencher) { 147 + let input = fs::read_to_string("./input.txt").expect("Couldn't read file"); 148 + 149 + b.iter(|| parse_input(input.as_str())); 150 + } 151 + 152 + #[bench] 153 + fn part_one(b: &mut test::Bencher) { 154 + let file = fs::read_to_string("./input.txt").expect("Couldn't read file"); 155 + 156 + let input = parse_input(file.as_str()).unwrap(); 157 + b.iter(|| part_1(&input)); 158 + } 159 + 160 + #[bench] 161 + fn part_two(b: &mut test::Bencher) { 162 + let file = fs::read_to_string("./input.txt").expect("Couldn't read file"); 163 + 164 + let input = parse_input(file.as_str()).unwrap(); 165 + b.iter(|| part_2(&input)); 166 + }
+28
2024/day_5/text_input.txt
··· 1 + 47|53 2 + 97|13 3 + 97|61 4 + 97|47 5 + 75|29 6 + 61|13 7 + 75|53 8 + 29|13 9 + 97|29 10 + 53|29 11 + 61|53 12 + 97|53 13 + 61|29 14 + 47|13 15 + 75|47 16 + 97|75 17 + 47|61 18 + 75|61 19 + 47|29 20 + 75|13 21 + 53|13 22 + 23 + 75,47,61,53,29 24 + 97,61,53,29,13 25 + 75,29,13 26 + 75,97,47,61,53 27 + 61,13,29 28 + 97,13,75,29,47
+1
2024/day_6/.gitignore
··· 1 + /target
+7
2024/day_6/Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "day_6" 7 + version = "0.1.0"
+6
2024/day_6/Cargo.toml
··· 1 + [package] 2 + name = "day_6" 3 + version = "0.1.0" 4 + edition = "2024" 5 + 6 + [dependencies]
+130
2024/day_6/input.txt
··· 1 + ........#.............................................#.........#..............#.......#....................#....................# 2 + ......................#........#........................#.............##............................#.#.............#..........#.. 3 + ....#..................................#..................#.........#....#..............#..#......................#........#...#.. 4 + .....#...#...............#................#..........................#......#.....................#.......................#....... 5 + ......................................................##.#....#..................................................................# 6 + #....#....................#..................................#.....................................#......................#....... 7 + .......#...........................#.......................#......#...#.................................................#...#..... 8 + ....................##..........................#................#..........................#.#..................#....#.........#. 9 + #..................................#...............#...............#.........................#............##...................... 10 + .............................#....................................#...............#.........#..........#.......................#.. 11 + .................................#............###.......#............##......#...............................#...............#.#.. 12 + .#..........................................#.......#.......................##..#........#........#...............#............... 13 + ......#...#............#.#..............#...................#..........................................................##......... 14 + #................##....................................................................#........#.................#...#........... 15 + ...#..........#..........................##......#....#..............................#......................................#..... 16 + ..............................##.#..........................................................#..............................#...... 17 + ......#...........#....#..................#............#....................................................................#..... 18 + .....................#........................#.......................................................#........................... 19 + ...................#.#..........................................................................................#.#............... 20 + .........................................##.........................................................#.......#...###......#........ 21 + ...............................................................##.......................#..........................#.............. 22 + ...#...........#.................#..............#......#.....#..........................#....................#....#............... 23 + .................................#................#................#..............................................#.......##.....# 24 + ........#..........................#................#.......................#...................#................................. 25 + .............................#.............................#..........#.........................#........#........................ 26 + ....#................#.#................#...........................................................#...#....#......#......#...... 27 + ........#..............................#...............................#.................#........................................ 28 + ...........................................#..#........#...#...........#..#.............#......................................... 29 + .#.................#.#................................#................#.#..................................#........#............ 30 + .......#..........................................#.................................................................#............. 31 + ...................#....................................................#..#...............................................#...... 32 + ...#.#........#...#.....#.....................................................................................................#... 33 + ......#.........................#......................#.............#.....................#...................................... 34 + ..........................#............#.................................#..#..........#........#......................#.......... 35 + ...#..#......#.......................#........................#................................................................... 36 + ............#...........#................#..............#......................................................................... 37 + .#........#....#.........................................#........................................#............................... 38 + ...#......................##.........#.......#.#...........#................................................#...#................. 39 + ...........#......#.........#....#.....#.......................................................#.............#.................... 40 + .............#...#..............................................#.........#.....##....................#...#.........#............. 41 + ...............#................................#..........................................#.....#.#.........................#...# 42 + ................#.....#..#.............#..............#..............#.......#.................................................... 43 + ......#.........................................................................................................#.........##...... 44 + ..#...........................#.#...........................................#..#.....#............................................ 45 + ...#...#..................#..................................#.........#...................#..................................#... 46 + ............#..#.....................#.........................................#.......#..................................#....... 47 + ...#.......................................................................#.............................#........................ 48 + ......#..................#....................................#......##........................................................... 49 + .#...............#.....#..........................................................................................#............... 50 + ...#.............#.........................#.....................#...#..........#....#............................#............... 51 + ...#............................#.......#...........#.........#........#.....#...........#...................................#.... 52 + .....................#...................#................................#...............................#......#.........#..##.. 53 + .............#........................................................................................#........................##. 54 + .....#.......#.......#............................................................................................................ 55 + ............................................#................................................................#..............#..... 56 + ....#..#......................................................#...................................................#............... 57 + .................................#...##..................#.................................................#....#................. 58 + ........#...................................#...#..........................................................#...................... 59 + ........................#........##...........#.......#........#...................................#.............................. 60 + ...........#...#...................................................#..............#......#...............#.#..................#... 61 + ........#.............................................#........................................................................... 62 + ........#................#......#..........#..#........#.#.......#...#........................#..#......................#.......#. 63 + .......#..........................................................................................................#.....#.....#... 64 + ......................##....................#.....#.................#...........#.......................#.##..........#......#.... 65 + ....................................##....................................................................#.................#..... 66 + ..#.................................#.#...........#............................................#....#............................. 67 + #...................................#...........................................#............#.........#...............#.......... 68 + .......................#.............................................................#..........#...#.............#.....#......... 69 + #..................#.#.............................................................................#.................#............ 70 + .....................#......#.......#...........#..........................................^...............................#...... 71 + ................................#......................#.#.....#..............#..................#....#.#......#....#............. 72 + ............................................................................#........#.....................................#...... 73 + .............#......................................................#...................................#......##..#....#......... 74 + ...............#.................#...................#...............#............................................................ 75 + ..............#...........#..#...........................................#...................................#..........#......... 76 + ..........#...........................#...................#..............#...#.......#..........#...................#............. 77 + .............#.#..................................#....#..#............#.....................#................#...#.....#......... 78 + ...................#..........................................................#............##..................................... 79 + ...........................................#............#........................................................................# 80 + ..#..............................#....#........................................................................................... 81 + ..#..#............#...........................#...#...........#............#.....#.................#.............................. 82 + ....#...................#.........#............................................................................................... 83 + .......#..........................#....................................##........#.................##...#.#........#..#........... 84 + .#........................#....#.......#.....#...................#.............................................#.................. 85 + ..#...............................................................#................................................#.............. 86 + .....#........................................#................................................................................... 87 + ..........................................#..........................................................#............................ 88 + ....................###.........................#............................#...#...........#............#....................... 89 + .....#.....#...............#........#.#....#...................#...........#........#...........#................................. 90 + ................................................................................................#...##............................ 91 + ......................#............#.........................#.......................#.....#...........#...#.#.................... 92 + ............................#....................#..................#..............#..................................#........... 93 + ...........................#...................................#..............................................................#... 94 + ..................#................#.....................#...................#........#..............#............................ 95 + ............#.............#.....................#..................#.........#......................#............#............#... 96 + ....#..........................#...............................................................................................#.. 97 + ................#.....................................#.............................#...........#........................#........ 98 + #.##...........#.........................................#...............#..........................................#.#........... 99 + ........................................#..............#.....................#............#.....#................................. 100 + .......#....##..#..#.....#........................................................................................................ 101 + ....##.............#..............................#............................................................................... 102 + .....#........................#.........#..#......#........#......................#.......#..............#..........#.......#..... 103 + ..#....#.........................#.#....................#..#.......#.............#..................#........#..................#. 104 + ..........##....#........................................................................#........................................ 105 + ........#......#................................................................................................#................# 106 + .....#.......#...#.............#....................................#..#........................#...#..............#....#......... 107 + .............#...................................................##...#........................................................... 108 + ..............#.............................................#.............#................#.............#..............#......... 109 + ..#....#..........#.....#......#......................#................................#...............................#.......... 110 + .................................................................................##......#...........................#.....#...... 111 + ..#....#..........#.......#.........................................#...............#..#............................#........#.... 112 + ...........#........#.#....................#........#.....................................#..................#.................... 113 + .......#............#................#...........#.............#......#.........#...........................#..................... 114 + #.#....#.#...............#....#.....#.......................#...............................#...................##...#............ 115 + .................##...#.................................................................#...........................#............. 116 + .....#........................................#.........#...................................................#..................... 117 + ....................#.....................#................................................#...##.....................#........... 118 + ...............#...............................................................#....#............................................. 119 + .................#................#...#.....................................#......#....................#...............#.#....... 120 + ...................#............................................#..#....#..#........#...............................#.........#... 121 + ..#........#...............#..................#.....#..................#.....................................#........##...#...... 122 + .....#.....#....#.....#................#.#.....................##.............................................................#... 123 + ................#............#......#......#.......................................................#....................#........# 124 + ........#..............#..#......................................................................##.....##........................ 125 + .........#.............................#.........#.......................................#..........................#.##.......... 126 + .#...................#........................................................#....#......................................#....... 127 + ....#..........#.....#.........................................................................................#.................. 128 + .......#.............................#............#.........................#....#....#........#......#.....#.......#............. 129 + ..#.......#........................#........................#..................................................................... 130 + ........................#...............................#.#.............#................................#..................#.....
+166
2024/day_6/src/main.rs
··· 1 + #![feature(test)] 2 + 3 + extern crate test; 4 + 5 + use std::fs; 6 + 7 + fn walk_guard(mut grid: Vec<Vec<char>>) -> (Vec<Vec<char>>, bool) { 8 + println!("walking"); 9 + let mut x: i32 = -1; 10 + let y = grid.iter().position(|line| { 11 + let t = line.iter().position(|c| *c == '<' || *c == '>' || *c == 'v' || *c == '^'); 12 + if t.is_some() { 13 + x = t.unwrap().try_into().unwrap(); 14 + true 15 + } else { 16 + false 17 + } 18 + }); 19 + 20 + if y.is_none() { 21 + return (grid, true) 22 + } 23 + 24 + let real_x: usize = x.try_into().unwrap(); 25 + let real_y: usize = y.unwrap(); 26 + 27 + match grid[real_y][real_x] { 28 + '^' => { 29 + if real_y.checked_sub(1).is_some() { 30 + let ahead = grid[real_y-1][real_x]; 31 + if ahead == '.' { 32 + grid[real_y-1][real_x] = '^'; 33 + grid[real_y][real_x] = 'X'; 34 + } else { 35 + grid[real_y][real_x] = '>'; 36 + } 37 + } else { 38 + grid[real_y][real_x] = 'X'; 39 + } 40 + }, 41 + '>' => { 42 + if (real_x + 1) < grid[real_y].len() { 43 + let ahead = grid[real_y][real_x+1]; 44 + if ahead == '.' { 45 + grid[real_y][real_x+1] = '>'; 46 + grid[real_y][real_x] = 'X'; 47 + } else { 48 + grid[real_y][real_x] = 'v'; 49 + } 50 + } else { 51 + grid[real_y][real_x] = 'X'; 52 + } 53 + }, 54 + 'v' => { 55 + if (real_y + 1) < grid.len() { 56 + let ahead = grid[real_y+1][real_x]; 57 + if ahead == '.' { 58 + grid[real_y+1][real_x] = 'v'; 59 + grid[real_y][real_x] = 'X'; 60 + } else { 61 + grid[real_y][real_x] = '<'; 62 + } 63 + } else { 64 + grid[real_y][real_x] = 'X'; 65 + } 66 + }, 67 + '<' => { 68 + if real_x.checked_sub(1).is_some() { 69 + let ahead = grid[real_y][real_x-1]; 70 + if ahead == '.' { 71 + grid[real_y][real_x-1] = '<'; 72 + grid[real_y][real_x] = 'X'; 73 + } else { 74 + grid[real_y][real_x] = '^'; 75 + } 76 + } else { 77 + grid[real_y][real_x] = 'X'; 78 + } 79 + }, 80 + _ => {} 81 + }; 82 + (grid, false) 83 + } 84 + 85 + fn part_1(input: &Vec<Vec<char>>) { 86 + let mut grid = input.to_vec(); 87 + let mut c = false; 88 + 89 + while !c { 90 + (grid, c) = walk_guard(grid); 91 + for line in &grid { 92 + println!("{:?}", line); 93 + } 94 + } 95 + 96 + let mut sum: usize = 0; 97 + for line in grid { 98 + for c in line { 99 + if c == 'X' { 100 + sum += 1; 101 + } 102 + } 103 + } 104 + 105 + println!("Part 1: {sum}") 106 + } 107 + 108 + fn part_2(input: &Vec<Vec<char>>) { 109 + 110 + } 111 + 112 + fn parse_input(input: &str) -> Option<Vec<Vec<char>>> { 113 + Some( 114 + input.lines().map( 115 + |line| 116 + line.chars().collect() 117 + ).collect() 118 + ) 119 + } 120 + 121 + fn main() { 122 + let file = fs::read_to_string("./input.txt").expect("Couldn't read file"); 123 + 124 + let input = parse_input(file.as_str()).unwrap(); 125 + part_1(&input); 126 + part_2(&input); 127 + } 128 + 129 + #[test] 130 + fn test_main() { 131 + let file = fs::read_to_string("./test_input.txt").expect("Couldn't read file"); 132 + 133 + let input = parse_input(file.as_str()).unwrap(); 134 + 135 + println!("{:?}", input); 136 + part_1(&input); 137 + part_2(&input); 138 + } 139 + 140 + #[bench] 141 + fn full(b: &mut test::Bencher) { 142 + b.iter(|| main()); 143 + } 144 + 145 + #[bench] 146 + fn input_only(b: &mut test::Bencher) { 147 + let input = fs::read_to_string("./input.txt").expect("Couldn't read file"); 148 + 149 + b.iter(|| parse_input(input.as_str())); 150 + } 151 + 152 + #[bench] 153 + fn part_one(b: &mut test::Bencher) { 154 + let file = fs::read_to_string("./input.txt").expect("Couldn't read file"); 155 + 156 + let input = parse_input(file.as_str()).unwrap(); 157 + b.iter(|| part_1(&input)); 158 + } 159 + 160 + #[bench] 161 + fn part_two(b: &mut test::Bencher) { 162 + let file = fs::read_to_string("./input.txt").expect("Couldn't read file"); 163 + 164 + let input = parse_input(file.as_str()).unwrap(); 165 + b.iter(|| part_2(&input)); 166 + }
+10
2024/day_6/test_input.txt
··· 1 + ....#..... 2 + .........# 3 + .......... 4 + ..#....... 5 + .......#.. 6 + .......... 7 + .#..^..... 8 + ........#. 9 + #......... 10 + ......#...
+100
2024/flake.lock
··· 1 + { 2 + "nodes": { 3 + "fenix": { 4 + "inputs": { 5 + "nixpkgs": [ 6 + "nixpkgs" 7 + ], 8 + "rust-analyzer-src": "rust-analyzer-src" 9 + }, 10 + "locked": { 11 + "lastModified": 1732689334, 12 + "narHash": "sha256-yKI1KiZ0+bvDvfPTQ1ZT3oP/nIu3jPYm4dnbRd6hYg4=", 13 + "owner": "nix-community", 14 + "repo": "fenix", 15 + "rev": "a8a983027ca02b363dfc82fbe3f7d9548a8d3dce", 16 + "type": "github" 17 + }, 18 + "original": { 19 + "owner": "nix-community", 20 + "repo": "fenix", 21 + "type": "github" 22 + } 23 + }, 24 + "flake-utils": { 25 + "inputs": { 26 + "systems": "systems" 27 + }, 28 + "locked": { 29 + "lastModified": 1731533236, 30 + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 31 + "owner": "numtide", 32 + "repo": "flake-utils", 33 + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 34 + "type": "github" 35 + }, 36 + "original": { 37 + "owner": "numtide", 38 + "repo": "flake-utils", 39 + "type": "github" 40 + } 41 + }, 42 + "nixpkgs": { 43 + "locked": { 44 + "lastModified": 1733064805, 45 + "narHash": "sha256-7NbtSLfZO0q7MXPl5hzA0sbVJt6pWxxtGWbaVUDDmjs=", 46 + "owner": "NixOS", 47 + "repo": "nixpkgs", 48 + "rev": "31d66ae40417bb13765b0ad75dd200400e98de84", 49 + "type": "github" 50 + }, 51 + "original": { 52 + "owner": "NixOS", 53 + "ref": "nixpkgs-unstable", 54 + "repo": "nixpkgs", 55 + "type": "github" 56 + } 57 + }, 58 + "root": { 59 + "inputs": { 60 + "fenix": "fenix", 61 + "flake-utils": "flake-utils", 62 + "nixpkgs": "nixpkgs" 63 + } 64 + }, 65 + "rust-analyzer-src": { 66 + "flake": false, 67 + "locked": { 68 + "lastModified": 1732633904, 69 + "narHash": "sha256-7VKcoLug9nbAN2txqVksWHHJplqK9Ou8dXjIZAIYSGc=", 70 + "owner": "rust-lang", 71 + "repo": "rust-analyzer", 72 + "rev": "8d5e91c94f80c257ce6dbdfba7bd63a5e8a03fa6", 73 + "type": "github" 74 + }, 75 + "original": { 76 + "owner": "rust-lang", 77 + "ref": "nightly", 78 + "repo": "rust-analyzer", 79 + "type": "github" 80 + } 81 + }, 82 + "systems": { 83 + "locked": { 84 + "lastModified": 1681028828, 85 + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 86 + "owner": "nix-systems", 87 + "repo": "default", 88 + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 89 + "type": "github" 90 + }, 91 + "original": { 92 + "owner": "nix-systems", 93 + "repo": "default", 94 + "type": "github" 95 + } 96 + } 97 + }, 98 + "root": "root", 99 + "version": 7 100 + }
+35
2024/flake.nix
··· 1 + { 2 + description = "A basic flake with a shell"; 3 + inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; 4 + inputs.flake-utils.url = "github:numtide/flake-utils"; 5 + inputs.fenix = { 6 + url = "github:nix-community/fenix"; 7 + inputs.nixpkgs.follows = "nixpkgs"; 8 + }; 9 + 10 + outputs = { nixpkgs, flake-utils, fenix, ... }: 11 + flake-utils.lib.eachDefaultSystem (system: 12 + let 13 + pkgs = import nixpkgs { 14 + inherit system; 15 + overlays = [ fenix.overlays.default ]; 16 + }; 17 + in 18 + { 19 + devShells.default = pkgs.mkShell { 20 + packages = [ 21 + (pkgs.fenix.complete.withComponents [ 22 + "cargo" 23 + "clippy" 24 + "rust-src" 25 + "rustc" 26 + "rustfmt" 27 + "rust-analyzer" 28 + ]) 29 + pkgs.bacon 30 + pkgs.pkg-config 31 + pkgs.openssl 32 + ]; 33 + }; 34 + }); 35 + }
+2
2025/.gitignore
··· 1 + /target 2 + inputs
+768
2025/Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "aho-corasick" 7 + version = "1.1.4" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" 10 + dependencies = [ 11 + "memchr", 12 + ] 13 + 14 + [[package]] 15 + name = "alloca" 16 + version = "0.4.0" 17 + source = "registry+https://github.com/rust-lang/crates.io-index" 18 + checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" 19 + dependencies = [ 20 + "cc", 21 + ] 22 + 23 + [[package]] 24 + name = "anes" 25 + version = "0.1.6" 26 + source = "registry+https://github.com/rust-lang/crates.io-index" 27 + checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" 28 + 29 + [[package]] 30 + name = "anstream" 31 + version = "0.6.21" 32 + source = "registry+https://github.com/rust-lang/crates.io-index" 33 + checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" 34 + dependencies = [ 35 + "anstyle", 36 + "anstyle-parse", 37 + "anstyle-query", 38 + "anstyle-wincon", 39 + "colorchoice", 40 + "is_terminal_polyfill", 41 + "utf8parse", 42 + ] 43 + 44 + [[package]] 45 + name = "anstyle" 46 + version = "1.0.13" 47 + source = "registry+https://github.com/rust-lang/crates.io-index" 48 + checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" 49 + 50 + [[package]] 51 + name = "anstyle-parse" 52 + version = "0.2.7" 53 + source = "registry+https://github.com/rust-lang/crates.io-index" 54 + checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 55 + dependencies = [ 56 + "utf8parse", 57 + ] 58 + 59 + [[package]] 60 + name = "anstyle-query" 61 + version = "1.1.5" 62 + source = "registry+https://github.com/rust-lang/crates.io-index" 63 + checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" 64 + dependencies = [ 65 + "windows-sys", 66 + ] 67 + 68 + [[package]] 69 + name = "anstyle-wincon" 70 + version = "3.0.11" 71 + source = "registry+https://github.com/rust-lang/crates.io-index" 72 + checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" 73 + dependencies = [ 74 + "anstyle", 75 + "once_cell_polyfill", 76 + "windows-sys", 77 + ] 78 + 79 + [[package]] 80 + name = "anyhow" 81 + version = "1.0.100" 82 + source = "registry+https://github.com/rust-lang/crates.io-index" 83 + checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" 84 + 85 + [[package]] 86 + name = "aoc2025" 87 + version = "0.1.0" 88 + dependencies = [ 89 + "anyhow", 90 + "atoi_simd", 91 + "criterion", 92 + "env_logger", 93 + "log", 94 + "memchr", 95 + ] 96 + 97 + [[package]] 98 + name = "atoi_simd" 99 + version = "0.17.0" 100 + source = "registry+https://github.com/rust-lang/crates.io-index" 101 + checksum = "8ad17c7c205c2c28b527b9845eeb91cf1b4d008b438f98ce0e628227a822758e" 102 + dependencies = [ 103 + "debug_unsafe", 104 + ] 105 + 106 + [[package]] 107 + name = "autocfg" 108 + version = "1.5.0" 109 + source = "registry+https://github.com/rust-lang/crates.io-index" 110 + checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 111 + 112 + [[package]] 113 + name = "bumpalo" 114 + version = "3.19.0" 115 + source = "registry+https://github.com/rust-lang/crates.io-index" 116 + checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 117 + 118 + [[package]] 119 + name = "cast" 120 + version = "0.3.0" 121 + source = "registry+https://github.com/rust-lang/crates.io-index" 122 + checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" 123 + 124 + [[package]] 125 + name = "cc" 126 + version = "1.2.48" 127 + source = "registry+https://github.com/rust-lang/crates.io-index" 128 + checksum = "c481bdbf0ed3b892f6f806287d72acd515b352a4ec27a208489b8c1bc839633a" 129 + dependencies = [ 130 + "find-msvc-tools", 131 + "shlex", 132 + ] 133 + 134 + [[package]] 135 + name = "cfg-if" 136 + version = "1.0.4" 137 + source = "registry+https://github.com/rust-lang/crates.io-index" 138 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 139 + 140 + [[package]] 141 + name = "ciborium" 142 + version = "0.2.2" 143 + source = "registry+https://github.com/rust-lang/crates.io-index" 144 + checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" 145 + dependencies = [ 146 + "ciborium-io", 147 + "ciborium-ll", 148 + "serde", 149 + ] 150 + 151 + [[package]] 152 + name = "ciborium-io" 153 + version = "0.2.2" 154 + source = "registry+https://github.com/rust-lang/crates.io-index" 155 + checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" 156 + 157 + [[package]] 158 + name = "ciborium-ll" 159 + version = "0.2.2" 160 + source = "registry+https://github.com/rust-lang/crates.io-index" 161 + checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" 162 + dependencies = [ 163 + "ciborium-io", 164 + "half", 165 + ] 166 + 167 + [[package]] 168 + name = "clap" 169 + version = "4.5.53" 170 + source = "registry+https://github.com/rust-lang/crates.io-index" 171 + checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" 172 + dependencies = [ 173 + "clap_builder", 174 + ] 175 + 176 + [[package]] 177 + name = "clap_builder" 178 + version = "4.5.53" 179 + source = "registry+https://github.com/rust-lang/crates.io-index" 180 + checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" 181 + dependencies = [ 182 + "anstyle", 183 + "clap_lex", 184 + ] 185 + 186 + [[package]] 187 + name = "clap_lex" 188 + version = "0.7.6" 189 + source = "registry+https://github.com/rust-lang/crates.io-index" 190 + checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" 191 + 192 + [[package]] 193 + name = "colorchoice" 194 + version = "1.0.4" 195 + source = "registry+https://github.com/rust-lang/crates.io-index" 196 + checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 197 + 198 + [[package]] 199 + name = "criterion" 200 + version = "0.8.0" 201 + source = "registry+https://github.com/rust-lang/crates.io-index" 202 + checksum = "a0dfe5e9e71bdcf4e4954f7d14da74d1cdb92a3a07686452d1509652684b1aab" 203 + dependencies = [ 204 + "alloca", 205 + "anes", 206 + "cast", 207 + "ciborium", 208 + "clap", 209 + "criterion-plot", 210 + "itertools", 211 + "num-traits", 212 + "oorandom", 213 + "page_size", 214 + "plotters", 215 + "rayon", 216 + "regex", 217 + "serde", 218 + "serde_json", 219 + "tinytemplate", 220 + "walkdir", 221 + ] 222 + 223 + [[package]] 224 + name = "criterion-plot" 225 + version = "0.8.0" 226 + source = "registry+https://github.com/rust-lang/crates.io-index" 227 + checksum = "5de36c2bee19fba779808f92bf5d9b0fa5a40095c277aba10c458a12b35d21d6" 228 + dependencies = [ 229 + "cast", 230 + "itertools", 231 + ] 232 + 233 + [[package]] 234 + name = "crossbeam-deque" 235 + version = "0.8.6" 236 + source = "registry+https://github.com/rust-lang/crates.io-index" 237 + checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 238 + dependencies = [ 239 + "crossbeam-epoch", 240 + "crossbeam-utils", 241 + ] 242 + 243 + [[package]] 244 + name = "crossbeam-epoch" 245 + version = "0.9.18" 246 + source = "registry+https://github.com/rust-lang/crates.io-index" 247 + checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 248 + dependencies = [ 249 + "crossbeam-utils", 250 + ] 251 + 252 + [[package]] 253 + name = "crossbeam-utils" 254 + version = "0.8.21" 255 + source = "registry+https://github.com/rust-lang/crates.io-index" 256 + checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 257 + 258 + [[package]] 259 + name = "crunchy" 260 + version = "0.2.4" 261 + source = "registry+https://github.com/rust-lang/crates.io-index" 262 + checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" 263 + 264 + [[package]] 265 + name = "debug_unsafe" 266 + version = "0.1.3" 267 + source = "registry+https://github.com/rust-lang/crates.io-index" 268 + checksum = "85d3cef41d236720ed453e102153a53e4cc3d2fde848c0078a50cf249e8e3e5b" 269 + 270 + [[package]] 271 + name = "either" 272 + version = "1.15.0" 273 + source = "registry+https://github.com/rust-lang/crates.io-index" 274 + checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 275 + 276 + [[package]] 277 + name = "env_filter" 278 + version = "0.1.4" 279 + source = "registry+https://github.com/rust-lang/crates.io-index" 280 + checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" 281 + dependencies = [ 282 + "log", 283 + "regex", 284 + ] 285 + 286 + [[package]] 287 + name = "env_logger" 288 + version = "0.11.8" 289 + source = "registry+https://github.com/rust-lang/crates.io-index" 290 + checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" 291 + dependencies = [ 292 + "anstream", 293 + "anstyle", 294 + "env_filter", 295 + "jiff", 296 + "log", 297 + ] 298 + 299 + [[package]] 300 + name = "find-msvc-tools" 301 + version = "0.1.5" 302 + source = "registry+https://github.com/rust-lang/crates.io-index" 303 + checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" 304 + 305 + [[package]] 306 + name = "half" 307 + version = "2.7.1" 308 + source = "registry+https://github.com/rust-lang/crates.io-index" 309 + checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" 310 + dependencies = [ 311 + "cfg-if", 312 + "crunchy", 313 + "zerocopy", 314 + ] 315 + 316 + [[package]] 317 + name = "is_terminal_polyfill" 318 + version = "1.70.2" 319 + source = "registry+https://github.com/rust-lang/crates.io-index" 320 + checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" 321 + 322 + [[package]] 323 + name = "itertools" 324 + version = "0.13.0" 325 + source = "registry+https://github.com/rust-lang/crates.io-index" 326 + checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 327 + dependencies = [ 328 + "either", 329 + ] 330 + 331 + [[package]] 332 + name = "itoa" 333 + version = "1.0.15" 334 + source = "registry+https://github.com/rust-lang/crates.io-index" 335 + checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 336 + 337 + [[package]] 338 + name = "jiff" 339 + version = "0.2.16" 340 + source = "registry+https://github.com/rust-lang/crates.io-index" 341 + checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35" 342 + dependencies = [ 343 + "jiff-static", 344 + "log", 345 + "portable-atomic", 346 + "portable-atomic-util", 347 + "serde_core", 348 + ] 349 + 350 + [[package]] 351 + name = "jiff-static" 352 + version = "0.2.16" 353 + source = "registry+https://github.com/rust-lang/crates.io-index" 354 + checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69" 355 + dependencies = [ 356 + "proc-macro2", 357 + "quote", 358 + "syn", 359 + ] 360 + 361 + [[package]] 362 + name = "js-sys" 363 + version = "0.3.83" 364 + source = "registry+https://github.com/rust-lang/crates.io-index" 365 + checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" 366 + dependencies = [ 367 + "once_cell", 368 + "wasm-bindgen", 369 + ] 370 + 371 + [[package]] 372 + name = "libc" 373 + version = "0.2.178" 374 + source = "registry+https://github.com/rust-lang/crates.io-index" 375 + checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" 376 + 377 + [[package]] 378 + name = "log" 379 + version = "0.4.29" 380 + source = "registry+https://github.com/rust-lang/crates.io-index" 381 + checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" 382 + 383 + [[package]] 384 + name = "memchr" 385 + version = "2.7.6" 386 + source = "registry+https://github.com/rust-lang/crates.io-index" 387 + checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 388 + 389 + [[package]] 390 + name = "num-traits" 391 + version = "0.2.19" 392 + source = "registry+https://github.com/rust-lang/crates.io-index" 393 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 394 + dependencies = [ 395 + "autocfg", 396 + ] 397 + 398 + [[package]] 399 + name = "once_cell" 400 + version = "1.21.3" 401 + source = "registry+https://github.com/rust-lang/crates.io-index" 402 + checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 403 + 404 + [[package]] 405 + name = "once_cell_polyfill" 406 + version = "1.70.2" 407 + source = "registry+https://github.com/rust-lang/crates.io-index" 408 + checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" 409 + 410 + [[package]] 411 + name = "oorandom" 412 + version = "11.1.5" 413 + source = "registry+https://github.com/rust-lang/crates.io-index" 414 + checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" 415 + 416 + [[package]] 417 + name = "page_size" 418 + version = "0.6.0" 419 + source = "registry+https://github.com/rust-lang/crates.io-index" 420 + checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" 421 + dependencies = [ 422 + "libc", 423 + "winapi", 424 + ] 425 + 426 + [[package]] 427 + name = "plotters" 428 + version = "0.3.7" 429 + source = "registry+https://github.com/rust-lang/crates.io-index" 430 + checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" 431 + dependencies = [ 432 + "num-traits", 433 + "plotters-backend", 434 + "plotters-svg", 435 + "wasm-bindgen", 436 + "web-sys", 437 + ] 438 + 439 + [[package]] 440 + name = "plotters-backend" 441 + version = "0.3.7" 442 + source = "registry+https://github.com/rust-lang/crates.io-index" 443 + checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" 444 + 445 + [[package]] 446 + name = "plotters-svg" 447 + version = "0.3.7" 448 + source = "registry+https://github.com/rust-lang/crates.io-index" 449 + checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" 450 + dependencies = [ 451 + "plotters-backend", 452 + ] 453 + 454 + [[package]] 455 + name = "portable-atomic" 456 + version = "1.11.1" 457 + source = "registry+https://github.com/rust-lang/crates.io-index" 458 + checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" 459 + 460 + [[package]] 461 + name = "portable-atomic-util" 462 + version = "0.2.4" 463 + source = "registry+https://github.com/rust-lang/crates.io-index" 464 + checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" 465 + dependencies = [ 466 + "portable-atomic", 467 + ] 468 + 469 + [[package]] 470 + name = "proc-macro2" 471 + version = "1.0.103" 472 + source = "registry+https://github.com/rust-lang/crates.io-index" 473 + checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" 474 + dependencies = [ 475 + "unicode-ident", 476 + ] 477 + 478 + [[package]] 479 + name = "quote" 480 + version = "1.0.42" 481 + source = "registry+https://github.com/rust-lang/crates.io-index" 482 + checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" 483 + dependencies = [ 484 + "proc-macro2", 485 + ] 486 + 487 + [[package]] 488 + name = "rayon" 489 + version = "1.11.0" 490 + source = "registry+https://github.com/rust-lang/crates.io-index" 491 + checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" 492 + dependencies = [ 493 + "either", 494 + "rayon-core", 495 + ] 496 + 497 + [[package]] 498 + name = "rayon-core" 499 + version = "1.13.0" 500 + source = "registry+https://github.com/rust-lang/crates.io-index" 501 + checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" 502 + dependencies = [ 503 + "crossbeam-deque", 504 + "crossbeam-utils", 505 + ] 506 + 507 + [[package]] 508 + name = "regex" 509 + version = "1.12.2" 510 + source = "registry+https://github.com/rust-lang/crates.io-index" 511 + checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" 512 + dependencies = [ 513 + "aho-corasick", 514 + "memchr", 515 + "regex-automata", 516 + "regex-syntax", 517 + ] 518 + 519 + [[package]] 520 + name = "regex-automata" 521 + version = "0.4.13" 522 + source = "registry+https://github.com/rust-lang/crates.io-index" 523 + checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" 524 + dependencies = [ 525 + "aho-corasick", 526 + "memchr", 527 + "regex-syntax", 528 + ] 529 + 530 + [[package]] 531 + name = "regex-syntax" 532 + version = "0.8.8" 533 + source = "registry+https://github.com/rust-lang/crates.io-index" 534 + checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" 535 + 536 + [[package]] 537 + name = "rustversion" 538 + version = "1.0.22" 539 + source = "registry+https://github.com/rust-lang/crates.io-index" 540 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 541 + 542 + [[package]] 543 + name = "ryu" 544 + version = "1.0.20" 545 + source = "registry+https://github.com/rust-lang/crates.io-index" 546 + checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 547 + 548 + [[package]] 549 + name = "same-file" 550 + version = "1.0.6" 551 + source = "registry+https://github.com/rust-lang/crates.io-index" 552 + checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 553 + dependencies = [ 554 + "winapi-util", 555 + ] 556 + 557 + [[package]] 558 + name = "serde" 559 + version = "1.0.228" 560 + source = "registry+https://github.com/rust-lang/crates.io-index" 561 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 562 + dependencies = [ 563 + "serde_core", 564 + "serde_derive", 565 + ] 566 + 567 + [[package]] 568 + name = "serde_core" 569 + version = "1.0.228" 570 + source = "registry+https://github.com/rust-lang/crates.io-index" 571 + checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 572 + dependencies = [ 573 + "serde_derive", 574 + ] 575 + 576 + [[package]] 577 + name = "serde_derive" 578 + version = "1.0.228" 579 + source = "registry+https://github.com/rust-lang/crates.io-index" 580 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 581 + dependencies = [ 582 + "proc-macro2", 583 + "quote", 584 + "syn", 585 + ] 586 + 587 + [[package]] 588 + name = "serde_json" 589 + version = "1.0.145" 590 + source = "registry+https://github.com/rust-lang/crates.io-index" 591 + checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 592 + dependencies = [ 593 + "itoa", 594 + "memchr", 595 + "ryu", 596 + "serde", 597 + "serde_core", 598 + ] 599 + 600 + [[package]] 601 + name = "shlex" 602 + version = "1.3.0" 603 + source = "registry+https://github.com/rust-lang/crates.io-index" 604 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 605 + 606 + [[package]] 607 + name = "syn" 608 + version = "2.0.111" 609 + source = "registry+https://github.com/rust-lang/crates.io-index" 610 + checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" 611 + dependencies = [ 612 + "proc-macro2", 613 + "quote", 614 + "unicode-ident", 615 + ] 616 + 617 + [[package]] 618 + name = "tinytemplate" 619 + version = "1.2.1" 620 + source = "registry+https://github.com/rust-lang/crates.io-index" 621 + checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" 622 + dependencies = [ 623 + "serde", 624 + "serde_json", 625 + ] 626 + 627 + [[package]] 628 + name = "unicode-ident" 629 + version = "1.0.22" 630 + source = "registry+https://github.com/rust-lang/crates.io-index" 631 + checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" 632 + 633 + [[package]] 634 + name = "utf8parse" 635 + version = "0.2.2" 636 + source = "registry+https://github.com/rust-lang/crates.io-index" 637 + checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 638 + 639 + [[package]] 640 + name = "walkdir" 641 + version = "2.5.0" 642 + source = "registry+https://github.com/rust-lang/crates.io-index" 643 + checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 644 + dependencies = [ 645 + "same-file", 646 + "winapi-util", 647 + ] 648 + 649 + [[package]] 650 + name = "wasm-bindgen" 651 + version = "0.2.106" 652 + source = "registry+https://github.com/rust-lang/crates.io-index" 653 + checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" 654 + dependencies = [ 655 + "cfg-if", 656 + "once_cell", 657 + "rustversion", 658 + "wasm-bindgen-macro", 659 + "wasm-bindgen-shared", 660 + ] 661 + 662 + [[package]] 663 + name = "wasm-bindgen-macro" 664 + version = "0.2.106" 665 + source = "registry+https://github.com/rust-lang/crates.io-index" 666 + checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" 667 + dependencies = [ 668 + "quote", 669 + "wasm-bindgen-macro-support", 670 + ] 671 + 672 + [[package]] 673 + name = "wasm-bindgen-macro-support" 674 + version = "0.2.106" 675 + source = "registry+https://github.com/rust-lang/crates.io-index" 676 + checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" 677 + dependencies = [ 678 + "bumpalo", 679 + "proc-macro2", 680 + "quote", 681 + "syn", 682 + "wasm-bindgen-shared", 683 + ] 684 + 685 + [[package]] 686 + name = "wasm-bindgen-shared" 687 + version = "0.2.106" 688 + source = "registry+https://github.com/rust-lang/crates.io-index" 689 + checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" 690 + dependencies = [ 691 + "unicode-ident", 692 + ] 693 + 694 + [[package]] 695 + name = "web-sys" 696 + version = "0.3.83" 697 + source = "registry+https://github.com/rust-lang/crates.io-index" 698 + checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" 699 + dependencies = [ 700 + "js-sys", 701 + "wasm-bindgen", 702 + ] 703 + 704 + [[package]] 705 + name = "winapi" 706 + version = "0.3.9" 707 + source = "registry+https://github.com/rust-lang/crates.io-index" 708 + checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 709 + dependencies = [ 710 + "winapi-i686-pc-windows-gnu", 711 + "winapi-x86_64-pc-windows-gnu", 712 + ] 713 + 714 + [[package]] 715 + name = "winapi-i686-pc-windows-gnu" 716 + version = "0.4.0" 717 + source = "registry+https://github.com/rust-lang/crates.io-index" 718 + checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 719 + 720 + [[package]] 721 + name = "winapi-util" 722 + version = "0.1.11" 723 + source = "registry+https://github.com/rust-lang/crates.io-index" 724 + checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" 725 + dependencies = [ 726 + "windows-sys", 727 + ] 728 + 729 + [[package]] 730 + name = "winapi-x86_64-pc-windows-gnu" 731 + version = "0.4.0" 732 + source = "registry+https://github.com/rust-lang/crates.io-index" 733 + checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 734 + 735 + [[package]] 736 + name = "windows-link" 737 + version = "0.2.1" 738 + source = "registry+https://github.com/rust-lang/crates.io-index" 739 + checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 740 + 741 + [[package]] 742 + name = "windows-sys" 743 + version = "0.61.2" 744 + source = "registry+https://github.com/rust-lang/crates.io-index" 745 + checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" 746 + dependencies = [ 747 + "windows-link", 748 + ] 749 + 750 + [[package]] 751 + name = "zerocopy" 752 + version = "0.8.31" 753 + source = "registry+https://github.com/rust-lang/crates.io-index" 754 + checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" 755 + dependencies = [ 756 + "zerocopy-derive", 757 + ] 758 + 759 + [[package]] 760 + name = "zerocopy-derive" 761 + version = "0.8.31" 762 + source = "registry+https://github.com/rust-lang/crates.io-index" 763 + checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" 764 + dependencies = [ 765 + "proc-macro2", 766 + "quote", 767 + "syn", 768 + ]
+18
2025/Cargo.toml
··· 1 + [package] 2 + name = "aoc2025" 3 + version = "0.1.0" 4 + edition = "2024" 5 + 6 + [dependencies] 7 + anyhow = "1.0.100" 8 + atoi_simd = "0.17.0" 9 + env_logger = "0.11.8" 10 + log = "0.4.29" 11 + memchr = "2.7.6" 12 + 13 + [dev-dependencies] 14 + criterion = { version = "0.8.0", features = ["html_reports"] } 15 + 16 + [[bench]] 17 + name = "bench" 18 + harness = false
+42
2025/benches/bench.rs
··· 1 + use aoc2025::days; 2 + use criterion::{Criterion, criterion_group, criterion_main}; 3 + use std::{hint::black_box, time::Duration}; 4 + 5 + static INPUT: &str = include_str!("../inputs/day2.txt"); 6 + 7 + fn bench_parse(c: &mut Criterion) { 8 + c.bench_function("parse", |b| { 9 + b.iter(|| days::two::parse(black_box(INPUT.as_bytes()))) 10 + }); 11 + } 12 + 13 + fn bench_part_a(c: &mut Criterion) { 14 + let input = days::two::parse(INPUT.as_bytes()); 15 + c.bench_function("part_a", |b| { 16 + b.iter(|| days::two::part_a(black_box(input.clone()))) 17 + }); 18 + } 19 + 20 + fn bench_part_b(c: &mut Criterion) { 21 + let input = days::two::parse(INPUT.as_bytes()); 22 + c.bench_function("part_b", |b| { 23 + b.iter(|| days::two::part_b(black_box(input.clone()))) 24 + }); 25 + } 26 + 27 + fn bench_all(c: &mut Criterion) { 28 + c.bench_function("main", |b| { 29 + let input = days::two::parse(INPUT.as_bytes()); 30 + b.iter(|| { 31 + days::two::part_a(black_box(input.clone())); 32 + days::two::part_b(black_box(input.clone())); 33 + }) 34 + }); 35 + } 36 + 37 + criterion_group! { 38 + name = benches; 39 + config = Criterion::default().sample_size(100).measurement_time(Duration::from_secs(30)).plotting_backend(criterion::PlottingBackend::Plotters); 40 + targets = bench_parse, bench_part_a, bench_part_b, bench_all 41 + } 42 + criterion_main!(benches);
+45
2025/nilla.nix
··· 1 + let 2 + pins = import ./npins; 3 + 4 + nilla = import pins.nilla; 5 + in 6 + nilla.create ({ config }: { 7 + config = { 8 + inputs = { 9 + fenix = { 10 + src = pins.fenix; 11 + }; 12 + 13 + nixpkgs = { 14 + src = pins.nixpkgs; 15 + 16 + settings = { 17 + overlays = [ 18 + config.inputs.fenix.result.overlays.default 19 + ]; 20 + }; 21 + }; 22 + }; 23 + 24 + shells.default = config.shells.rust; 25 + shells.rust = { 26 + systems = [ "x86_64-linux" ]; 27 + 28 + shell = { mkShell, fenix, bacon, pkg-config, ... }: 29 + mkShell { 30 + packages = [ 31 + (fenix.complete.withComponents [ 32 + "cargo" 33 + "clippy" 34 + "rust-src" 35 + "rustc" 36 + "rustfmt" 37 + "rust-analyzer" 38 + ]) 39 + bacon 40 + pkg-config 41 + ]; 42 + }; 43 + }; 44 + }; 45 + })
+247
2025/npins/default.nix
··· 1 + /* 2 + This file is provided under the MIT licence: 3 + 4 + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the โ€œSoftwareโ€), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 5 + 6 + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 7 + 8 + THE SOFTWARE IS PROVIDED โ€œAS ISโ€, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 9 + */ 10 + # Generated by npins. Do not modify; will be overwritten regularly 11 + let 12 + # Backwards-compatibly make something that previously didn't take any arguments take some 13 + # The function must return an attrset, and will unfortunately be eagerly evaluated 14 + # Same thing, but it catches eval errors on the default argument so that one may still call it with other arguments 15 + mkFunctor = 16 + fn: 17 + let 18 + e = builtins.tryEval (fn { }); 19 + in 20 + (if e.success then e.value else { error = fn { }; }) // { __functor = _self: fn; }; 21 + 22 + # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295 23 + range = 24 + first: last: if first > last then [ ] else builtins.genList (n: first + n) (last - first + 1); 25 + 26 + # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257 27 + stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1)); 28 + 29 + # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269 30 + stringAsChars = f: s: concatStrings (map f (stringToCharacters s)); 31 + concatStrings = builtins.concatStringsSep ""; 32 + 33 + # If the environment variable NPINS_OVERRIDE_${name} is set, then use 34 + # the path directly as opposed to the fetched source. 35 + # (Taken from Niv for compatibility) 36 + mayOverride = 37 + name: path: 38 + let 39 + envVarName = "NPINS_OVERRIDE_${saneName}"; 40 + saneName = stringAsChars (c: if (builtins.match "[a-zA-Z0-9]" c) == null then "_" else c) name; 41 + ersatz = builtins.getEnv envVarName; 42 + in 43 + if ersatz == "" then 44 + path 45 + else 46 + # this turns the string into an actual Nix path (for both absolute and 47 + # relative paths) 48 + builtins.trace "Overriding path of \"${name}\" with \"${ersatz}\" due to set \"${envVarName}\"" ( 49 + if builtins.substring 0 1 ersatz == "/" then 50 + /. + ersatz 51 + else 52 + /. + builtins.getEnv "PWD" + "/${ersatz}" 53 + ); 54 + 55 + mkSource = 56 + name: spec: 57 + { 58 + pkgs ? null, 59 + }: 60 + assert spec ? type; 61 + let 62 + # Unify across builtin and pkgs fetchers. 63 + # `fetchGit` requires a wrapper because of slight API differences. 64 + fetchers = 65 + if pkgs == null then 66 + { 67 + inherit (builtins) fetchTarball fetchurl; 68 + # For some fucking reason, fetchGit has a different signature than the other builtin fetchers โ€ฆ 69 + fetchGit = args: (builtins.fetchGit args).outPath; 70 + } 71 + else 72 + { 73 + fetchTarball = 74 + { 75 + url, 76 + sha256, 77 + }: 78 + pkgs.fetchzip { 79 + inherit url sha256; 80 + extension = "tar"; 81 + }; 82 + inherit (pkgs) fetchurl; 83 + fetchGit = 84 + { 85 + url, 86 + submodules, 87 + rev, 88 + name, 89 + narHash, 90 + }: 91 + pkgs.fetchgit { 92 + inherit url rev name; 93 + fetchSubmodules = submodules; 94 + hash = narHash; 95 + }; 96 + }; 97 + 98 + # Dispatch to the correct code path based on the type 99 + path = 100 + if spec.type == "Git" then 101 + mkGitSource fetchers spec 102 + else if spec.type == "GitRelease" then 103 + mkGitSource fetchers spec 104 + else if spec.type == "PyPi" then 105 + mkPyPiSource fetchers spec 106 + else if spec.type == "Channel" then 107 + mkChannelSource fetchers spec 108 + else if spec.type == "Tarball" then 109 + mkTarballSource fetchers spec 110 + else if spec.type == "Container" then 111 + mkContainerSource pkgs spec 112 + else 113 + builtins.throw "Unknown source type ${spec.type}"; 114 + in 115 + spec // { outPath = mayOverride name path; }; 116 + 117 + mkGitSource = 118 + { 119 + fetchTarball, 120 + fetchGit, 121 + ... 122 + }: 123 + { 124 + repository, 125 + revision, 126 + url ? null, 127 + submodules, 128 + hash, 129 + ... 130 + }: 131 + assert repository ? type; 132 + # At the moment, either it is a plain git repository (which has an url), or it is a GitHub/GitLab repository 133 + # In the latter case, there we will always be an url to the tarball 134 + if url != null && !submodules then 135 + fetchTarball { 136 + inherit url; 137 + sha256 = hash; 138 + } 139 + else 140 + let 141 + url = 142 + if repository.type == "Git" then 143 + repository.url 144 + else if repository.type == "GitHub" then 145 + "https://github.com/${repository.owner}/${repository.repo}.git" 146 + else if repository.type == "GitLab" then 147 + "${repository.server}/${repository.repo_path}.git" 148 + else 149 + throw "Unrecognized repository type ${repository.type}"; 150 + urlToName = 151 + url: rev: 152 + let 153 + matched = builtins.match "^.*/([^/]*)(\\.git)?$" url; 154 + 155 + short = builtins.substring 0 7 rev; 156 + 157 + appendShort = if (builtins.match "[a-f0-9]*" rev) != null then "-${short}" else ""; 158 + in 159 + "${if matched == null then "source" else builtins.head matched}${appendShort}"; 160 + name = urlToName url revision; 161 + in 162 + fetchGit { 163 + rev = revision; 164 + narHash = hash; 165 + 166 + inherit name submodules url; 167 + }; 168 + 169 + mkPyPiSource = 170 + { fetchurl, ... }: 171 + { 172 + url, 173 + hash, 174 + ... 175 + }: 176 + fetchurl { 177 + inherit url; 178 + sha256 = hash; 179 + }; 180 + 181 + mkChannelSource = 182 + { fetchTarball, ... }: 183 + { 184 + url, 185 + hash, 186 + ... 187 + }: 188 + fetchTarball { 189 + inherit url; 190 + sha256 = hash; 191 + }; 192 + 193 + mkTarballSource = 194 + { fetchTarball, ... }: 195 + { 196 + url, 197 + locked_url ? url, 198 + hash, 199 + ... 200 + }: 201 + fetchTarball { 202 + url = locked_url; 203 + sha256 = hash; 204 + }; 205 + 206 + mkContainerSource = 207 + pkgs: 208 + { 209 + image_name, 210 + image_tag, 211 + image_digest, 212 + ... 213 + }: 214 + if pkgs == null then 215 + builtins.throw "container sources require passing in a Nixpkgs value: https://github.com/andir/npins/blob/master/README.md#using-the-nixpkgs-fetchers" 216 + else 217 + pkgs.dockerTools.pullImage { 218 + imageName = image_name; 219 + imageDigest = image_digest; 220 + finalImageTag = image_tag; 221 + }; 222 + in 223 + mkFunctor ( 224 + { 225 + input ? ./sources.json, 226 + }: 227 + let 228 + data = 229 + if builtins.isPath input then 230 + # while `readFile` will throw an error anyways if the path doesn't exist, 231 + # we still need to check beforehand because *our* error can be caught but not the one from the builtin 232 + # *piegames sighs* 233 + if builtins.pathExists input then 234 + builtins.fromJSON (builtins.readFile input) 235 + else 236 + throw "Input path ${toString input} does not exist" 237 + else if builtins.isAttrs input then 238 + input 239 + else 240 + throw "Unsupported input type ${builtins.typeOf input}, must be a path or an attrset"; 241 + version = data.version; 242 + in 243 + if version == 7 then 244 + builtins.mapAttrs (name: spec: mkFunctor (mkSource name spec)) data.pins 245 + else 246 + throw "Unsupported format version ${toString version} in sources.json. Try running `npins upgrade`" 247 + )
+44
2025/npins/sources.json
··· 1 + { 2 + "pins": { 3 + "fenix": { 4 + "type": "Git", 5 + "repository": { 6 + "type": "GitHub", 7 + "owner": "nix-community", 8 + "repo": "fenix" 9 + }, 10 + "branch": "monthly", 11 + "submodules": false, 12 + "revision": "df3c2e78ec13418f85c1f26e77a50f865ec57d38", 13 + "url": "https://github.com/nix-community/fenix/archive/df3c2e78ec13418f85c1f26e77a50f865ec57d38.tar.gz", 14 + "hash": "sha256-+oo9W5rz03TjfpNqDSLEQwgKiuBbjrHdORyTHli2RuM=" 15 + }, 16 + "nilla": { 17 + "type": "Git", 18 + "repository": { 19 + "type": "GitHub", 20 + "owner": "nilla-nix", 21 + "repo": "nilla" 22 + }, 23 + "branch": "main", 24 + "submodules": false, 25 + "revision": "6d814dafa6f397ac2087333e5515c617faccba6f", 26 + "url": "https://github.com/nilla-nix/nilla/archive/6d814dafa6f397ac2087333e5515c617faccba6f.tar.gz", 27 + "hash": "sha256-A4zg3po1tyfh1if+LIllKtUGoWLFSwJSztvH2MG22qU=" 28 + }, 29 + "nixpkgs": { 30 + "type": "Git", 31 + "repository": { 32 + "type": "GitHub", 33 + "owner": "nixos", 34 + "repo": "nixpkgs" 35 + }, 36 + "branch": "nixos-unstable", 37 + "submodules": false, 38 + "revision": "2d293cbfa5a793b4c50d17c05ef9e385b90edf6c", 39 + "url": "https://github.com/nixos/nixpkgs/archive/2d293cbfa5a793b4c50d17c05ef9e385b90edf6c.tar.gz", 40 + "hash": "sha256-pp3uT4hHijIC8JUK5MEqeAWmParJrgBVzHLNfJDZxg4=" 41 + } 42 + }, 43 + "version": 7 44 + }
+2
2025/src/days/mod.rs
··· 1 + pub mod one; 2 + pub mod two;
+79
2025/src/days/one/mod.rs
··· 1 + use atoi_simd::parse as parse_i32; 2 + 3 + pub fn main() -> anyhow::Result<()> { 4 + crate::run("Secret Entrance", "inputs/day1.txt", parse, part_a, part_b) 5 + } 6 + 7 + fn parse(input: &[u8]) -> Vec<i32> { 8 + let mut out = Vec::with_capacity(input.iter().filter(|&b| *b == b'\n').count()); 9 + let mut start = 0; 10 + 11 + while start < input.len() { 12 + let end = match memchr::memchr(b'\n', &input[start..]) { 13 + Some(index) => start + index, 14 + None => input.len(), 15 + }; 16 + let line = &input[start..end]; 17 + 18 + if !line.is_empty() { 19 + let mut buf = [0u8; 4]; 20 + let mut len = 0usize; 21 + let mut seen_digit = false; 22 + 23 + for &b in line { 24 + match b { 25 + b'L' => { 26 + if len == 0 { 27 + buf[len] = b'-'; 28 + len += 1; 29 + } 30 + } 31 + b'0'..=b'9' => { 32 + seen_digit = true; 33 + buf[len] = b; 34 + len += 1; 35 + } 36 + _ => { 37 + len = 0; 38 + break; 39 + } 40 + } 41 + } 42 + if seen_digit && len > 0 { 43 + if let Ok(num) = parse_i32(&buf[..len]) { 44 + out.push(num); 45 + } 46 + } 47 + } 48 + 49 + start = end + 1; 50 + } 51 + 52 + out 53 + } 54 + 55 + fn part_a(input: Vec<i32>) -> usize { 56 + input 57 + .iter() 58 + .scan(50, |state, &rotation| { 59 + *state += rotation; 60 + Some(*state) 61 + }) 62 + .filter(|&state| state % 100 == 0) 63 + .count() 64 + } 65 + 66 + fn part_b(input: Vec<i32>) -> usize { 67 + input 68 + .iter() 69 + .scan(50, |state, &rotation| { 70 + let mut passes = (rotation / 100).abs() as usize; 71 + let turn = rotation % 100; 72 + if *state + turn <= 0 && *state != 0 || 99 < *state + turn { 73 + passes += 1; 74 + } 75 + *state = (*state + turn).rem_euclid(100); 76 + Some(passes) 77 + }) 78 + .sum() 79 + }
+105
2025/src/days/two/mod.rs
··· 1 + use atoi_simd::parse as parse_u64; 2 + 3 + pub fn main() -> anyhow::Result<()> { 4 + crate::run("Gift Shop", "inputs/day2.txt", parse, part_a, part_b) 5 + } 6 + 7 + pub fn parse(input: &[u8]) -> Vec<u64> { 8 + let mut out = Vec::new(); 9 + let mut start = 0; 10 + 11 + while start < input.len() { 12 + let rest = &input[start..]; 13 + let end = memchr::memchr2(b',', b'\n', rest).map_or(input.len(), |i| start + i); 14 + let range = &input[start..end]; 15 + 16 + let dash = memchr::memchr(b'-', range).expect("invalid input: missing '-'"); 17 + 18 + let min = parse_u64::<u64>(&range[..dash]).expect("invalid input: invalid min"); 19 + let max = parse_u64::<u64>(&range[dash + 1..]).expect("invalid input: invalid max"); 20 + 21 + out.extend(min..=max); 22 + start = if end == input.len() { end } else { end + 1 }; 23 + } 24 + 25 + out 26 + } 27 + 28 + pub fn part_a(input: Vec<u64>) -> usize { 29 + input.iter().fold(0, |acc, x| { 30 + acc + if is_valid_id_a(x.clone()) { 31 + 0 32 + } else { 33 + *x as usize 34 + } 35 + }) 36 + } 37 + 38 + fn is_valid_id_a(id: u64) -> bool { 39 + // invalid ID's are identifiable due to them being made up from some sequences being repeated 40 + // eg: 11 -> [1, 1] invalid 41 + // eg: 123123 -> [123, 123] invalid 42 + // eg: 123456 -> [123456] valid 43 + let digits = id.ilog10() + 1; 44 + if digits % 2 == 1 { 45 + return true; 46 + } 47 + 48 + let div = 10u64.pow(digits / 2); 49 + 50 + let left = id / div; 51 + let right = id % div; 52 + left != right 53 + } 54 + 55 + fn is_valid_id_b(mut id: u64) -> bool { 56 + // invalid ID's are identifiable due to them being made up from some sequences being repeated 57 + // eg: 11 -> [1, 1] invalid 58 + // eg: 123123 -> [123, 123] invalid 59 + // eg: 121212 -> [12, 12, 12] invalid 60 + // eg: 111 -> [1, 1, 1] invalid 61 + // eg: 123456 -> [123456] valid 62 + let mut digits = [0u8; 10]; 63 + let mut len = 0; 64 + 65 + if id == 0 { 66 + digits[0] = b'0'; 67 + len = 1; 68 + } else { 69 + while id > 0 { 70 + digits[len] = b'0' + (id % 10) as u8; 71 + len += 1; 72 + id /= 10; 73 + } 74 + digits[..len].reverse(); 75 + } 76 + 77 + if len < 2 { 78 + return true; 79 + } 80 + 81 + let mut pi = [0usize; 10]; 82 + for i in 1..len { 83 + let mut j = pi[i - 1]; 84 + while j > 0 && digits[i] != digits[j] { 85 + j = pi[j - 1]; 86 + } 87 + if digits[i] == digits[j] { 88 + j += 1; 89 + } 90 + pi[i] = j; 91 + } 92 + 93 + let smallest_period = len - pi[len - 1]; 94 + !(smallest_period < len && len % smallest_period == 0) 95 + } 96 + 97 + pub fn part_b(input: Vec<u64>) -> usize { 98 + input.iter().fold(0, |acc, x| { 99 + acc + if is_valid_id_b(x.clone()) { 100 + 0usize 101 + } else { 102 + *x as usize 103 + } 104 + }) 105 + }
+63
2025/src/lib.rs
··· 1 + pub mod days; 2 + 3 + use std::{fmt::Display, fs, time::Instant}; 4 + 5 + use anyhow::Result; 6 + use log::info; 7 + 8 + pub fn run<T, P, A, B, RA, RB>( 9 + name: &str, 10 + input_path: &str, 11 + parse: P, 12 + part_a: A, 13 + part_b: B, 14 + ) -> Result<()> 15 + where 16 + T: Clone, 17 + P: Fn(&[u8]) -> T, 18 + A: Fn(T) -> RA, 19 + B: Fn(T) -> RB, 20 + RA: Display, 21 + RB: Display, 22 + { 23 + let _ = env_logger::try_init(); 24 + let file = &fs::read_to_string(input_path)?; 25 + let bytes = file.as_bytes(); 26 + let label_parse = format!("{name} Parse"); 27 + let parse_start = Instant::now(); 28 + let input = parse(bytes); 29 + let parse_elapsed = parse_start.elapsed(); 30 + info!("{label_parse}"); 31 + info!("{}", "-".repeat(label_parse.len())); 32 + info!("Parse time: {:?}", parse_elapsed); 33 + 34 + info!(""); 35 + 36 + let label_a = format!("{name} Part A"); 37 + info!("{label_a}"); 38 + info!("{}", "-".repeat(label_a.len())); 39 + let part_a_start = Instant::now(); 40 + info!("Part A answer: {}", part_a(input.clone())); 41 + let part_a_elapsed = part_a_start.elapsed(); 42 + info!("Part A time: {:?}", part_a_elapsed); 43 + 44 + info!(""); 45 + 46 + let label_b = format!("{name} Part B"); 47 + info!("{label_b}"); 48 + info!("{}", "-".repeat(label_b.len())); 49 + let part_b_start = Instant::now(); 50 + info!("Part B answer: {}", part_b(input.clone())); 51 + let part_b_elapsed = part_b_start.elapsed(); 52 + info!("Part B time: {:?}", part_b_elapsed); 53 + 54 + info!(""); 55 + 56 + info!("Challenge time: {:?}", part_a_elapsed + part_b_elapsed); 57 + info!( 58 + "Total time: {:?}", 59 + part_a_elapsed + part_b_elapsed + parse_elapsed 60 + ); 61 + 62 + Ok(()) 63 + }
+4
2025/src/main.rs
··· 1 + fn main() -> anyhow::Result<()> { 2 + aoc2025::days::two::main()?; 3 + Ok(()) 4 + }
-1
day_1/.gitignore
··· 1 - /target
-7
day_1/Cargo.lock
··· 1 - # This file is automatically @generated by Cargo. 2 - # It is not intended for manual editing. 3 - version = 3 4 - 5 - [[package]] 6 - name = "day_1" 7 - version = "0.1.0"
-6
day_1/Cargo.toml
··· 1 - [package] 2 - name = "day_1" 3 - version = "0.1.0" 4 - edition = "2021" 5 - 6 - [dependencies]
-1000
day_1/input.txt
··· 1 - 77221 93653 2 - 61169 27995 3 - 49546 69782 4 - 11688 41563 5 - 15820 48282 6 - 63235 37517 7 - 28850 68189 8 - 80735 25255 9 - 42616 65322 10 - 55068 99897 11 - 30851 35509 12 - 14907 49013 13 - 64732 92011 14 - 16709 68830 15 - 67643 36207 16 - 44080 23559 17 - 96480 58330 18 - 99450 40186 19 - 21169 63410 20 - 58096 21671 21 - 53828 79572 22 - 47026 44529 23 - 90101 28656 24 - 45773 73412 25 - 71303 85991 26 - 45304 78294 27 - 96528 23559 28 - 19794 17882 29 - 74831 17211 30 - 88912 11644 31 - 98961 80435 32 - 15788 96101 33 - 16350 86995 34 - 96806 19028 35 - 99959 77868 36 - 58887 90255 37 - 42568 25255 38 - 29278 88912 39 - 94028 63269 40 - 42810 21548 41 - 97490 71747 42 - 89051 24477 43 - 73916 31808 44 - 97751 88912 45 - 73608 77868 46 - 62426 13754 47 - 29429 36177 48 - 11070 10894 49 - 78656 85185 50 - 31308 60500 51 - 96166 91114 52 - 36906 85134 53 - 99662 77868 54 - 66402 41563 55 - 37085 14475 56 - 80907 53324 57 - 61650 53324 58 - 84223 63753 59 - 83891 47827 60 - 15973 77536 61 - 68843 40593 62 - 98854 31274 63 - 42426 97404 64 - 25255 67531 65 - 44559 50141 66 - 93909 50674 67 - 28070 32858 68 - 24880 24813 69 - 29338 89795 70 - 64883 77868 71 - 66924 57646 72 - 32984 66502 73 - 32238 39062 74 - 38816 23559 75 - 58770 65322 76 - 74953 91636 77 - 70592 19028 78 - 93111 11644 79 - 31065 23537 80 - 67370 19028 81 - 18314 47412 82 - 71075 74334 83 - 21544 44529 84 - 59137 50980 85 - 20440 80749 86 - 14393 38495 87 - 72130 90255 88 - 43828 68830 89 - 23262 73660 90 - 11923 50980 91 - 47754 14164 92 - 96043 34362 93 - 27162 28090 94 - 20838 50713 95 - 75009 11121 96 - 92099 31274 97 - 22054 38248 98 - 43518 80106 99 - 68189 13153 100 - 50520 12727 101 - 51425 40674 102 - 42998 31053 103 - 52443 33051 104 - 37256 54436 105 - 16648 95555 106 - 81123 17329 107 - 46974 79835 108 - 36328 77868 109 - 76373 23559 110 - 82592 70046 111 - 70600 22417 112 - 27116 89690 113 - 28090 34969 114 - 86348 23559 115 - 53145 50980 116 - 30203 83301 117 - 23347 77681 118 - 76433 26236 119 - 28046 92869 120 - 58920 50980 121 - 25518 28090 122 - 12791 44529 123 - 61967 31808 124 - 98022 53056 125 - 24326 12263 126 - 41095 13121 127 - 24045 82448 128 - 31274 16530 129 - 78021 21589 130 - 63029 19658 131 - 75684 14475 132 - 31258 36493 133 - 40561 48589 134 - 20457 54974 135 - 14783 88465 136 - 39433 23537 137 - 34774 53324 138 - 10455 14329 139 - 26338 74416 140 - 55227 37003 141 - 36963 40380 142 - 31910 68189 143 - 94894 18220 144 - 23166 44111 145 - 48884 46787 146 - 73036 89795 147 - 83519 25205 148 - 50205 93653 149 - 85926 50141 150 - 69194 23559 151 - 25529 11642 152 - 10182 31274 153 - 13638 61987 154 - 83588 19028 155 - 75911 20768 156 - 44692 24325 157 - 43278 94888 158 - 48148 24394 159 - 86205 99327 160 - 82605 58818 161 - 52770 68189 162 - 89068 84917 163 - 66452 83679 164 - 50217 85099 165 - 64914 52073 166 - 76460 78294 167 - 43026 24410 168 - 44179 50980 169 - 47653 90255 170 - 78061 50980 171 - 14475 71478 172 - 77868 37150 173 - 99645 28090 174 - 86267 70055 175 - 58072 68830 176 - 96428 66585 177 - 77501 50141 178 - 52344 93653 179 - 49534 35509 180 - 46925 12437 181 - 40005 87987 182 - 17329 86995 183 - 17585 89795 184 - 32296 59660 185 - 81836 11644 186 - 89435 65322 187 - 55149 59423 188 - 56971 50141 189 - 26342 95142 190 - 57894 56227 191 - 49762 33007 192 - 48949 65641 193 - 40453 53505 194 - 67613 23537 195 - 27110 87987 196 - 25231 63910 197 - 92546 50713 198 - 70074 27554 199 - 39649 93653 200 - 93231 30520 201 - 60008 79179 202 - 18449 47209 203 - 68828 36207 204 - 18908 72254 205 - 55426 44661 206 - 62522 87987 207 - 60923 25255 208 - 85721 68107 209 - 35153 71814 210 - 20053 24813 211 - 24233 22904 212 - 36237 92731 213 - 92077 68189 214 - 30105 50674 215 - 37032 90255 216 - 12745 54116 217 - 41563 53324 218 - 24700 29145 219 - 60226 85335 220 - 50713 64775 221 - 29972 51790 222 - 79176 19794 223 - 40017 96101 224 - 90724 41345 225 - 51608 39176 226 - 46178 50141 227 - 26151 23489 228 - 19569 44529 229 - 34368 86052 230 - 18948 50801 231 - 62091 17329 232 - 89749 38984 233 - 68315 37514 234 - 52396 19794 235 - 14981 14475 236 - 36038 69571 237 - 50048 50980 238 - 60796 41563 239 - 69942 72877 240 - 80976 25234 241 - 56722 90255 242 - 49489 28090 243 - 60768 65557 244 - 70753 85065 245 - 15233 23522 246 - 94697 87600 247 - 40958 41532 248 - 91709 40116 249 - 83586 19028 250 - 88140 24977 251 - 56993 50980 252 - 17980 53324 253 - 12421 97982 254 - 30183 40884 255 - 50452 53324 256 - 91314 90651 257 - 69995 19028 258 - 16588 28090 259 - 22432 98658 260 - 86088 77868 261 - 46361 65322 262 - 97178 75705 263 - 37444 79320 264 - 12275 96101 265 - 47016 16942 266 - 36822 87327 267 - 62082 31274 268 - 68265 64314 269 - 87344 24603 270 - 40642 23559 271 - 87254 38755 272 - 62372 50713 273 - 89026 68830 274 - 88519 96101 275 - 53514 31808 276 - 24686 41563 277 - 23817 68705 278 - 26704 89031 279 - 37908 65322 280 - 22665 35601 281 - 75378 59200 282 - 16797 86995 283 - 55847 68189 284 - 55932 72688 285 - 41470 96101 286 - 43557 17329 287 - 45439 77868 288 - 41230 76226 289 - 25104 92869 290 - 43736 93653 291 - 85938 93653 292 - 74153 54726 293 - 73956 70350 294 - 70419 37102 295 - 81275 64160 296 - 30656 32684 297 - 46218 32617 298 - 67969 31808 299 - 61544 81806 300 - 39376 56568 301 - 14769 60336 302 - 10199 97703 303 - 61064 40091 304 - 75531 30486 305 - 17211 31808 306 - 75184 74633 307 - 24565 61765 308 - 83922 44529 309 - 11644 25255 310 - 71836 14393 311 - 53030 19028 312 - 83437 33190 313 - 33687 54998 314 - 92054 82083 315 - 48250 68533 316 - 10977 34363 317 - 51050 19028 318 - 80898 68276 319 - 26442 68830 320 - 39875 65514 321 - 24976 76417 322 - 31946 23537 323 - 95278 90255 324 - 71678 26450 325 - 49641 28580 326 - 12962 13674 327 - 13598 30362 328 - 40620 21256 329 - 49062 92869 330 - 88449 79529 331 - 80153 94081 332 - 36918 70556 333 - 77902 99228 334 - 41848 99097 335 - 26032 39378 336 - 23830 50980 337 - 49712 78294 338 - 95464 65322 339 - 76971 27393 340 - 67074 22132 341 - 17629 71246 342 - 92019 92869 343 - 20780 96521 344 - 68372 16880 345 - 49710 88060 346 - 94680 52634 347 - 28626 57101 348 - 31808 60809 349 - 25578 28090 350 - 12020 25255 351 - 46008 33046 352 - 27712 36207 353 - 17168 53033 354 - 92923 87987 355 - 94668 65843 356 - 59490 48858 357 - 69085 38485 358 - 28242 14664 359 - 18302 96101 360 - 64047 71241 361 - 62752 73532 362 - 28873 59278 363 - 22206 18029 364 - 57298 85374 365 - 26420 78294 366 - 74055 30817 367 - 74377 45566 368 - 81846 17058 369 - 35184 27305 370 - 72054 89795 371 - 78666 41563 372 - 80545 96101 373 - 69240 51322 374 - 76319 36831 375 - 23617 14475 376 - 53848 93653 377 - 65082 36888 378 - 18802 93491 379 - 63942 23559 380 - 80208 22876 381 - 17018 68830 382 - 78018 51611 383 - 35520 75130 384 - 43479 88543 385 - 18522 96101 386 - 41260 15010 387 - 58041 21675 388 - 96272 68830 389 - 73601 78294 390 - 44788 52104 391 - 67152 89795 392 - 57671 61399 393 - 33841 56764 394 - 41963 53394 395 - 41010 28090 396 - 53937 65322 397 - 75472 76675 398 - 22253 92068 399 - 24277 93653 400 - 62012 14475 401 - 27539 50141 402 - 29180 41637 403 - 27151 35922 404 - 28752 23559 405 - 31602 47673 406 - 80298 50906 407 - 94689 38297 408 - 87987 48139 409 - 51692 61967 410 - 93653 86995 411 - 99694 96638 412 - 50948 11644 413 - 87830 19794 414 - 57579 93403 415 - 60947 72082 416 - 18514 53324 417 - 99194 25255 418 - 57630 93653 419 - 49914 10526 420 - 34613 94340 421 - 32145 16105 422 - 39569 62764 423 - 14118 31274 424 - 38901 19016 425 - 47443 66925 426 - 83812 31274 427 - 61920 50141 428 - 88684 50713 429 - 32305 31808 430 - 58695 50713 431 - 20016 42720 432 - 68955 31976 433 - 96299 99509 434 - 83258 96101 435 - 49424 68830 436 - 97130 14043 437 - 34668 50936 438 - 27567 35509 439 - 57890 65959 440 - 58399 78860 441 - 88934 50980 442 - 70656 66788 443 - 91507 44529 444 - 53671 87987 445 - 75858 71137 446 - 14726 13674 447 - 25416 31274 448 - 90521 50075 449 - 37289 96101 450 - 79415 19028 451 - 21158 25355 452 - 53210 16168 453 - 35192 81526 454 - 67240 23559 455 - 42967 65310 456 - 81598 93094 457 - 12765 36207 458 - 23853 41643 459 - 78439 22984 460 - 13052 50141 461 - 56642 93653 462 - 19028 82791 463 - 89371 36244 464 - 89795 50799 465 - 41542 90489 466 - 49486 72630 467 - 26630 50763 468 - 35019 68830 469 - 62271 78294 470 - 16433 77868 471 - 42466 57338 472 - 63666 39984 473 - 56231 83564 474 - 51132 96101 475 - 33675 74200 476 - 94670 70445 477 - 51236 17822 478 - 52493 64460 479 - 45346 86995 480 - 41620 31274 481 - 80479 88912 482 - 46200 90255 483 - 13789 60686 484 - 98564 76843 485 - 44974 92717 486 - 76047 80674 487 - 60650 89430 488 - 55723 45722 489 - 89426 97853 490 - 33961 98414 491 - 32872 68189 492 - 65322 12029 493 - 29922 36159 494 - 74923 34697 495 - 37065 59688 496 - 66622 23559 497 - 68253 14475 498 - 28664 53324 499 - 62981 25761 500 - 83161 50674 501 - 22849 50980 502 - 11119 76308 503 - 22980 13794 504 - 76171 19411 505 - 96351 28221 506 - 45573 90255 507 - 19850 79146 508 - 97828 90483 509 - 23867 85271 510 - 36353 50141 511 - 46579 87987 512 - 73434 23559 513 - 57169 68189 514 - 68768 41682 515 - 59354 97617 516 - 62181 64641 517 - 34167 53324 518 - 28374 24803 519 - 55863 57352 520 - 25058 33040 521 - 76126 53005 522 - 97283 51641 523 - 25887 29253 524 - 43067 50713 525 - 51616 61868 526 - 97533 16129 527 - 50692 80951 528 - 43173 41626 529 - 93917 76055 530 - 84713 53465 531 - 24130 13599 532 - 56773 50980 533 - 15310 44529 534 - 63375 50141 535 - 75875 93653 536 - 22284 33135 537 - 46294 77836 538 - 29713 14393 539 - 95318 83346 540 - 83264 61967 541 - 39267 47771 542 - 61101 86995 543 - 47882 96101 544 - 24345 70347 545 - 50674 14475 546 - 17296 12880 547 - 52605 11644 548 - 40817 78294 549 - 36207 93653 550 - 16045 96101 551 - 91784 68830 552 - 34583 69934 553 - 71867 28090 554 - 74898 22671 555 - 54609 27206 556 - 33070 26257 557 - 18570 57394 558 - 16766 87036 559 - 62825 21503 560 - 39793 17504 561 - 12038 82452 562 - 37265 12706 563 - 69479 44529 564 - 96101 44260 565 - 49175 50713 566 - 70708 55412 567 - 50136 14475 568 - 27300 96101 569 - 75794 62368 570 - 10277 87990 571 - 30825 87987 572 - 35563 24149 573 - 12505 91890 574 - 11323 14393 575 - 89922 84455 576 - 10927 65359 577 - 50656 71304 578 - 47973 11644 579 - 17156 92869 580 - 98964 96101 581 - 50980 59345 582 - 94733 23559 583 - 22743 26134 584 - 90255 54273 585 - 80006 65322 586 - 10157 92869 587 - 70496 28090 588 - 25569 41226 589 - 79982 92869 590 - 34897 76485 591 - 83357 86388 592 - 26352 79503 593 - 67432 15174 594 - 49155 72153 595 - 36311 86995 596 - 14394 65333 597 - 70928 51667 598 - 67367 23559 599 - 48195 57003 600 - 52001 26154 601 - 63251 21651 602 - 21894 89795 603 - 50774 43252 604 - 85637 36207 605 - 79243 11644 606 - 49512 57954 607 - 22454 15919 608 - 84214 20805 609 - 67121 86995 610 - 49247 78035 611 - 79313 34840 612 - 33168 19814 613 - 48657 92888 614 - 59824 74905 615 - 30088 68830 616 - 74246 90052 617 - 78389 65322 618 - 88418 28090 619 - 93716 62226 620 - 74962 29324 621 - 47309 50980 622 - 93517 14393 623 - 23895 68175 624 - 34548 25255 625 - 32628 84730 626 - 55988 31274 627 - 82578 40953 628 - 51728 16926 629 - 19440 27805 630 - 42922 45159 631 - 52930 41563 632 - 91562 31274 633 - 23559 62680 634 - 92150 26879 635 - 78315 61783 636 - 43601 91325 637 - 87621 17838 638 - 78580 65350 639 - 94778 77868 640 - 68519 83273 641 - 35509 66389 642 - 82288 52439 643 - 65083 19794 644 - 86995 13010 645 - 66618 95850 646 - 18656 70145 647 - 98537 65322 648 - 60842 52161 649 - 68830 10132 650 - 99689 24077 651 - 33740 89795 652 - 45595 53090 653 - 78239 36207 654 - 20185 36207 655 - 87307 69366 656 - 83009 77868 657 - 34685 88642 658 - 13674 28090 659 - 82450 69909 660 - 44812 75146 661 - 54296 92869 662 - 73558 94990 663 - 21422 48229 664 - 49473 10547 665 - 66108 68189 666 - 71169 74202 667 - 78276 40690 668 - 82977 78294 669 - 61842 15634 670 - 31582 95459 671 - 39064 14475 672 - 70204 18593 673 - 71244 87987 674 - 31642 50490 675 - 98413 37109 676 - 61175 50141 677 - 37168 23559 678 - 44093 11032 679 - 18806 40848 680 - 91249 73483 681 - 95812 32572 682 - 93644 68189 683 - 30669 20850 684 - 75404 92869 685 - 53324 50141 686 - 80675 50216 687 - 14897 73401 688 - 34074 29952 689 - 16366 32630 690 - 95656 28090 691 - 73964 58896 692 - 90705 66916 693 - 92869 59662 694 - 99522 78294 695 - 35903 19794 696 - 33033 42610 697 - 55650 50980 698 - 29289 11753 699 - 32302 58345 700 - 76036 57644 701 - 74870 31274 702 - 85035 77868 703 - 79322 25255 704 - 50332 31274 705 - 78294 44529 706 - 93000 53324 707 - 36560 19028 708 - 40041 53525 709 - 70360 89795 710 - 19074 98749 711 - 32829 89603 712 - 61436 71046 713 - 89938 85369 714 - 52708 28090 715 - 83958 53324 716 - 88155 67097 717 - 32730 75527 718 - 64221 23559 719 - 60391 97432 720 - 70047 20185 721 - 12372 73527 722 - 46501 29274 723 - 66552 14746 724 - 56373 51614 725 - 95596 11782 726 - 81196 72623 727 - 32282 60515 728 - 49504 14393 729 - 57642 34348 730 - 95402 87987 731 - 81625 68830 732 - 28527 37199 733 - 71475 31808 734 - 94280 23005 735 - 55623 99355 736 - 46783 29073 737 - 36641 81559 738 - 74788 14535 739 - 87994 78773 740 - 80189 77868 741 - 33263 89795 742 - 23537 23537 743 - 25755 22264 744 - 67413 72800 745 - 74924 73774 746 - 81215 78294 747 - 78206 92869 748 - 36161 50141 749 - 54925 86995 750 - 66305 49951 751 - 42462 28090 752 - 99051 88912 753 - 44954 89795 754 - 88856 28090 755 - 63026 85778 756 - 22651 24813 757 - 39262 14475 758 - 86176 69982 759 - 65395 14393 760 - 12926 78294 761 - 81994 53324 762 - 16933 30191 763 - 46987 19794 764 - 37215 28090 765 - 15340 63748 766 - 40271 86674 767 - 23747 52856 768 - 61156 11644 769 - 65356 56048 770 - 72336 51278 771 - 21864 77868 772 - 99351 13349 773 - 24599 79046 774 - 62281 23361 775 - 81871 53324 776 - 14029 42297 777 - 50141 48720 778 - 46677 43636 779 - 10745 35965 780 - 39344 80864 781 - 38077 50038 782 - 13983 89795 783 - 66663 67877 784 - 64175 19028 785 - 62355 68830 786 - 96823 79443 787 - 46436 44754 788 - 53388 68830 789 - 45987 92723 790 - 87646 11707 791 - 75997 45545 792 - 69968 93653 793 - 30425 44529 794 - 83211 88109 795 - 28725 64932 796 - 47043 89795 797 - 34475 31274 798 - 42302 94895 799 - 66558 92753 800 - 48964 50713 801 - 19546 78294 802 - 51026 89795 803 - 89346 57408 804 - 52993 54676 805 - 29577 38385 806 - 85932 60320 807 - 18030 22556 808 - 65993 19922 809 - 74692 23559 810 - 61588 89795 811 - 50688 69541 812 - 93760 44529 813 - 75094 96101 814 - 68976 86835 815 - 46278 50980 816 - 97836 44529 817 - 17576 32708 818 - 48519 46071 819 - 72647 93653 820 - 54724 34155 821 - 45186 43448 822 - 44529 41828 823 - 90404 86357 824 - 63175 44529 825 - 88381 25963 826 - 32140 23537 827 - 43348 36423 828 - 41733 88912 829 - 84065 98953 830 - 20389 96101 831 - 38749 93788 832 - 37929 35143 833 - 63747 35340 834 - 72249 93653 835 - 98042 59381 836 - 22741 95783 837 - 88124 33425 838 - 16493 44529 839 - 36599 69408 840 - 50436 41563 841 - 67695 86149 842 - 89091 20022 843 - 60708 92607 844 - 28750 68830 845 - 80224 39113 846 - 34580 96101 847 - 79688 34798 848 - 14870 68189 849 - 47719 29252 850 - 57652 33458 851 - 65541 87987 852 - 86435 19794 853 - 95204 81239 854 - 43800 50980 855 - 94063 11644 856 - 24096 36588 857 - 36628 95478 858 - 81443 17329 859 - 61221 57166 860 - 52782 78294 861 - 16740 31274 862 - 68369 45653 863 - 28895 44529 864 - 39222 65582 865 - 97201 77602 866 - 81119 11644 867 - 41083 50141 868 - 72917 25255 869 - 46148 21269 870 - 44495 18020 871 - 99464 90525 872 - 67254 58381 873 - 52750 28135 874 - 63899 55754 875 - 14617 50713 876 - 36962 50713 877 - 41322 73436 878 - 22504 38709 879 - 72577 39875 880 - 67799 68830 881 - 68284 71156 882 - 46011 61967 883 - 50367 31808 884 - 45832 87987 885 - 88775 87987 886 - 32562 26340 887 - 43756 49887 888 - 73444 16547 889 - 67302 92449 890 - 22133 85451 891 - 17768 77868 892 - 69281 39885 893 - 87364 25255 894 - 41209 27363 895 - 37792 77868 896 - 66667 73746 897 - 22195 28090 898 - 65037 37556 899 - 28634 89795 900 - 23901 50674 901 - 40511 95801 902 - 47779 45253 903 - 76489 86807 904 - 77873 66992 905 - 87523 35509 906 - 32876 50980 907 - 62342 50980 908 - 84222 41563 909 - 88205 40382 910 - 78856 20051 911 - 97888 68189 912 - 22233 17329 913 - 35868 81437 914 - 80155 93653 915 - 82730 78294 916 - 12733 19794 917 - 55038 26258 918 - 50682 23250 919 - 42043 74279 920 - 54719 71512 921 - 54474 23991 922 - 61776 25255 923 - 55564 41563 924 - 39404 31274 925 - 94954 14475 926 - 76258 89795 927 - 87689 67995 928 - 65619 59930 929 - 41846 17435 930 - 21990 22185 931 - 60161 53026 932 - 44955 57523 933 - 84178 39875 934 - 32693 87987 935 - 19125 44529 936 - 96731 93653 937 - 98080 44529 938 - 72947 95746 939 - 67285 23344 940 - 78101 77580 941 - 43064 11644 942 - 81350 23483 943 - 46937 11644 944 - 97686 79381 945 - 66339 60744 946 - 39269 50674 947 - 61837 77868 948 - 97647 86995 949 - 44613 93568 950 - 73127 68830 951 - 64048 80370 952 - 15530 87987 953 - 63926 51860 954 - 95853 91981 955 - 26155 28090 956 - 82222 19794 957 - 10035 87445 958 - 16445 93653 959 - 67972 15558 960 - 51780 68830 961 - 52358 31274 962 - 83942 60096 963 - 64899 11955 964 - 56009 96101 965 - 42288 36590 966 - 53349 65322 967 - 76255 50713 968 - 53044 26351 969 - 37184 31274 970 - 24813 19028 971 - 62309 52490 972 - 93607 19028 973 - 27423 45568 974 - 26128 78294 975 - 72691 50141 976 - 42162 60052 977 - 78247 10613 978 - 80209 31808 979 - 38310 93653 980 - 59228 47607 981 - 24897 23559 982 - 55176 37760 983 - 33062 53324 984 - 26521 39170 985 - 93209 68189 986 - 89881 23559 987 - 11418 50980 988 - 16884 78294 989 - 31995 50980 990 - 17858 98671 991 - 49107 96101 992 - 50512 54526 993 - 56890 65322 994 - 76173 65309 995 - 51569 52845 996 - 73919 23537 997 - 62591 16739 998 - 53735 79935 999 - 14454 69804 1000 - 19976 46609
-92
day_1/src/main.rs
··· 1 - #![feature(test)] 2 - 3 - extern crate test; 4 - 5 - use std::{collections::HashMap, fs}; 6 - 7 - fn part_1(left: &Vec<u32>, right: &Vec<u32>) { 8 - let mut diff: u32 = 0; 9 - for (i, l) in left.iter().enumerate() { 10 - diff += l.abs_diff(right[i]); 11 - } 12 - 13 - println!("Part 1: {diff}"); 14 - } 15 - 16 - #[derive(Debug, Clone, Copy)] 17 - struct Occurences { 18 - left: u32, 19 - right: u32 20 - } 21 - 22 - fn part_2(left: &Vec<u32>, right: &Vec<u32>) { 23 - let mut mapped = HashMap::<u32, Occurences>::new(); 24 - for (_, l) in left.iter().enumerate() { 25 - let v = &mut mapped.get(l).unwrap_or( &Occurences { left: 0, right: 0 }); 26 - mapped.insert(*l, Occurences { left: v.left + 1, right: v.right }); 27 - } 28 - for (_, r) in right.iter().enumerate() { 29 - let v = &mut mapped.get(r).unwrap_or( &Occurences { left: 0, right: 0 }); 30 - mapped.insert(*r, Occurences { left: v.left, right: v.right + 1 }); 31 - } 32 - 33 - let reduce = mapped.iter().map( 34 - |(num, occurences)| { 35 - num*occurences.left*occurences.right 36 - } 37 - ); 38 - 39 - let similarity: u32 = reduce.sum(); 40 - 41 - println!("Part 2: {similarity}"); 42 - } 43 - 44 - fn parse_input() -> Option<(Vec<u32>, Vec<u32>)> { 45 - let input = fs::read_to_string("./input.txt").expect("Couldn't read file"); 46 - 47 - let (mut left, mut right) = input.lines().map( 48 - |l| { 49 - let mut split = l.split_whitespace(); 50 - let left = split.next(); 51 - let right = split.next(); 52 - 53 - ( 54 - left.unwrap().parse::<u32>().unwrap(), 55 - right.unwrap().parse::<u32>().unwrap() 56 - ) 57 - } 58 - ).collect::<(Vec<_>, Vec<_>)>(); 59 - 60 - left.sort(); 61 - right.sort(); 62 - 63 - Some((left, right)) 64 - } 65 - 66 - fn main() { 67 - let (left, right) = parse_input().unwrap(); 68 - part_1(&left, &right); 69 - part_2(&left, &right); 70 - } 71 - 72 - #[bench] 73 - fn full(b: &mut test::Bencher) { 74 - b.iter(|| main()); 75 - } 76 - 77 - #[bench] 78 - fn input_only(b: &mut test::Bencher) { 79 - b.iter(|| parse_input()); 80 - } 81 - 82 - #[bench] 83 - fn part_one(b: &mut test::Bencher) { 84 - let (left, right) = parse_input().unwrap(); 85 - b.iter(|| part_1(&left, &right)); 86 - } 87 - 88 - #[bench] 89 - fn part_two(b: &mut test::Bencher) { 90 - let (left, right) = parse_input().unwrap(); 91 - b.iter(|| part_2(&left, &right)); 92 - }
-1
day_3/.gitignore
··· 1 - /target
-54
day_3/Cargo.lock
··· 1 - # This file is automatically @generated by Cargo. 2 - # It is not intended for manual editing. 3 - version = 4 4 - 5 - [[package]] 6 - name = "aho-corasick" 7 - version = "1.1.3" 8 - source = "registry+https://github.com/rust-lang/crates.io-index" 9 - checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 10 - dependencies = [ 11 - "memchr", 12 - ] 13 - 14 - [[package]] 15 - name = "day_3" 16 - version = "0.1.0" 17 - dependencies = [ 18 - "regex", 19 - ] 20 - 21 - [[package]] 22 - name = "memchr" 23 - version = "2.7.4" 24 - source = "registry+https://github.com/rust-lang/crates.io-index" 25 - checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 26 - 27 - [[package]] 28 - name = "regex" 29 - version = "1.11.1" 30 - source = "registry+https://github.com/rust-lang/crates.io-index" 31 - checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 32 - dependencies = [ 33 - "aho-corasick", 34 - "memchr", 35 - "regex-automata", 36 - "regex-syntax", 37 - ] 38 - 39 - [[package]] 40 - name = "regex-automata" 41 - version = "0.4.9" 42 - source = "registry+https://github.com/rust-lang/crates.io-index" 43 - checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 44 - dependencies = [ 45 - "aho-corasick", 46 - "memchr", 47 - "regex-syntax", 48 - ] 49 - 50 - [[package]] 51 - name = "regex-syntax" 52 - version = "0.8.5" 53 - source = "registry+https://github.com/rust-lang/crates.io-index" 54 - checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
-7
day_3/Cargo.toml
··· 1 - [package] 2 - name = "day_3" 3 - version = "0.1.0" 4 - edition = "2024" 5 - 6 - [dependencies] 7 - regex = "1.11.1"
-6
day_3/input.txt
··· 1 - <;'mul(234,359)who()-who():where()}%what()(when()mul(260,344)}[$*{&from()?]>mul(87,298)what()&+)who()(!#!when()mul(407,173)who(952,771)how()@!?what()]#mul(763,519)'from()$when()%mul(258,409)<)mul(703,155)who()who()<!!mul(423,685)%<?what()how()!,mul(647,758){'mul(595,333)';mul(228,760)~what()@when()who(617,201){{mul(403,912)when()-}(^[^;mul(513,464)where()mul(154,341),$~#^/ mul(469,16)^mul(328,795) from()what()who()when()from()mul(547,469)how()}<?#(/mul(365,823)where();]^^@{(mul(211,19)from()?-+?;@how()where(921,941)mul(816,990)/#)<when():<:'mul(698,62)&~@)+^&$mul(485,158)why()<when(),how()>when()-^}mul(736,421)^<^@?]#;mul(817,275))do()from()how()@where()<@mul(909,873)]:don't()!}&%why(418,225)}-(#mul(212,255)%} ;!]mul(707,897)how()$mul(837,220)when()(,-:+mul(560,935)mul(932,628)when()$&[mul(860,85)&where(){;*:mul(189,383)#'mul(219,523)(who()mul(950,9)';/mul(388,844):~,mul(66,658)where()what()&$&mul(871,390):-mul(587,687)?what()mul(905,131)]what()/+don't()->when()];<select()-where()mul(926,945)'mul(180,934)!don't()mul(736,865)//%mul(662,142)^+>where()'mul(108,216)@?]:mul(222,569)from(961,743):$&-/when()*where()@mul(669,307)$&]who(719,188)>#how()< mul(902,394)when()-^:mul(949,576)@mul(193,521)mul(319,755)?where()mul(494,883)(,>@where(533,792)/mul(579,616)&+?how()~select()mul(840,737)why()-+select()/how(313,74)//where())mul(895,693)from()<don't()mul(984,889),)}who()mul(233,534): ^&~;/<mul(257,146)'( -#!from()]^mul(870,750);select()-how(155,90)why(315,964)mul(298,2)$,how()!@from() #what()#mul(977,312)$&{!who():+$:mul(544,624)from()/mul(404,459)$:?}(@<@what()mul(607,342)who()@how()who()]mul(182,480)'what():@%>*~#mul(410,170){*{where()~~why()}who()mul(796,85)'+&^-)mul(603,101)who()*who()when()@when()where()%/mul(925,329) who()[& ] mul(788,146):^mul(959,154)#{;select(),:^+(from()mul(763,850)/+?mul!,&'what()from())+mul(241,655)>'^/)>why()who();mul(431,988)$from()mul(289,336) &how()what()mul(225,551)when(465,383)&!?['&when() %do()* when()#mul(677,661)what()?mul(688,941),!what(),who()?(who()mul(954,807)!'why()mul(414,536)'who()mul(614,164)mul(941,169){>:mul(755,577)@;!'^@{+mul(640,716)from()from()!where()where(503,241)(&mul(155,305)>([when())select()who(),>,mul(624,695);,what()[]select()!where()who()$mul(100,414)]where()how()!^:who()do())mul(116,506){<%/mul(922,523);why()&mul(850,674)[>^<$;select()what() mul(671,568))why()~?**[*how()mul(920,910)^^-@what()mul(783,710) ]#who():who()mul(492,190):%<how()mul(432,182)[%?mul(758,818)%+!@~mul(241,233)^mul(557,142)^?where()what()why()mul(400,622)%)$mul(251,504){#>+&+(how()#mul(771,755)~mul(709,707)<$[<~}why()[what()[don't()%(^mul(987,332)-]%+]<}who()!mul(144,70)~;*<:mul(218,330);*}what()who()mul(334,779)[@select()where(631,792),)mul(508,632))%;!what()select())>mul(411,371)(?who()select()>?:mul(526,934)mul(804,300) 2 - *+!#-select()where()mul(91,61)$'#&who()where()[,)who()mul(995,486)~(from()]mul(395what()[%from()'%mul(3,116)$-;>why()mul(80,100)don't()+<{mul(40,909){,from()-from()}*mul(5,637)~#don't()>{)#?~mul(710,464)mul(574,738)),'mul(529,787)])how()<who()?*/:#mul(989,869)]how(96,728)+?what()where()])mul(725>,':+<{}mul(805,948)#&!do()#>who()()mul(741,273)mul(183,374)@#{~from()+from()-#mul(155,454)^@#%+<[^{where()mul(24,698)^~!what()don't()^mul(807,271){*;#?&^;from()<mul(210,40):why()*^!$/@mul(392,727)!]:;[?>how()mul(95,214)>select()#~why(152,808)] do()mul(242,354){mul(118,780)<where()mul(237 what()/mul(943,660)mul(238,123)<+}#what()&+where()!mul(850,209):'*select()mul(832,641)mul(374,249) {*{>'@ )?mul(6,158)when()how())[#select()^+<mul(757,651),why()}(#!mul(113,873)-%!mul(157,958):don't()}where()where()why()?!mul(596,489)*from() &&mul(699,920)mul(528,834):^how()+$mul(766,867)*#do()&mul(548,545)(/,*$mul(65,784when(360,503)}from()mul(715,419)what()#/mul(629,49)# who():~mul(362,297)<<from()mul(355,704)>}[;how()[who(101,571)why()><mul(840,568)&,&from()don't()when()mul(706,400)}:'mul(745,820)from(){where()?/!~mul(520,697)*#when()mul(428,711)mul@how():who()*@%];mul(516,414)where()-how()]*;mul(669,963)~from()]select()how()(mul(723,742):,what();}& why(274,391)>mul(791,364)who(683,177);mul(590,613)from()when()why()*:mul(440,124)who(82,539)how()-*%' ,when()&mul(566,425)-;*//(how()<*don't()<%?!{%why()$>mul(37,637)(what()(]<':mul(591how()when()$>$:+#mul(919,784)>*}select()} mul(9,439)';{from()mul(774,58)!%':from()mul(382,161)/when()select(){>#%&mul(434,502)^&/(why()}when()why()from()mul(407,807)'<*{#mul(506,544)],+'[mul(288,577;}>+@who()(mul(684,3)>#mul(878,375){ mul(868,218)why(){mul(738from()+!who()&mul(226,71)from():-where(898,603)/$mul(429,484);}(&-,(]mul(373,23)+,mul)!who()where():;select()how()mul(619,655))mul(572,765)</-mul(422,415)select()how()/)how()mul(691,406);% [what()(from()mul(46,308)$where()'!mul(882,592)when()what(736,407)(why()?(< /-mul(42,917)mul(86,993)~~mul(243,489)*+:from()^who(777,604){[mul(54,523)}mul(675,809)}how();who()mul(52,681)${:who()mul(124,290>?;:&why();%(mul(662,820)from()when()+mul(451,488)* /mul(833,260)'mulwho()#]how()from()*@mul(796,371);{{@^<;~mul(82,742),who()[?:'what()do()@}-}mul(466,182),select()$}{^~how()^mul(263,924)?{??mul(979,300)/:*!mul(85,685)>mul(289,416why()?++$%}{mul(519,250)#&/mul(42,521)what()mul(665,935)where()>~<)who()[mul(457,738)-'$mul(459,702)$;~{;+mul(36,315)mul(881,516)*#$~from()why(967,755)mul(569,650when()>~!:*%&don't()}(^who() ~how()mul(84,748)how()mul(362,548)select()/:%mul(30,445%;;/(}who(971,849)<?^mul(688,9)when()mul(848,69),]mul(109,183)mul(764,444)[(]{[^(mul(505,559)%[mul(470,217)$@select()*why()$ mul(374,21)~what()[}who(); @}mul(387,945)how()),mul(990,737)where(),~*mul(947,938)[mul(603,229)#when()who()*select()mul(852,493)mul(537,342)mul(442,380]],$mul(122,335) 3 - -mul(510,616)mul(235,612><#}who()+?(mul(367,39){};mul(435,762)from()&<?,~select()#where()mul(465,421)'where(608,591)+&when()mul(422,877)$)/#)?{why()(mul(184,55)(select()[&mul(92,651);when()#*[mul(527,555)mul(208,942)({)how()[select()[who()do(){*who()-/$@mul(427,566)where()!&[when() mul(512,215)[select()[where()$how()'where()mul(725,463);#select()don't(),-~+when()%mul(174,734&?mul(929,59)#<what()~$/(mul(184,5)%{}mul(121,138)?where()mul(840,231)}mul(13,563)}?what()why()*>mul(967,363)what()-select()how()!select(),what(){mul(678>what()what()where()mul(32,798)(where(994,20)mul(657,41)when()select(949,914))^mul(790,381)where()mul(854,543)mul(133,378)%how()select()/from()mul(629,798)}mul(371select()do();/where()#''mul(218,299)$^from() ' +why()mul(401,872)!/select()mul(824,807^[mul(992,848)from()%what()when()(-(,mul(453,186)how()who()mul(320,220)who() why()mul(445,909)^>mul(535,611)who()%what()<&mul(760,213){mul(842,923)}'what():when()%where()--do()when()where(732,868)when():why()'why()why(242,296)#from()mulwhen()}{-'>}!why()mul(820,582)~mul(661,206)({don't()select()+when()*:who(544,855)$from()mul(463,28'<](who()mul(851,538)}#]who()who():from()#%mul(320,395)!/when()~$#{+-mul(822,348){)((what()}$mul(396,562)mul(597,851)mul(164,858):!>]mul(421,774)+(mul(302,479)@$mul(393,48 /)}who()@why()+$(mul(94,468))#from()mul(97,244)'?>-how()mul(801,524)+*mul(798,793))!where()~?*mul(803,188) ~when()''mul(276,321(select()do()$&]what()why(224,253)>>$&~mul/*-@'?!mul(273,411)when()-@;why()[when()mul(911,533)!+^how():@from(177,840)@from(951,534)?mul(870,233)from():when()who()where()who()mul(199,165)mul(807,41)what()'~**:mul(487,78)}};mul(392,620)^{why()*<?-when(542,189)mul(531,837)how()]{?mul(798,614)mul(864,588)what(856,979)+~,}select()?&mul(659,85)>who()&(who()~when()#how()!mul(22,783)?select()[&why()select()^mul(671,865)mul(927,45)*#;;how()&mul(519,741)mul(656-what()select()?where()mul(214,386),why()how()mul(924,777)why()%^ &when()what(998,86) [do() -:?how(235,349)%mul(567,616)from()from()mul(665,710)-:*+select()when()[do()[$from()-$%mul(113,895)#-][&when()#where()><do()(!mul(797,837)select()mul(524,378){>%when()mul(914,804)'why(88,694)]]}mul(52,954))why()don't(){[[>@-mul(988,821){],?'how()%:mul(448,457)+ who()?who()mul(62,38)^&>#*?mul(464,719)mul(251,921)mul(82,764)}*#mul(150{+who()+mul(659,141)}select()>why()/mul(270,268)how():mul(523,786);how()+why(685,187)mul(607,577)?(:mul(510+&!&$why()mul(263,702)from(),<^mul(679,458))'/!&do()select()mul(174,946);! :''mul(876,163)%what()/mul(182,358)-+what()^mul(510,134)>select()*who()mul(538,210)from(),how(362,521)@>select()what()who()why()from()mul(525,17)what()(mul(367,947) ?+mul(602,880)^,select():[why()mul(782,143)}]mul(310,79)mul(693,386),mul+~where()];from()?>where()mul(749,859)select() +,^where()mul(611,689)where())!+!!,:mul(486,599)>how()><where()%when()why()>mul(409,246 mul(220,151){select()where()^mul(168,729)>mul(42,222) ;mul(460,16)/({why()}&mul(378,136){@})mul(713,841where()mul(622,542)who()^}#from()mul(975,695)mul?):]mul(65,736)]from()[(,&#who()from()mul(601,954'~*()<;$> mul(332,193)-~when()/[+,/,#!/usr/bin/perl;mul(507@[how()#'where()why()mul(607,129)@where()*'who()~&mul(48,672) 4 - ;[?-+(@when(618,593)@mul(463,743)@&when()&~;<&mul(78,96)^]mul(857,303);~/select(),mul(980,536)who();#$mul(223,620){ -(where()mul(960,194)+! [((who()@%mul(530,458)~[?'from()%){%mul(547,623)%(:from(622,543),mul(484,923)why()who()&)mul(261,937)what()#>where()from()[)'mul(342,883)who()$mul(630,484)what()mul(29,250)]'%}when()~!&>mul(995,972)when()mul(15,702)(~#[where()mul(965,454)/,who()mul(739,675)@%-how()-what()*'%mul(810,99)when();[ #mul(22,38)+don't()~[#who()/mul(17,38) why()mul(778,682)how()@?<when()<%mul(695,791)&+%?-where()>[#~mul(780,237)#what()'mul(338,796)$what(825,687),><</how()<]mul(593,291)-:mul(107,558)&from()select() ,how()*[how()mul(811,501)*~(}[{@/,$mul(588,893)--select() ,*mul(291,200)@mul(380,703);~why()how()where()?-how()[mul(746,5),~-mul(271,992)*$*when()mul(626,216)(how()!<how()' how()mul(648,45) {(,what()where(946,541)}#mul(144,262){-#)when()~^mul(515@where()$ +]mul(357,55)^[)mul(404,638){mul(917,462)why()mul(826,942)what()$;][who()what()how()mul(829,811)~what()~when()-)mul(288,652) /who()mul(326,472),))mul(86,683)$/select()/$}where()-)+mul(561,359) '<)mul(304,38)select()>/+@^mul(885,827)?[ why()^when(364,10)>&mul(852,590)^<when()why()why(),~mul(311,677)*mul(707,282)when()mul(19,241)mul~:>/how()%from(699,716)mul(680,396)[!%}select()when(463,111)~who()#mul(363,227why()@,mul(487,707)how()[{+/what()'[}[mul(975,629)>>++{[$mul(336,79):from()mul(707,55)#)select()*<who();mul(602,976)mul(949,866)what()when()mul(72,693)+/$*(from():where()'{mul(202,519)%'mul(773,650)&}[when(): #(&mul;+/!##?why()mul(369,77)from()}#(,]who()>]mul(992,868))where()mul(106,687): $!where()mul(744,983)how()!mul(313,790)(+))]select()*!>:mul(210,868)+;why(672,934)how()when()why()>%]/mul(108,885)&/{how()mul(159,898),()who(),when()?<#mul(188,958):from(636,533)+&<*[select()how()mul(152,658)who()*;mul(477,718)when(720,25)!who(){&mul(795,952)select(435,575);!/how()select()^select()mul(281,344)from()$<>*:!mul(830,180))(select()how():&mul(397,50)*mul(413,309)where()~,/,mul(796,87)*<~&!(&don't()select()( what(709,443) &who()']mul(445,518)^:mul(655,75){from()mul(377,846)where()mul(321,815)mulfrom()>mul(937,444)where()?}how()mul(112,471)what()>%when()where()who()<$mul(318,492)-what()mul(78,20)select()?mul(851,874)&!#;select():?'^*mul(598,757)mul(326,573){/[%,why();mul(445,682'(who()^+why()why()from()mul(816,284)*%&^'^)>mul(274,211)@*,'^(mul(592,927) ;!~&how()~mul(195,155)mul(896,831)what()()+#who()&*mul(708,134}^who()where()&[mul(138,384)+select()who();where()-?&[mul(767,907)*mul(436,412);[;)-{#(where()mul(987,536)don't()#?mul(616,255)+]:when()when()}#mul(41,533)#^>from()<how(290,301)mul(63,747)what()(+;^,#who()how():mul(249,969)select()+ mul(387,732):+{what()~:!select(67,813)mul(788}!;:*where()<mul(291,542)why()('^&where()]/how()&mul(605,763)-]-why(),@mul(556,282)how()'>!what()mul(151,867);/]select(),mul(754,334)&:mul(97,118)select()mul(593,702) 5 - &*don't()]select()from()where()[mulwhen()^^/from()&mul(461,659)&mul(643[mul(572,503)mul(588,137){;mul(849,301)who()how()%;why()who()mul(233,687) why()*do()+who(),#how()( -mul(650,3)^+mul(14,551)who()^#? !<from()]mul(912,640)!?where()*%mul(328,45)/how();;where()(mul(843,155)who()what())?%what()what()@mul(923,667)) @how())+who()-mul(503,43)when(530,489)why()from()&select(617,173)what()mul(471,175>~>-mul(628,710)%;why()<('$&:when()mul;why(155,340):^+where()/[%@mul(931,55)%(~:why()from()mul(715,482)!{mul(766,239)how()mul(284,603)>where(897,837)mul(530,610),;-why()<select()/]!mul(389,108)'[~#mul(230,503)^)%~^how()^(&mul(216,268):mul(190,552$</who()!select()]do()}what()mul(144,685)%(don't()/[where(),>^}select()(mul(470,194)from()*,who()!mul(394,768):from()?{$ ;@~mul(571,519) what()[:mul(65,328)where()>~where()< :#mul(490,774)'why()>,@<mul(945,164)?,select()from()]mul(191,618);') #mul(984,94)^^mul(764,343)[!~?%why()-select()mul(802,97)#why()when()~,<?mul(817,989)![>mul(588who()}!-'mul(35,602)+ -%[' how()]:mul(502,722):why()!!mul(332,723)!{ ,[}{^who()don't()&@[when()>'mul(695,738)select()how()do()what(635,547)};>mul(50,148),,,mul(974,330)mul(973,477)+>mul/<how()why()])[+where()mul(727,316)&}#*];(~+do()>when()mul(74,42),how()who():,what(182,526)>mul(301,319)from()*how()#mul(808,632)don't()%- ~mul(671,835)who()}&mul(330,88)){+when()&who()<$who()where()mul(653,324))(select(){/!*select())<mul(933,167)/::?+~*how()mul(266,2):**!)what()mul(491,655)}?mul(949,984)~(,who()%mul(254,681)who()%from()-;from()?%{)do() [{mul(570,36)):^;{-who()<mul(820,352)/,>select()mul(800,74)mul(780>~where()[)/why():+mul(95,301)+#~-]^< mul(453,169))!)-who()}select()!/+mul(514,816)'>,)mul(188,237)'(*><<who()why())how()mul(738,289)what(639,365)$</]~'}what()when()mul(102,510)mul?!/%why()-why()who()where()how()don't()who()who()&',~%*where()mul(790,751)@;]mul(699,591)from(10,889)'from();~?%'mul(501,173)):mul(92,868)~>#@from()$&[mul(896,181)+why()[/}mul(292,818):what(933,189)when()where()+when(),how()mul(325,460)*!'?$}why()mul(868,19)]>do()]]'@-select()+?:,mul(705,664)why() :when(320,386):]where()mul(101,603)from()mul(584,674){*why()mul(527,341)mul(314,923),&*!#don't()from(),&: mul(610,911))(!when(12,857)how()&}/don't(){from(872,604)[]}}$when()from(393,26)mulwhy()why()from():;] }mul(618,762)who()>#' <-@why()#mul(342,769)#'-&<:from():>*mul(995,557)[':&when()&don't()%+}:who(699,463)}?mul(949,652):why()#'what()mul(466,912)how() ~where(){?mul(498,589)-:]}*(<?&mul(922,310)mul(469,882when()who()#{mul(553,266)!;&(%select()?#@how()mul(84,210)from()where():mul(7,362)~?{$~!:why()^mul(770,657)]%#mul(601,370)how()?#mul(81,96);who(){mul(519,362)what()} ##:~>mul(554,92)select();~how()&#mul(296,200)$why()why()don't()mul(718,92)[select()*?:where()mul(868,217)when()'what()]mul(608,255how():*~when()!:%{how(720,870)mul(857,876)+[how()select():[mul(926,987)why()]select()don't()%?,/&][]>^mul(20,520)mul(970,495); ?from(971,165)+@'{>mul(541,168)mul(697,290)/mul(724,20)/@/how()when()select()(]why()do()-(mul(250,857)}~<mul(670,830):mul(37,452)#%</who()@why()mul(258,824)'-^+#}how(683,511)from()who()mul(572,263))(mul(516,90)&# }where(161,891)$?>mul(612,107):>'}+{(@<mul(410,789)'@mul(41,356) 6 - how()who()from()why()&+'what()+mul(948,970)how()^^ what()what()mul(124,952)#?why()']?when()mul(559where()$/<}#mul(683,315),{*mul(835,821)@%{who()?mul(528,442)#{/+!#>&?mul(264,859):'{;+]who()-mul(671,460)}how()when()[{mul(383,254) !mul(3,918)mul(874,303)!@mul(279,457)why()*>from()do()#/?<mul(522,927)what()[)what()~~how()when()}>mul(567,487)<what()?,][*}mul(390,810)![why()$who()mul(632,35):~ ',mul(741,335)[how()+>]*&don't()(who()}'mul(522,610)when()${{]#'mul(311,306);{^{ '[mul(270,712)@'}%why()#~:^what()do()>mul(6,137);from()-*%,;~<mul(123,497)mul(47,167>how();+ from()[?&how()]do()~who())& &;%why()why()mul(742,979)$}#,what(609,482)^mul(506,252) -:what(362,209) who()mul(399,346)%'&?mul(229,623)!)how()~mul(436,283)!)@how(){?mul(237,965) #>mul(594,38)^-mul(516,90)who(441,355)[+from()/how()mul~%[mul(434,408)where(690,778)when(978,434)>]?what()[mul(907,397)?@do()?@,select()who()-%(]where()mul(36,78)(:+when()select()mul(477,631)[#when()}mul(45,264@who()select()(mul(656,657)]select()how()[))from()mul(444,181)]!+select(36,597){*who()!/ mul(543,648)from()from()from()$when()+-} mul(293,90)who(183,746)mul(872,855how()[!>~from()*?'<mul(449,852)$:why()!+mul(71,240)?@#}:where()+from(){mul(191,72)@&^&({from()mul(981,127)?&how()[}mul(78,213)*&where()when()^what()@&%mul(149,819)@why()from(376,630) when()+don't()(><] mul(664,827)'-from()#*]mul(912,740)'from()when(473,160)mul(459,94);do()?:, ],{mul(322,110)}>where()}when()when()mul(443,449)where()#}~]mul(94,385)where()>do()<*:@##?what()'mul(63,18)[mul(414,464)>do()what(858,375)%}<'^!*mul(855,863)(mul(557,951)select()$what()+?%/ ]mul(805,186)^who()'mul(549,457)mul(604,658)select()!*~mul(508,395)where()+~]^mul(404,113)*)&$-'where()mul(428,314)$($(%$/,?where()mul(33,256)?mul(199,365)&select()when()>what(111,916)from()mul(588,754)(},@-+who()when()mul(828,506)&select(),select()who()#mul(689,772)$-&@+~what()mul(96,741)}?{-where()when(891,721)~do()*#<%who()^&;#how()mul(365,858)*$mul(903,693)who(385,109)what()'%}'mul(27,403)who()mul(874,113)( ,-@@mul(260,787)@why()*from()mul(679,437)?why()from()-what()mul(240,527):,from()>#[$do()}what()]mul(632,184)&)[?when()mul(70,409):[^-where(585,55)]%^mul(779,948)?$}from();[+?mul(964,869)-?^when() [ mul(729,356)how()({>]+ why()how(908,783)from()mul(774,617)!how()')*;]mul(484,579),#select()&why()mul(873,5)(/(@mul(573,802)what()<(<*mul(759,343)?mul(301,853)when()][) don't()?+from()mul(556,868)?$how()@>*when()<:$don't()/<^)/what()!mul(434,251)mul(882,866),mul(744,572)(why(112,504)$-how()mul(154,96)mul(201,94)$[:@&%-,>!mul(188,433)!*?mul(546,999)%&@>*/mul(310,391)-<+{]mul(938,579)+,@%[why()why(75,712)+from():mul(472,593)^mul(733,69)why())mul(961,406)~@$* )-from()mul(932,700): %!mul(382,321)!mul(297,196)where()mul(444,227)what()where())^#who()from()-mul(65,99)$:why()mul(652,486)mul(446,486)mul(970,630)$~]mul(510,304)]*:>how()/}$
-112
day_3/src/main.rs
··· 1 - #![feature(test)] 2 - 3 - extern crate test; 4 - 5 - use regex::Regex; 6 - use std::fs; 7 - 8 - enum Value { 9 - Flip(bool), 10 - Mult(usize, usize) 11 - } 12 - 13 - fn part_1(input: &Vec<Value>) -> usize { 14 - let sum = input.iter().map(|v| { 15 - match v { 16 - Value::Flip(_) => { 17 - 0 18 - }, 19 - Value::Mult(a, b) => { 20 - a*b 21 - }, 22 - } 23 - }).sum(); 24 - 25 - println!("Part 1: {sum}"); 26 - 27 - sum 28 - } 29 - 30 - fn part_2(input: &Vec<Value>) -> usize { 31 - let mut enable = true; 32 - 33 - let mut sum: usize = 0; 34 - for value in input.iter() { 35 - match value { 36 - Value::Flip(b) => {enable = *b}, 37 - Value::Mult(a, b) => { 38 - if enable { 39 - sum += a*b 40 - } 41 - }, 42 - } 43 - } 44 - 45 - println!("Part 2: {sum}"); 46 - 47 - sum 48 - } 49 - 50 - fn parse_input(input: &str) -> Option<Vec<Value>> { 51 - let mul_regex = Regex::new(r"mul\((\d+)\,(\d+)\)|(do\(\))|(don\'t\(\))").unwrap(); 52 - 53 - let caps = mul_regex.captures_iter(input); 54 - 55 - Some( 56 - caps 57 - .map(|cps: regex::Captures<'_>| { 58 - let t = cps.get(0).map_or("", |m| m.as_str()); 59 - match t { 60 - "do()" => Value::Flip(true), 61 - "don't()" => Value::Flip(false), 62 - _ => Value::Mult( 63 - cps.get(1) 64 - .map_or(0, |m| 65 - m.as_str().parse::<usize>().unwrap() 66 - ), 67 - cps.get(2) 68 - .map_or(0, |m| 69 - m.as_str().parse::<usize>().unwrap() 70 - ) 71 - ) 72 - } 73 - }) 74 - .collect::<Vec<Value>>() 75 - ) 76 - } 77 - 78 - fn main() { 79 - let file = fs::read_to_string("./input.txt").expect("Couldn't read file"); 80 - 81 - let input = parse_input(file.as_str()).unwrap(); 82 - part_1(&input); 83 - part_2(&input); 84 - } 85 - 86 - #[bench] 87 - fn full(b: &mut test::Bencher) { 88 - b.iter(|| main()); 89 - } 90 - 91 - #[bench] 92 - fn input_only(b: &mut test::Bencher) { 93 - let input = fs::read_to_string("./input.txt").expect("Couldn't read file"); 94 - 95 - b.iter(|| parse_input(input.as_str())); 96 - } 97 - 98 - #[bench] 99 - fn part_one(b: &mut test::Bencher) { 100 - let file = fs::read_to_string("./input.txt").expect("Couldn't read file"); 101 - 102 - let input = parse_input(file.as_str()).unwrap(); 103 - b.iter(|| part_1(&input)); 104 - } 105 - 106 - #[bench] 107 - fn part_two(b: &mut test::Bencher) { 108 - let file = fs::read_to_string("./input.txt").expect("Couldn't read file"); 109 - 110 - let input = parse_input(file.as_str()).unwrap(); 111 - b.iter(|| part_2(&input)); 112 - }
-100
flake.lock
··· 1 - { 2 - "nodes": { 3 - "fenix": { 4 - "inputs": { 5 - "nixpkgs": [ 6 - "nixpkgs" 7 - ], 8 - "rust-analyzer-src": "rust-analyzer-src" 9 - }, 10 - "locked": { 11 - "lastModified": 1732689334, 12 - "narHash": "sha256-yKI1KiZ0+bvDvfPTQ1ZT3oP/nIu3jPYm4dnbRd6hYg4=", 13 - "owner": "nix-community", 14 - "repo": "fenix", 15 - "rev": "a8a983027ca02b363dfc82fbe3f7d9548a8d3dce", 16 - "type": "github" 17 - }, 18 - "original": { 19 - "owner": "nix-community", 20 - "repo": "fenix", 21 - "type": "github" 22 - } 23 - }, 24 - "flake-utils": { 25 - "inputs": { 26 - "systems": "systems" 27 - }, 28 - "locked": { 29 - "lastModified": 1731533236, 30 - "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 31 - "owner": "numtide", 32 - "repo": "flake-utils", 33 - "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 34 - "type": "github" 35 - }, 36 - "original": { 37 - "owner": "numtide", 38 - "repo": "flake-utils", 39 - "type": "github" 40 - } 41 - }, 42 - "nixpkgs": { 43 - "locked": { 44 - "lastModified": 1733064805, 45 - "narHash": "sha256-7NbtSLfZO0q7MXPl5hzA0sbVJt6pWxxtGWbaVUDDmjs=", 46 - "owner": "NixOS", 47 - "repo": "nixpkgs", 48 - "rev": "31d66ae40417bb13765b0ad75dd200400e98de84", 49 - "type": "github" 50 - }, 51 - "original": { 52 - "owner": "NixOS", 53 - "ref": "nixpkgs-unstable", 54 - "repo": "nixpkgs", 55 - "type": "github" 56 - } 57 - }, 58 - "root": { 59 - "inputs": { 60 - "fenix": "fenix", 61 - "flake-utils": "flake-utils", 62 - "nixpkgs": "nixpkgs" 63 - } 64 - }, 65 - "rust-analyzer-src": { 66 - "flake": false, 67 - "locked": { 68 - "lastModified": 1732633904, 69 - "narHash": "sha256-7VKcoLug9nbAN2txqVksWHHJplqK9Ou8dXjIZAIYSGc=", 70 - "owner": "rust-lang", 71 - "repo": "rust-analyzer", 72 - "rev": "8d5e91c94f80c257ce6dbdfba7bd63a5e8a03fa6", 73 - "type": "github" 74 - }, 75 - "original": { 76 - "owner": "rust-lang", 77 - "ref": "nightly", 78 - "repo": "rust-analyzer", 79 - "type": "github" 80 - } 81 - }, 82 - "systems": { 83 - "locked": { 84 - "lastModified": 1681028828, 85 - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 86 - "owner": "nix-systems", 87 - "repo": "default", 88 - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 89 - "type": "github" 90 - }, 91 - "original": { 92 - "owner": "nix-systems", 93 - "repo": "default", 94 - "type": "github" 95 - } 96 - } 97 - }, 98 - "root": "root", 99 - "version": 7 100 - }
-35
flake.nix
··· 1 - { 2 - description = "A basic flake with a shell"; 3 - inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; 4 - inputs.flake-utils.url = "github:numtide/flake-utils"; 5 - inputs.fenix = { 6 - url = "github:nix-community/fenix"; 7 - inputs.nixpkgs.follows = "nixpkgs"; 8 - }; 9 - 10 - outputs = { nixpkgs, flake-utils, fenix, ... }: 11 - flake-utils.lib.eachDefaultSystem (system: 12 - let 13 - pkgs = import nixpkgs { 14 - inherit system; 15 - overlays = [ fenix.overlays.default ]; 16 - }; 17 - in 18 - { 19 - devShells.default = pkgs.mkShell { 20 - packages = [ 21 - (pkgs.fenix.complete.withComponents [ 22 - "cargo" 23 - "clippy" 24 - "rust-src" 25 - "rustc" 26 - "rustfmt" 27 - "rust-analyzer" 28 - ]) 29 - pkgs.bacon 30 - pkgs.pkg-config 31 - pkgs.openssl 32 - ]; 33 - }; 34 - }); 35 - }