diff --git a/advent_of_code_2023/day7/input.txt b/advent_of_code_2023/day7/input.txt new file mode 100644 index 0000000..c762a16 --- /dev/null +++ b/advent_of_code_2023/day7/input.txt @@ -0,0 +1,1000 @@ +T6782 898 +26T7A 345 +56856 92 +88J88 379 +8QQJ8 792 +QQQT8 607 +98998 912 +888T7 491 +7A6Q9 220 +6QJ23 746 +T5297 133 +44874 357 +84854 864 +8JQQ2 383 +J2KT2 649 +84488 234 +JQ4QT 534 +JJAAA 855 +8J49Q 458 +5QK4A 474 +5535T 504 +T3785 237 +28J88 315 +4544A 680 +7T773 731 +KJKKK 190 +5Q5QK 249 +6664T 747 +QTQQT 164 +ATTAA 290 +95752 486 +J3JAA 324 +K9K9J 204 +99959 867 +K4KKK 980 +A937J 37 +654A9 700 +7553K 352 +8333K 361 +ATJT8 771 +26226 940 +TTJ7Q 834 +QQ33J 117 +62J57 890 +J3A4A 124 +T4JT4 677 +93528 31 +TJA2J 509 +Q222A 126 +52T67 177 +3J9TT 629 +33QQ3 471 +22232 9 +82279 283 +3A3AJ 583 +7343T 829 +93338 836 +T588Q 70 +88K85 593 +55353 926 +Q3749 295 +T6JAK 586 +9AA3J 183 +55565 342 +8K4Q8 910 +AA4A4 907 +78T2A 112 +4J66K 263 +TKJTT 386 +66Q6Q 131 +26266 187 +23AQ3 600 +95K3Q 279 +32522 684 +8Q8Q7 62 +KKAKK 579 +QJ885 899 +66J2K 396 +555J5 592 +88TJ6 767 +352K2 94 +J6488 634 +5A32J 943 +AAAKA 673 +J8AAA 667 +2K5JK 768 +Q4578 294 +4447K 227 +QQQQ7 808 +JJ333 176 +49586 515 +622T7 622 +94359 140 +8QJ2A 239 +Q69JT 939 +A75T9 425 +JKA93 887 +AA7AA 157 +TTTJ5 122 +J2J3J 118 +3J333 681 +3769A 429 +A2K92 123 +53Q8K 257 +A83K4 905 +2935K 543 +66466 421 +34394 963 +QQ433 520 +KTKKK 83 +66677 346 +Q83JQ 334 +6AT54 79 +K4949 442 +37374 627 +73777 571 +JQKKJ 648 +42242 226 +KK888 319 +5K6Q2 971 +AA3JA 51 +4AK87 78 +3J343 840 +K3333 25 +33484 401 +9J866 565 +Q399Q 116 +2K597 742 +66A53 793 +AQQAQ 779 +Q3QJJ 470 +75496 4 +8JJT3 775 +99JKJ 437 +22J9J 60 +39AAT 424 +3J43J 507 +33TJ9 414 +99395 209 +A984Q 821 +A88J8 757 +T3A68 432 +36666 646 +KKKAA 175 +K9TTK 392 +33KK5 308 +KK4K4 675 +64443 370 +TQJ9Q 645 +QT999 669 +J5T88 789 +89TJ4 245 +T436T 605 +6T464 36 +JQQ3Q 11 +68666 423 +KKJKT 785 +T4K3A 847 +6T6JT 915 +8Q756 163 +9AAA2 343 +9AJK8 556 +3JJ69 154 +7K7K3 316 +6737Q 641 +88J7J 975 +5J445 270 +KATJT 659 +6J866 717 +989T9 529 +2897K 321 +4A2T5 984 +7AA99 485 +JK222 397 +75468 282 +QT3J3 91 +3K777 532 +6Q566 460 +2KK75 339 +55258 766 +88558 46 +34J34 419 +T42A8 624 +6JA9K 950 +A8646 135 +66696 66 +37Q7Q 612 +KJAK6 753 +94999 306 +2JJJJ 765 +6JQ3A 459 +K8693 871 +477K7 26 +4T6T8 544 +44JK4 720 +5K5K9 372 +KQ66Q 590 +8A294 57 +JJJJJ 440 +88878 18 +J9649 389 +77677 698 +9K69J 145 +2QT2K 75 +77577 22 +AQ4KA 422 +97477 332 +33933 882 +63646 293 +53A3A 763 +4K93K 928 +KKK37 994 +TA259 173 +K896A 93 +6Q666 438 +J8477 674 +AJAQQ 531 +2JJ2J 726 +5KJT5 672 +A58A2 481 +JJAJT 754 +96444 179 +687A5 528 +TA48J 618 +7Q7Q7 537 +T4A44 23 +473Q6 988 +KQ467 64 +5T555 938 +67T33 444 +KAK99 591 +A6K78 160 +23Q7A 878 +TA5AT 292 +2T6Q5 559 +77979 222 +9AAJA 284 +TK47T 166 +694T2 679 +AAA23 838 +88KJK 170 +QJQ2Q 777 +84486 178 +535JQ 411 +J547T 595 +37773 602 +777JQ 188 +48989 825 +4944K 492 +J8959 375 +72Q5A 908 +Q2AAT 280 +Q3666 119 +48J24 238 +999JA 865 +KK9KK 831 +6Q3JT 909 +3A773 50 +38466 461 +37A25 300 +95555 307 +7Q228 557 +KQ66K 525 +8744K 727 +J9JQ9 475 +A5AKA 148 +A7KJT 309 +TT794 539 +53339 762 +Q9999 6 +A4AT4 993 +888AA 790 +6666A 480 +88Q63 274 +99J92 869 +J8988 884 +8K68J 839 +7QA72 498 +84697 581 +3QK3J 289 +59J8A 692 +Q5J5Q 761 +J777K 930 +T552K 251 +TAT26 715 +6J32T 380 +74K28 523 +22279 104 +8TKT2 393 +68J67 391 +55458 340 +5TK47 395 +822J8 893 +T9388 902 +8TQ3Q 252 +3T549 811 +88883 702 +55J2K 81 +4QTT4 138 +69669 272 +KTKTK 576 +T6668 822 +7J777 736 +9ATJT 892 +Q5QQQ 125 +66T9T 519 +4T244 589 +77747 174 +3J698 837 +39K28 665 +QA459 456 +22342 545 +J8478 489 +Q2962 468 +QAAAA 958 +K8T87 260 +J4KK7 706 +J5J95 695 +47445 724 +K268T 967 +33299 652 +KKKK2 664 +K9JKA 711 +85926 435 +J7K6J 511 +3667J 791 +229QA 633 +998K7 642 +8QQ77 774 +6347A 497 +46526 327 +QK327 750 +KAQ25 927 +27T34 134 +T633T 208 +KKQK7 810 +223J2 900 +5KKJ5 842 +99533 521 +A5Q85 553 +54455 570 +JA946 582 +69Q66 690 +99977 701 +282Q8 428 +4AA42 10 +75977 328 +99T99 948 +J5353 546 +QT95K 285 +KKK3K 896 +9696J 264 +T8275 436 +45J55 80 +69AAA 430 +27J4J 202 +6A888 404 +TQ5K8 819 +55858 113 +T828T 933 +T8888 12 +3KKKT 703 +657J6 291 +8699J 172 +9J99T 705 +A22A2 229 +32263 314 +8QQQQ 101 +2J222 354 +73373 107 +99398 946 +2AA2J 885 +T66J6 184 +3K8K8 903 +KJJKK 611 +22226 781 +9A2J9 191 +AK26J 964 +8KK2Q 317 +82898 883 +T9TTT 195 +584JT 743 +4AA45 61 +93J79 100 +3QJAK 241 +T74AQ 304 +4Q2QQ 548 +KKJ27 330 +A9TKK 39 +6J447 303 +592A6 449 +K9928 65 +9A94K 193 +8T646 431 +Q46K3 20 +K5777 833 +Q9756 30 +33838 638 +65686 298 +A9JAJ 599 +85555 784 +6TAA4 286 +3QQ89 446 +3JT37 463 +8AK5Q 230 +7JAAQ 580 +754TQ 74 +9AQQ4 729 +2933J 678 +62757 575 +29929 619 +A3AAA 216 +Q557Q 691 +A7Q8T 983 +3TJQT 668 +A3KJA 503 +7AA77 881 +88288 995 +7QJ3J 770 +5KKJK 265 +444J4 998 +82J87 89 +T3T3J 63 +2QQ76 510 +5QQ25 132 +KKKT5 441 +Q822Q 954 +84858 788 +37627 873 +22959 426 +K6KKJ 454 +4J844 359 +67JQ7 266 +TQ7T2 206 +5QT2J 854 +KK985 42 +3562T 877 +44343 999 +5J595 859 +37888 657 +J65AK 801 +77276 382 +22A22 207 +QQ4K3 253 +9K2K4 161 +888Q8 863 +75J77 518 +K2K2K 150 +2JT62 398 +J3993 719 +AA88A 813 +9499T 211 +A568Q 98 +6KQ6J 962 +QAKA8 367 +998A9 561 +J2357 196 +A797T 663 +6J9J6 505 +2T5T2 759 +K6464 381 +76677 373 +4K92J 33 +5A8JK 447 +8QQ88 660 +3298A 325 +37333 802 +JTQQT 7 +QQQ3A 820 +J5935 506 +K4334 2 +KA749 40 +94QQ9 415 +537KK 225 +25255 913 +835J9 601 +55TTT 647 +92J92 710 +66A6A 312 +A8TT8 914 +4KJKK 271 +T3242 835 +3K636 623 +93T5A 365 +J4739 816 +244A5 465 +A9TT5 560 +2JAA9 224 +TTT7T 356 +AQQAA 656 +QT5Q5 879 +7AA7J 632 +36344 127 +K5T89 243 +797A9 562 +66363 52 +68585 598 +KQ8A9 608 +999K2 21 +52253 151 +A5595 262 +KTTTT 366 +2922T 1000 +25328 815 +3T7T7 806 +Q2Q39 895 +3J432 786 +JA228 782 +AJJ99 621 +8AAQQ 809 +97QAT 143 +456J8 15 +AAJ2A 165 +J55J5 281 +K6945 322 +22A2J 799 +77AAA 666 +Q6J66 168 +7QTJ5 363 +Q38T2 709 +AKT86 936 +QQQQK 585 +JA4J4 130 +AJA73 796 +88QQQ 828 +QQ2Q2 390 +KK77K 301 +A5TQ9 805 +96677 477 +J7495 628 +24222 807 +8QQ83 992 +222K6 861 +949J5 473 +59873 555 +9K584 564 +AAQ7Q 989 +62J2K 445 +4732A 420 +2JT9K 136 +TT989 277 +JJ999 549 +Q9T6K 513 +36J6A 97 +A3J32 986 +8A7TJ 682 +T2784 59 +KJAAK 110 +8KJ88 919 +AKK77 256 +2J876 713 +K3TQ7 115 +8Q6AT 973 +45666 19 +33335 400 +J43K4 851 +A22A9 974 +8Q867 574 +993KA 185 +9K8Q4 464 +5AAAA 949 +27JJ5 686 +3TTT3 606 +T4444 533 +K8838 830 +75682 960 +J89JT 129 +45A5A 886 +KKK6T 416 +AJA6A 626 +AAJKA 182 +AA2A8 73 +7JK88 640 +JJ222 462 +4A455 49 +7JAKQ 812 +AAAA9 387 +777T7 769 +37K2A 348 +QTJ77 355 +KQQKA 500 +QQQ9Q 350 +65666 111 +T7TT7 407 +333TJ 214 +78876 8 +8Q478 409 +8K3AT 934 +6A583 814 +JTJAA 826 +3A373 278 +J4J44 171 +9AAA3 374 +32J32 199 +76TTA 858 +27222 305 +862K6 369 +QJKAA 568 +JK94J 524 +Q6QQ6 852 +2TQ22 987 +J6AJ7 385 +73A6T 106 +QAKQT 925 +2424T 737 +T7ATA 620 +T8A47 613 +J2858 636 +K7373 484 +7QK65 716 +K8QKK 981 +52454 443 +AAAAJ 738 +99J99 69 +6AQJ8 439 +774J9 798 +66JJ6 210 +TTQTQ 35 +7QJ97 694 +QJQQJ 918 +9K999 573 +Q7TT7 68 +46887 704 +T6379 661 +34888 326 +9A999 916 +6466J 849 +666J6 479 +QKKKK 247 +46K48 336 +J6729 467 +A22A6 269 +6KQKK 584 +68J86 961 +8KK87 670 +52656 542 +Q4AJ3 394 +79KJK 77 +Q8965 139 +44474 240 +QJQQQ 434 +AQ449 921 +57A9J 996 +J5835 817 +QQKK3 818 +3943J 13 +4T7A5 956 +44464 517 +5A55J 48 +2J254 722 +9JAT5 487 +Q4757 856 +5Q55A 749 +ATKJ5 82 +J8588 142 +646TQ 783 +38J39 922 +26J77 823 +2TT4T 162 +6666K 137 +QQQ83 758 +32KJT 733 +4J9K8 353 +KQJT7 501 +6T6TK 982 +Q42K9 147 +8734Q 538 +KKA67 794 +JQKKA 804 +QQ555 596 +4JJ45 32 +28383 904 +T5Q45 38 +5T5TJ 221 +Q3K9A 29 +99649 1 +94247 146 +4Q444 362 +5637T 734 +577TT 735 +TT244 364 +56QQQ 149 +K2AQ3 144 +9J959 493 +66Q44 405 +888K8 654 +6J624 635 +9QJKA 569 +K8K5K 120 +24443 344 +6666T 197 +6T747 740 +54523 935 +A96Q2 302 +AJJJA 697 +2T476 90 +55444 403 +QJ22Q 85 +KK9KJ 254 +4938T 156 +5JT8J 741 +Q55K3 527 +627JK 894 +T6245 917 +44864 410 +77QJ3 587 +823A4 457 +32323 259 +9T94T 609 +33J8K 158 +7AK4K 201 +44774 957 +4Q45T 180 +JA82K 978 +333J5 872 +J8948 267 +99933 433 +4T7JJ 563 +85534 862 +K7K8K 24 +JTTKK 824 +TQ8TT 803 +62677 797 +QQATT 965 +QQ668 870 +88724 551 +T3T43 17 +99749 275 +7T6J2 977 +67J77 203 +6T789 167 +22J28 639 +26744 850 +QQQ6Q 47 +QA72T 554 +3AT9T 897 +QJTQ2 261 +696JQ 631 +9KKQJ 490 +469T8 72 +QAT42 951 +AJ2AK 413 +8AQ2T 297 +AJ482 255 +QQQKK 931 +AJA7A 874 +34532 368 +74A44 945 +88989 418 +A2AAA 219 +39999 857 +J7774 687 +Q9925 630 +9JQ9Q 578 +8AA38 689 +8QA2A 427 +Q6Q99 800 +TTTTJ 399 +AA822 614 +ATT47 676 +K2AAA 514 +7J696 338 +J3J87 88 +55547 728 +5A338 86 +838T6 250 +87QAK 970 +795K7 723 +7QTJ6 152 +5A9KQ 494 +KA4TK 650 +Q2222 604 +K5953 452 +K2282 552 +4K586 760 +K4444 868 +724AA 516 +52224 55 +35Q33 58 +46644 331 +T8325 888 +9K229 388 +779TT 920 +97279 95 +JJ374 450 +8JJJJ 610 +84497 217 +8QK4J 233 +KQ6T6 360 +6637Q 53 +KK7QJ 683 +4828A 215 +5TT55 990 +J3768 536 +ATKTK 846 +5T9K4 780 +2T8AT 502 +7T776 712 +KQ93Q 114 +2474J 483 +QQQ46 408 +J5T82 718 +834A9 688 +JT977 615 +69663 296 +4A638 880 +QQQA7 27 +2K22K 377 +29379 972 +244J4 242 +K8KKK 56 +KTQKJ 891 +87K5J 730 +887AA 699 +9QJQA 725 +6J655 929 +8692A 844 +2QQQQ 194 +TJ79Q 969 +JATA9 128 +8448J 103 +9399J 953 +98J77 371 +TT3J5 192 +J3655 924 +6993K 616 +J8788 979 +K9KK3 756 +57AQ4 671 +88KQ7 955 +6AAA6 843 +9494J 105 +6A2QQ 942 +T222T 87 +J9JA5 244 +AKA4A 198 +Q4635 558 +2332T 889 +AKQQ5 827 +97QQQ 337 +JT575 603 +36336 478 +4A43T 653 +5QQ38 349 +97777 776 +TQ6TT 541 +57775 258 +68KKK 469 +92224 121 +4853Q 476 +2Q695 273 +2J626 732 +6A328 246 +5QT27 959 +KJJ77 658 +4K6KK 310 +JAK66 28 +QQK4K 16 +K4923 752 +57555 482 +46T5T 550 +333Q3 496 +2Q93J 755 +778J3 751 +K77KJ 276 +76A96 947 +QTT7T 335 +4T9K6 997 +26926 512 +66464 522 +59997 787 +K462A 508 +K4K7K 333 +Q3Q3Q 707 +A3TKK 772 +7T7J7 44 +TAK54 455 +44JKQ 287 +TQK49 748 +37335 577 +Q743J 200 +Q4A45 236 +KJ62K 288 +544K5 76 +TTTJJ 693 +89999 96 +K8JKK 351 +5JAT8 778 +TAAJT 67 +39339 911 +997K6 329 +5JK88 876 +338QQ 530 +88889 937 +884T8 526 +382QA 320 +86Q35 764 +KQ38A 412 +AA7A8 358 +22Q2K 637 +A22JK 248 +59855 906 +33AJ3 347 +42T2Q 108 +AQ2T6 99 +8KATJ 651 +9JQTT 832 +84847 451 +52K8K 453 +K6553 54 +87778 499 +TAAJA 223 +38298 643 +5557Q 841 +9K6K9 448 +77J73 617 +555K5 976 +A38T4 968 +3333A 472 +5KJ74 866 +7JJ8K 708 +J55Q5 714 +58KA4 795 +AAAA4 488 +Q8QQ7 45 +58A55 311 +27T7T 3 +2J4KA 43 +TT3T9 159 +475K6 109 +48844 323 +4T2T2 186 +Q7A7J 218 +JTJA6 744 +J96J4 721 +8TT88 41 +Q5T96 417 +QTA6T 213 +68A33 169 +J3TT8 34 +44JK8 14 +29983 540 +3666J 845 +436J2 685 +88A88 597 +889J9 313 +77754 848 +2TA99 406 +5KK5K 535 +3KJ75 547 +67666 662 +9T634 231 +QTQQQ 299 +J993T 745 +87Q98 155 +AAAKQ 376 +36Q43 696 +67K67 952 +25Q47 739 +44424 228 +K22JQ 941 +5434Q 232 +8AA6Q 5 +58J55 625 +37535 153 +66868 572 +87788 384 +J5993 860 +K42K4 402 +59Q7T 944 +J2475 495 +KKKK7 773 +9K5Q2 341 +9AQAQ 594 +T5974 181 +42442 901 +T6TTT 932 +25895 268 +44484 212 +88J63 588 +22777 102 +Q7K77 991 +QK9K9 235 +J4544 205 +7K523 985 +T4246 566 +9TQ3A 466 +884JT 644 +59995 84 +7772J 853 +JJ882 318 +25522 923 +TTT9J 189 +23333 378 +58J85 141 +7K45K 567 +JJ777 71 +74A47 875 +2J848 655 +93K65 966 \ No newline at end of file diff --git a/advent_of_code_2023/day7/main1.rs b/advent_of_code_2023/day7/main1.rs new file mode 100644 index 0000000..9be70e3 --- /dev/null +++ b/advent_of_code_2023/day7/main1.rs @@ -0,0 +1,124 @@ +use std::{fs::read_to_string, collections::{HashMap, btree_map::Values}}; + +#[derive(Debug, Copy, Clone)] +#[derive(PartialEq, PartialOrd, Eq, Ord)] +enum Rank { + HighCard, + OnePair, + TwoPair, + ThreeOfAKind, + FullHouse, + FourOfAKind, + FiveOfAKind, +} + +impl Rank { + + fn signature(&self) -> Vec { + match self { + Rank::HighCard => vec![1, 1, 1, 1, 1], + Rank::OnePair => vec![2, 1, 1, 1], + Rank::TwoPair => vec![2, 2, 1], + Rank::ThreeOfAKind => vec![3, 1, 1], + Rank::FullHouse => vec![3, 2], + Rank::FourOfAKind => vec![4, 1], + Rank::FiveOfAKind => vec![5] + } + } + + fn matches(&self, hand: &Vec) -> bool { + let signature = self.signature(); + if hand.len() != signature.len() { + return false; + } + signature.iter().zip(hand.iter()).filter(|&(lhs, rhs)| lhs == rhs).count() == signature.len() + } + + fn mapping() -> HashMap, Rank> { + HashMap::from([ + (Rank::HighCard{}.signature(), Rank::HighCard), + (Rank::OnePair{}.signature(), Rank::OnePair), + (Rank::TwoPair{}.signature(), Rank::TwoPair), + (Rank::ThreeOfAKind{}.signature(), Rank::ThreeOfAKind), + (Rank::FullHouse{}.signature(), Rank::FullHouse), + (Rank::FourOfAKind{}.signature(), Rank::FourOfAKind), + (Rank::FiveOfAKind{}.signature(), Rank::FiveOfAKind), + ]) + } + + fn card_values() -> HashMap { + HashMap::from([ + (b'2', 0), + (b'3', 1), + (b'4', 2), + (b'5', 3), + (b'6', 4), + (b'7', 5), + (b'8', 6), + (b'9', 7), + (b'T', 8), + (b'J', 9), + (b'Q', 10), + (b'K', 11), + (b'A', 12), + ]) + } + + fn parse(line: &str, mapping: &HashMap, Rank>, values: &HashMap) -> (Rank, u64) { + let mut counts = HashMap::::new(); + let mut tiebreaker: u64 = 0; + + for idx in 0..line.len() { + *counts.entry(line.as_bytes()[idx]).or_insert(0) += 1; + tiebreaker = tiebreaker * 100 + values[&line.as_bytes()[idx]] as u64; + } + + let mut signature = counts.values().map(|a| *a).collect::>(); + signature.sort_by(|a, b| b.cmp(a)); + + (mapping[&signature], tiebreaker) + } + +} + +struct Hand { + cards: String, + score: u64, + rank: Rank, + tiebreaker: u64, +} + +impl Hand { + + fn parse(line: &str, mapping: &HashMap, Rank>, values: &HashMap) -> Hand { + let (cards, score) = line.split_once(' ').unwrap(); + let (rank, tiebreaker) = Rank::parse(cards, mapping, values); + Hand{cards: String::from(cards), score: score.parse::().unwrap(), rank, tiebreaker} + } + +} + +fn main() { + let mapping = Rank::mapping(); + let card_values = Rank::card_values(); + + let mut hands = read_to_string("input.txt").unwrap().lines().map(|line| { + Hand::parse(line, &mapping, &card_values) + }).collect::>(); + + hands.sort_by(|lhs, rhs| { + if lhs.rank == rhs.rank { + return lhs.tiebreaker.cmp(&rhs.tiebreaker); + } + lhs.rank.cmp(&rhs.rank) + }); + + let mut score_base = 1; + let mut points = 0; + for hand in &hands { + points += score_base * hand.score; + score_base += 1; + } + + println!("Total points: {}", points); +} \ No newline at end of file diff --git a/advent_of_code_2023/day7/main2.rs b/advent_of_code_2023/day7/main2.rs new file mode 100644 index 0000000..2f6d975 --- /dev/null +++ b/advent_of_code_2023/day7/main2.rs @@ -0,0 +1,135 @@ +use std::{fs::read_to_string, collections::{HashMap, btree_map::Values}}; + +#[derive(Debug, Copy, Clone)] +#[derive(PartialEq, PartialOrd, Eq, Ord)] +enum Rank { + HighCard, + OnePair, + TwoPair, + ThreeOfAKind, + FullHouse, + FourOfAKind, + FiveOfAKind, +} + +impl Rank { + + fn signature(&self) -> Vec { + match self { + Rank::HighCard => vec![1, 1, 1, 1, 1], + Rank::OnePair => vec![2, 1, 1, 1], + Rank::TwoPair => vec![2, 2, 1], + Rank::ThreeOfAKind => vec![3, 1, 1], + Rank::FullHouse => vec![3, 2], + Rank::FourOfAKind => vec![4, 1], + Rank::FiveOfAKind => vec![5] + } + } + + fn matches(&self, hand: &Vec) -> bool { + let signature = self.signature(); + if hand.len() != signature.len() { + return false; + } + signature.iter().zip(hand.iter()).filter(|&(lhs, rhs)| lhs == rhs).count() == signature.len() + } + + fn mapping() -> HashMap, Rank> { + HashMap::from([ + (Rank::HighCard{}.signature(), Rank::HighCard), + (Rank::OnePair{}.signature(), Rank::OnePair), + (Rank::TwoPair{}.signature(), Rank::TwoPair), + (Rank::ThreeOfAKind{}.signature(), Rank::ThreeOfAKind), + (Rank::FullHouse{}.signature(), Rank::FullHouse), + (Rank::FourOfAKind{}.signature(), Rank::FourOfAKind), + (Rank::FiveOfAKind{}.signature(), Rank::FiveOfAKind), + ]) + } + + fn card_values() -> HashMap { + HashMap::from([ + (b'J', 0), + (b'2', 1), + (b'3', 2), + (b'4', 3), + (b'5', 4), + (b'6', 5), + (b'7', 6), + (b'8', 7), + (b'9', 8), + (b'T', 9), + (b'Q', 10), + (b'K', 11), + (b'A', 12), + ]) + } + + fn parse(line: &str, mapping: &HashMap, Rank>, values: &HashMap) -> (Rank, u64) { + if line == "JJJJJ" { + return (Rank::FiveOfAKind, 0); + } + + let mut counts = HashMap::::new(); + let mut tiebreaker: u64 = 0; + let mut jokers = 0; + + for idx in 0..line.len() { + if line.as_bytes()[idx] == b'J' { + jokers += 1; + } else { + *counts.entry(line.as_bytes()[idx]).or_insert(0) += 1; + } + + tiebreaker = tiebreaker * 100 + values[&line.as_bytes()[idx]] as u64; + } + + let mut signature = counts.values().map(|a| *a).collect::>(); + signature.sort_by(|a, b| b.cmp(a)); + signature[0] += jokers; + + (mapping[&signature], tiebreaker) + } + +} + +struct Hand { + cards: String, + score: u64, + rank: Rank, + tiebreaker: u64, +} + +impl Hand { + + fn parse(line: &str, mapping: &HashMap, Rank>, values: &HashMap) -> Hand { + let (cards, score) = line.split_once(' ').unwrap(); + let (rank, tiebreaker) = Rank::parse(cards, mapping, values); + Hand{cards: String::from(cards), score: score.parse::().unwrap(), rank, tiebreaker} + } + +} + +fn main() { + let mapping = Rank::mapping(); + let card_values = Rank::card_values(); + + let mut hands = read_to_string("input.txt").unwrap().lines().map(|line| { + Hand::parse(line, &mapping, &card_values) + }).collect::>(); + + hands.sort_by(|lhs, rhs| { + if lhs.rank == rhs.rank { + return lhs.tiebreaker.cmp(&rhs.tiebreaker); + } + lhs.rank.cmp(&rhs.rank) + }); + + let mut score_base = 1; + let mut points = 0; + for hand in &hands { + points += score_base * hand.score; + score_base += 1; + } + + println!("Total points: {}", points); +} \ No newline at end of file diff --git a/advent_of_code_2023/day8/input.txt b/advent_of_code_2023/day8/input.txt new file mode 100644 index 0000000..36170e8 --- /dev/null +++ b/advent_of_code_2023/day8/input.txt @@ -0,0 +1,728 @@ +LRRLRRRLRRRLLRRLRRLRLRLRRLLRRLRRLRRRLLLRRRLRRRLRRRLLRRRLRRLLRRLRRLRLRRRLRRLRLRRLRRRLLRRLLRLRRRLLRRLRRLLLRLRRRLRLRLRLLRRRLRLLRRRLRLRRRLRRRLLRRLRRRLLRRLRLLRLRRLLLRRLRRLLLRLLRLRRRLRLRLRRRLRRLLRRRLRLRLRRLRRRLRLRRLRRLRRRLRRRLRRRLRRRLRRLLRRLRLLRRLLRRRLRLLRLRLRRLRRLRLRLRRRLRLRLRRLRLRRLRRRR + +FPF = (PTN, MPT) +DGM = (KXM, PRM) +FKB = (JLC, MBX) +XCJ = (DCJ, TSH) +JVH = (VCH, SMV) +BXL = (HLB, NVF) +GVD = (FSQ, MFD) +CDJ = (SMM, HHS) +BGM = (FHB, LKH) +FBP = (HHS, SMM) +LTK = (TCV, GQX) +LDM = (MRM, JKJ) +RDK = (KBL, GHP) +BJB = (XBN, BXG) +KST = (BGX, VFS) +VKM = (MFR, CJP) +CSG = (GGJ, JHH) +JFS = (QCG, XFR) +MDV = (FPQ, NRX) +QHF = (PJP, QHX) +DHM = (LJC, PDS) +MMV = (CHS, FXX) +CQP = (LFN, GSD) +RDT = (NVG, NVG) +XFN = (HFM, LTK) +MFD = (RKJ, XGN) +DTD = (JBV, JBV) +KJG = (PCC, PPR) +GLH = (JRN, BLK) +KBV = (MCQ, MCS) +LQF = (KDR, GFC) +GGB = (JGL, RRM) +BQX = (QKQ, NSG) +SVS = (SQL, FXL) +GMC = (BHG, GPC) +KPZ = (HLV, RVH) +RQB = (TDV, XPN) +GVR = (SXD, QRB) +MNX = (DLT, CMJ) +QDM = (TKN, VDH) +CCB = (KPR, QCK) +BVF = (QJX, FKK) +TJB = (HKV, BCP) +BHC = (SSN, HHH) +NTN = (RPT, PVF) +NDP = (BJQ, MGH) +PJP = (NTN, FSR) +BLL = (MTQ, SNQ) +RNP = (RTD, PGM) +PVF = (BMP, LPM) +QFL = (NNS, GLR) +VRG = (GGV, DMG) +XRX = (TTR, LXS) +MBH = (RHX, GKF) +CXD = (LFN, GSD) +FFK = (LDG, VHS) +NHM = (BLM, XQD) +TNB = (KSS, FSB) +VLX = (KCF, VXL) +DDF = (TNK, FBS) +GQR = (BGM, MGR) +BPQ = (FHD, MJT) +KPR = (SDL, NMQ) +CNL = (QFP, XPV) +HVA = (BRQ, XPL) +PHF = (LHF, HVR) +TNZ = (XCM, BFL) +NDJ = (GCQ, RTL) +HCT = (PQT, VVB) +JNH = (GVV, JMC) +CNV = (SDP, NQR) +GGV = (RHT, SLG) +PRX = (FSD, KST) +BLM = (KKQ, CSG) +JRN = (GGK, GBF) +DJK = (GQJ, JKB) +RVH = (FXJ, JVN) +RXF = (CHG, GDT) +MBX = (KJM, XFN) +HLV = (JVN, FXJ) +XDG = (HJM, KCT) +LPM = (RCG, RHG) +GLP = (XDM, XNC) +HQP = (JXQ, XPT) +CXF = (SCV, PHF) +QJT = (FJN, GHV) +MPL = (HSQ, FKN) +SDP = (LCQ, GRV) +CDQ = (JLV, LLD) +HHA = (BFL, XCM) +GPS = (VLX, CPL) +BXZ = (KSN, VKP) +PGM = (LJV, CDQ) +PKG = (VQF, FXC) +XPL = (LBN, DMV) +BJJ = (TVV, MNX) +HLB = (SNN, HNH) +CDV = (TNB, FSN) +FXC = (CLF, HSC) +JFM = (LSR, CNL) +CMV = (DHQ, DJR) +LDN = (BCQ, JMS) +XNC = (JLS, KXS) +SNN = (NGM, MFJ) +CND = (RDL, GJJ) +SKT = (FCM, MRC) +QRB = (BCG, HRR) +XNK = (LJC, PDS) +DGK = (KBF, SRB) +LNL = (FSD, KST) +PCM = (PDL, JFS) +BSV = (LSR, CNL) +SMX = (TKL, QPF) +XMS = (MDB, PKP) +XPT = (LDM, PKV) +RLB = (XFT, PKM) +VVV = (NRX, FPQ) +MGB = (LNN, NKR) +SFJ = (LFT, QDM) +MFX = (GLP, RPN) +DLX = (SQQ, NHM) +XQC = (HQJ, NPC) +GHF = (VNG, TGQ) +LRX = (GDT, CHG) +SHV = (SRM, DVJ) +TQS = (PRD, HGV) +SQK = (QNB, PSJ) +CHS = (MXK, GCR) +VDH = (FMX, XMR) +DGN = (LGT, PNQ) +RMM = (CFK, RQD) +RQK = (FSN, TNB) +SLH = (BDS, BBP) +HVR = (NTS, NQG) +PSJ = (JFK, XXM) +GBD = (VMR, KJG) +FRH = (MNX, TVV) +THH = (GHF, MNF) +XTP = (VPC, BQQ) +VMR = (PCC, PPR) +PPQ = (GJJ, RDL) +VHK = (TXT, DDN) +JCG = (CCD, BXL) +LCQ = (MPF, NDP) +KCR = (PFH, DJK) +LHL = (LGL, KCR) +JMC = (RBG, CGH) +JPM = (XMS, CVR) +CLF = (HDT, DHR) +FSQ = (XGN, RKJ) +DVJ = (VHD, XNM) +KCT = (SKT, QLK) +XFD = (HXR, JVH) +BVA = (GPT, RSD) +MGR = (FHB, LKH) +PXV = (MJJ, VBK) +FNG = (TQS, HHM) +GFD = (XRG, JCS) +SST = (PHP, JGC) +KJV = (DMG, GGV) +PQM = (TTX, RMM) +XRT = (KBL, GHP) +JLV = (NKV, BLL) +FKS = (CBR, RLJ) +HMD = (JNH, GXG) +FRL = (KQX, DDB) +TRP = (LXT, HMC) +TNK = (FRN, FRN) +KDR = (PRX, LNL) +XTS = (NDJ, HFB) +HVM = (FMG, FHN) +CHH = (TMD, MNM) +HHM = (PRD, HGV) +PJC = (FCC, VJD) +TSH = (RPR, CVJ) +GGJ = (NFK, NXD) +DMG = (RHT, SLG) +QPT = (QFL, PFN) +DDN = (RHP, NSS) +XHJ = (BPQ, CSM) +NNM = (KHG, SRF) +LFL = (TMN, JCG) +NKV = (SNQ, MTQ) +TMH = (LGT, PNQ) +CCD = (HLB, NVF) +GSD = (MRB, TFS) +RHG = (VXH, MXS) +LFT = (TKN, VDH) +BJV = (DST, PTK) +CGD = (PKG, ZZZ) +VNG = (BJV, HDX) +HJS = (GPC, BHG) +FRN = (VKP, KSN) +MRC = (JKK, CMV) +BQQ = (NBF, PJC) +KSN = (FNJ, GVR) +QNB = (XXM, JFK) +RSC = (JCB, JCB) +GCQ = (XGH, FKB) +SHS = (JBV, DDF) +LLR = (XHJ, PGB) +RSA = (RVH, HLV) +DMX = (GSH, SST) +HRD = (HLK, DJG) +LHF = (NTS, NQG) +JMS = (FKS, HPB) +SRB = (SRG, GSF) +LHN = (HLK, DJG) +DTM = (RXM, VHK) +PNP = (SNC, LPF) +MPF = (BJQ, BJQ) +SCV = (LHF, HVR) +BTV = (GLH, PNN) +NJG = (RXK, NXB) +NGM = (THG, TXQ) +FXL = (XRX, MBV) +NHJ = (DSX, NNM) +RBG = (DGK, LFQ) +HGV = (HTS, RNP) +LDF = (KRB, NXC) +PMR = (GNH, CHQ) +DVM = (MNM, TMD) +FBS = (FRN, BXZ) +BMM = (XSK, DDK) +GGK = (MXH, JNG) +NXB = (LHN, HRD) +PNN = (JRN, BLK) +PSV = (LLR, KXX) +KGK = (TJP, QMM) +CVG = (VLX, CPL) +QNF = (XPB, PCM) +HTS = (PGM, RTD) +FJN = (DTD, SHS) +JXB = (CLX, KPZ) +DLT = (JGH, SFD) +SFV = (HJM, KCT) +GSF = (DLX, CHL) +TKN = (XMR, FMX) +LJB = (QJT, FVJ) +QFP = (NXL, DGP) +PKV = (JKJ, MRM) +RHX = (RDK, XRT) +KDP = (FKN, HSQ) +RLJ = (BGF, JRP) +VQR = (FDK, RLB) +XNX = (HGQ, HGQ) +DSX = (KHG, SRF) +PDS = (VQK, KNJ) +GKX = (TKL, QPF) +CHQ = (XSM, HMD) +KXX = (XHJ, PGB) +MDB = (VVV, MDV) +BCG = (XJX, SQK) +KJM = (LTK, HFM) +HRR = (SQK, XJX) +GXD = (JFM, BSV) +SCR = (JDN, QRS) +GMK = (FPF, CTM) +KXM = (PDJ, MFX) +DKQ = (GCL, QFN) +DJR = (FGV, PSV) +GQX = (DFL, LQF) +PTK = (TRS, TMC) +BLK = (GGK, GBF) +RSD = (XDG, SFV) +SVT = (PXV, XCL) +XFT = (BJJ, FRH) +LSR = (XPV, QFP) +BCP = (NMB, NXM) +KGP = (RDT, FNB) +DHF = (PNN, GLH) +JHH = (NXD, NFK) +DGP = (GKX, SMX) +KSK = (DKP, RXT) +KRM = (PQM, DCK) +XJX = (QNB, PSJ) +JKK = (DJR, DHQ) +CFK = (DGN, TMH) +PSS = (HNP, STL) +MFR = (PMR, RJS) +JNG = (TQQ, HXB) +MDG = (VCC, HTF) +VCC = (DGM, MKH) +TQQ = (FCQ, SCR) +DMK = (GXD, GFF) +GHV = (DTD, SHS) +HLP = (NNH, TQN) +BGK = (QHJ, BQX) +VKN = (DPT, FNG) +STL = (DPP, NMX) +QFS = (MGR, BGM) +HSC = (DHR, HDT) +FPQ = (NSL, RQN) +QMM = (CDJ, FBP) +PDL = (XFR, QCG) +PDJ = (GLP, RPN) +FSD = (VFS, BGX) +MPT = (DKQ, RSQ) +MHQ = (NTL, TKG) +MPC = (NQJ, NQJ) +DST = (TRS, TMC) +KHD = (CLX, CLX) +BNT = (MFR, CJP) +VJD = (GPS, CVG) +DLG = (JCS, XRG) +MCD = (CHH, DVM) +VSG = (XPR, TVQ) +MSX = (VQR, KXQ) +VMV = (VQR, KXQ) +QCG = (NHJ, NMH) +RPN = (XNC, XDM) +NVG = (RSC, RSC) +GDT = (LDC, QPT) +GMX = (RJX, VRM) +RDL = (MBH, NTF) +XXM = (JSC, MHQ) +SRF = (BGK, NQF) +XNM = (SGJ, XCJ) +RPT = (LPM, BMP) +GPT = (SFV, XDG) +JCB = (BFL, XCM) +QKQ = (FRL, GGT) +MTQ = (LQB, XPG) +CHG = (QPT, LDC) +FMS = (FJX, GMX) +MBV = (LXS, TTR) +JFP = (XPN, TDV) +JFJ = (HNP, STL) +GKF = (RDK, XRT) +LDK = (QCT, TVX) +CLX = (RVH, HLV) +TXQ = (DFR, KQF) +XGH = (MBX, JLC) +KFB = (SHV, MRV) +RSV = (GSX, TPK) +NKR = (KFB, TFN) +FCQ = (JDN, QRS) +RQN = (TLC, GFQ) +FSN = (FSB, KSS) +QDQ = (VBQ, GSM) +FFC = (DKC, DMK) +KBC = (BHQ, TRP) +PHB = (VCC, HTF) +GBH = (FFC, CGL) +TTR = (KBV, LJP) +MRB = (DHG, QNF) +SDL = (PSS, JFJ) +TMC = (BXK, RSV) +LXT = (GGB, MDT) +LQB = (BNT, VKM) +RXT = (GBH, SSD) +SSN = (CRH, XTP) +MRV = (SRM, DVJ) +FJX = (RJX, VRM) +FQB = (MNF, GHF) +DKC = (GFF, GXD) +MGQ = (LDK, RVG) +DLK = (FPF, CTM) +FHN = (HKK, BVF) +BFL = (LJG, XQM) +PKP = (VVV, MDV) +QHJ = (QKQ, NSG) +BCQ = (HPB, FKS) +LDG = (VMV, MSX) +BFH = (RXT, DKP) +XPB = (JFS, PDL) +HDX = (PTK, DST) +NQF = (BQX, QHJ) +DPT = (TQS, HHM) +DCK = (TTX, RMM) +NPC = (KGP, QJG) +BCD = (NXB, RXK) +HDT = (HPM, FTQ) +FHD = (XNK, DHM) +NNS = (XFD, MBT) +GSX = (VRG, KJV) +BXG = (BFH, KSK) +VVB = (QDQ, JXC) +NVF = (HNH, SNN) +KRB = (JBH, JNJ) +FXX = (GCR, MXK) +JXQ = (LDM, PKV) +MTT = (DLG, GFD) +HXR = (VCH, SMV) +MNM = (SPQ, PNP) +QJG = (RDT, FNB) +JLS = (KRM, LBQ) +CJK = (TJB, VDD) +TXT = (RHP, NSS) +FXT = (JMS, BCQ) +NSS = (LRX, RXF) +VJQ = (RSC, MXR) +XXH = (LNN, NKR) +NSL = (GFQ, TLC) +XSM = (GXG, JNH) +HFM = (TCV, GQX) +JGC = (NDL, JPM) +HGQ = (GPT, RSD) +CHL = (SQQ, NHM) +VBK = (GKG, XTS) +MBT = (HXR, JVH) +FNJ = (SXD, QRB) +JBH = (HCT, SGG) +JRP = (FXP, VKN) +VRM = (MPC, GQP) +BBP = (JCL, LDF) +GXH = (RXM, VHK) +MXR = (JCB, TNZ) +BSD = (CCP, GBD) +QFN = (MPL, KDP) +LNN = (TFN, KFB) +SQQ = (BLM, XQD) +MJT = (XNK, DHM) +GSH = (JGC, PHP) +PQT = (JXC, QDQ) +RVG = (QCT, TVX) +DHG = (PCM, XPB) +LKJ = (HQP, HHG) +XHB = (SJL, DMX) +GKG = (HFB, NDJ) +PGB = (BPQ, CSM) +VBQ = (CVS, QHF) +JXC = (GSM, VBQ) +QCK = (SDL, NMQ) +PFN = (NNS, GLR) +RXK = (LHN, HRD) +BVX = (GMK, DLK) +LPF = (MMV, LQK) +SMM = (SFJ, KGR) +SJL = (SST, GSH) +HMC = (MDT, GGB) +VQF = (CLF, HSC) +NRX = (RQN, NSL) +CBR = (JRP, BGF) +JLC = (KJM, XFN) +TMD = (SPQ, PNP) +HXB = (FCQ, SCR) +SBQ = (SQV, NCH) +LGT = (MGB, XXH) +HSF = (TJB, VDD) +JBS = (MGQ, NVQ) +DKP = (SSD, GBH) +HSQ = (SVT, LKV) +GPC = (HVM, TGC) +TVV = (DLT, CMJ) +BHG = (TGC, HVM) +CGR = (LDN, FXT) +PFH = (GQJ, GQJ) +FCM = (JKK, CMV) +RRM = (KJP, BMM) +FCG = (MDG, PHB) +MCS = (HLP, DNV) +BXK = (GSX, TPK) +VQK = (HJS, GMC) +LDH = (XPR, TVQ) +DXN = (GMK, DLK) +GFQ = (RQB, JFP) +PKK = (BBP, BDS) +BBR = (FXT, LDN) +BJQ = (KHD, KHD) +RCG = (MXS, VXH) +HPM = (KJF, CXF) +QJX = (CDV, RQK) +NMB = (RKC, GVD) +JCL = (KRB, NXC) +GXM = (BBR, CGR) +NMX = (XNX, SQP) +NXM = (RKC, GVD) +QMT = (MDG, PHB) +DMV = (LTG, SBQ) +FTQ = (KJF, CXF) +TCV = (DFL, LQF) +MFJ = (TXQ, THG) +VKP = (FNJ, GVR) +XQD = (CSG, KKQ) +SRM = (VHD, XNM) +SLG = (LRJ, JFL) +JCS = (CQP, CXD) +LJP = (MCQ, MCS) +NBF = (FCC, VJD) +DFL = (KDR, GFC) +NFM = (XBN, BXG) +CMR = (PKG, PKG) +JVN = (XHB, MCC) +RKC = (FSQ, MFD) +JKJ = (BSQ, LJB) +BGX = (MMD, FMS) +THG = (KQF, DFR) +RKJ = (CVN, FFK) +LQK = (CHS, FXX) +CPL = (VXL, KCF) +JSC = (TKG, NTL) +DNV = (TQN, NNH) +LFF = (HQJ, NPC) +TVQ = (SSF, GXM) +NQR = (LCQ, GRV) +TMN = (BXL, CCD) +XDM = (KXS, JLS) +CJP = (RJS, PMR) +HKV = (NMB, NXM) +SPQ = (SNC, LPF) +HQJ = (KGP, QJG) +GXG = (JMC, GVV) +KSS = (CND, PPQ) +LJG = (DTM, GXH) +BHQ = (HMC, LXT) +FGV = (KXX, LLR) +KCF = (LKJ, NTJ) +PRM = (MFX, PDJ) +QKD = (FXL, SQL) +DDB = (CSB, MCD) +VHH = (CMR, CGD) +LLM = (BVX, DXN) +PTN = (RSQ, DKQ) +GSM = (CVS, QHF) +CVN = (VHS, LDG) +RHT = (LRJ, JFL) +JFK = (JSC, MHQ) +NTS = (QFS, GQR) +TQN = (DHF, BTV) +KHG = (BGK, NQF) +ZZZ = (FXC, VQF) +VXL = (NTJ, LKJ) +VFS = (MMD, FMS) +LBQ = (PQM, DCK) +KQX = (CSB, MCD) +FDK = (XFT, PKM) +NQG = (GQR, QFS) +KXS = (LBQ, KRM) +JDN = (HDL, CCB) +TKL = (HSF, CJK) +XRG = (CQP, CXD) +BMP = (RCG, RHG) +KQF = (KGK, LGN) +HLK = (MTT, PFT) +NFK = (MRS, CNV) +HNH = (MFJ, NGM) +FKN = (SVT, LKV) +VPC = (PJC, NBF) +DDK = (SVS, QKD) +DCJ = (RPR, CVJ) +NQJ = (CMR, CMR) +LGL = (PFH, PFH) +RTD = (CDQ, LJV) +FVJ = (FJN, GHV) +BDS = (LDF, JCL) +NSG = (GGT, FRL) +RXM = (DDN, TXT) +JNJ = (SGG, HCT) +SRG = (DLX, CHL) +TGC = (FMG, FHN) +FMG = (BVF, HKK) +NTJ = (HHG, HQP) +KNJ = (HJS, GMC) +QJB = (CCP, GBD) +NXL = (SMX, GKX) +VHS = (MSX, VMV) +CRH = (BQQ, VPC) +GFF = (JFM, BSV) +GLR = (XFD, MBT) +XPR = (GXM, SSF) +LLD = (BLL, NKV) +KXQ = (FDK, RLB) +MXH = (TQQ, HXB) +RQD = (DGN, TMH) +FNB = (NVG, VJQ) +MGH = (KHD, JXB) +JGL = (BMM, KJP) +KJF = (SCV, PHF) +SXD = (BCG, HRR) +TPK = (KJV, VRG) +TJP = (FBP, CDJ) +MKH = (KXM, PRM) +HJM = (SKT, QLK) +GHP = (RFL, KBC) +LGN = (TJP, QMM) +LJV = (JLV, LLD) +NXD = (CNV, MRS) +LKH = (LLM, BNK) +CTM = (MPT, PTN) +SNC = (LQK, MMV) +PNQ = (XXH, MGB) +FMX = (BSD, QJB) +QQL = (HHH, SSN) +QLK = (FCM, MRC) +CMJ = (JGH, SFD) +FHB = (BNK, LLM) +TKG = (FQB, THH) +XPV = (DGP, NXL) +RHP = (LRX, RXF) +BRQ = (LBN, DMV) +NDL = (XMS, CVR) +LDC = (PFN, QFL) +DPP = (XNX, XNX) +NMQ = (PSS, JFJ) +SGG = (PQT, VVB) +FSR = (RPT, PVF) +AAA = (VQF, FXC) +JFL = (BJB, NFM) +XFR = (NHJ, NMH) +HHS = (SFJ, KGR) +MLZ = (RSD, GPT) +MNF = (VNG, TGQ) +FXP = (DPT, FNG) +MRS = (SDP, NQR) +MDT = (JGL, RRM) +MJJ = (GKG, XTS) +PFT = (GFD, DLG) +TVX = (BCD, NJG) +NPA = (VKP, KSN) +TDV = (LDH, VSG) +GQJ = (PDM, PDM) +NTF = (GKF, RHX) +GGT = (KQX, DDB) +LFN = (TFS, MRB) +CSM = (MJT, FHD) +NVQ = (RVG, LDK) +PKM = (FRH, BJJ) +PDM = (BRQ, XPL) +JGH = (BHC, QQL) +SSF = (CGR, BBR) +GVV = (CGH, RBG) +FSB = (PPQ, CND) +LKV = (XCL, PXV) +MXK = (SLH, PKK) +SQL = (XRX, MBV) +LRJ = (BJB, NFM) +VXH = (LFF, XQC) +HTF = (MKH, DGM) +CTB = (LGL, KCR) +HFB = (RTL, GCQ) +NTL = (FQB, THH) +SFD = (QQL, BHC) +HNP = (DPP, DPP) +TTX = (RQD, CFK) +MCQ = (HLP, DNV) +CCP = (VMR, KJG) +TFN = (MRV, SHV) +JKB = (PDM, RFZ) +TGQ = (BJV, HDX) +PHP = (JPM, NDL) +RJX = (MPC, GQP) +CVJ = (LFL, KLG) +KJP = (DDK, XSK) +QPF = (HSF, CJK) +SNQ = (XPG, LQB) +BGF = (VKN, FXP) +KLG = (TMN, JCG) +CGL = (DMK, DKC) +XCM = (XQM, LJG) +RPR = (LFL, KLG) +LFQ = (KBF, SRB) +RJS = (CHQ, GNH) +HDL = (KPR, QCK) +FXJ = (MCC, XHB) +XPG = (VKM, BNT) +DHQ = (FGV, PSV) +SQV = (QMT, FCG) +DHR = (FTQ, HPM) +FCC = (GPS, CVG) +NCH = (FCG, QMT) +QRS = (HDL, CCB) +XQM = (GXH, DTM) +SGJ = (TSH, DCJ) +KBL = (RFL, KBC) +NXC = (JBH, JNJ) +BSQ = (QJT, FVJ) +LTG = (NCH, SQV) +SMV = (JBS, MDQ) +GJJ = (MBH, NTF) +GRV = (MPF, NDP) +HPB = (RLJ, CBR) +TRS = (BXK, RSV) +GCR = (SLH, PKK) +HHH = (CRH, XTP) +GNH = (XSM, HMD) +RSQ = (QFN, GCL) +HKK = (QJX, FKK) +JBV = (TNK, TNK) +TFS = (DHG, QNF) +RTL = (FKB, XGH) +HHG = (XPT, JXQ) +PPR = (LHL, CTB) +SQP = (HGQ, MLZ) +XBN = (BFH, KSK) +CVR = (MDB, PKP) +RFL = (BHQ, TRP) +QHX = (FSR, NTN) +VCH = (MDQ, JBS) +GCL = (MPL, KDP) +KKQ = (GGJ, JHH) +GFC = (PRX, LNL) +PRD = (HTS, RNP) +GQP = (NQJ, VHH) +LJC = (VQK, KNJ) +QCT = (BCD, NJG) +KBF = (SRG, GSF) +NNH = (BTV, DHF) +SSD = (CGL, FFC) +VDD = (HKV, BCP) +VHD = (XCJ, SGJ) +RFZ = (XPL, BRQ) +KGR = (LFT, QDM) +MDQ = (NVQ, MGQ) +MXS = (LFF, XQC) +PCC = (LHL, CTB) +TLC = (RQB, JFP) +CVS = (PJP, QHX) +BNK = (DXN, BVX) +CSB = (CHH, DVM) +XPN = (VSG, LDH) +XSK = (SVS, QKD) +LBN = (LTG, SBQ) +FKK = (RQK, CDV) +MCC = (SJL, DMX) +NMH = (DSX, NNM) +MMD = (GMX, FJX) +LXS = (LJP, KBV) +XMR = (QJB, BSD) +DFR = (KGK, LGN) +DJG = (PFT, MTT) +CGH = (DGK, LFQ) +MRM = (BSQ, LJB) +XCL = (MJJ, VBK) +GBF = (JNG, MXH) +XGN = (FFK, CVN) \ No newline at end of file diff --git a/advent_of_code_2023/day8/main1.rs b/advent_of_code_2023/day8/main1.rs new file mode 100644 index 0000000..d7d041c --- /dev/null +++ b/advent_of_code_2023/day8/main1.rs @@ -0,0 +1,39 @@ +use std::{fs::read_to_string, collections::HashMap}; + +fn parse_input() -> (String, HashMap) { + let lines = read_to_string("input.txt").unwrap().lines().map(|line| { + String::from(line) + }).collect::>(); + + let instr = lines[0].trim(); + let mut mapping: HashMap = HashMap::new(); + + for line in &lines[2..] { + let (key, instructions) = line.split_once('=').unwrap(); + let (left, right) = instructions.trim().split_once(' ').unwrap(); + mapping.insert(String::from(key.trim()), (String::from(&left[1..4]), String::from(&right[..3]))); + } + + (String::from(instr), mapping) +} + +fn main() { + let (instructions, mapping) = parse_input(); + + let mut position = String::from("AAA"); + let mut steps = 0; + let mut caret = 0; + + loop { + if position == "ZZZ" { + break; + } + + position = if instructions.as_bytes()[caret] == b'L' { mapping[&position].0.clone() } else {mapping[&position].1.clone() }; + caret = if caret + 1 == instructions.len() { 0 } else { caret + 1 }; + steps += 1; + } + + println!("Number of steps taken: {}", steps); + +} \ No newline at end of file diff --git a/advent_of_code_2023/day8/main2.rs b/advent_of_code_2023/day8/main2.rs new file mode 100644 index 0000000..2bf71b5 --- /dev/null +++ b/advent_of_code_2023/day8/main2.rs @@ -0,0 +1,86 @@ +use std::{fs::read_to_string, collections::HashMap}; + +struct Route { + offset: usize, + loop_length: usize, + current: usize +} + +// copied from https://www.hackertouch.com/least-common-multiple-in-rust.html +fn lcm(first: usize, second: usize) -> usize { + first * second / gcd(first, second) +} + +fn gcd(first: usize, second: usize) -> usize { + let mut max = first; + let mut min = second; + if min > max { + let val = max; + max = min; + min = val; + } + + loop { + let res = max % min; + if res == 0 { + return min; + } + + max = min; + min = res; + } +} + +fn parse_input() -> (String, HashMap) { + let lines = read_to_string("input.txt").unwrap().lines().map(|line| { + String::from(line) + }).collect::>(); + + let instr = lines[0].trim(); + let mut mapping: HashMap = HashMap::new(); + + for line in &lines[2..] { + let (key, instructions) = line.split_once('=').unwrap(); + let (left, right) = instructions.trim().split_once(' ').unwrap(); + mapping.insert(String::from(key.trim()), (String::from(&left[1..4]), String::from(&right[..3]))); + } + + (String::from(instr), mapping) +} + +fn find_route(start: String, instructions: &String, mapping: &HashMap) -> usize { + let mut caret = 0; + let mut step = 0; + let mut position = start.clone(); + loop { + position = if instructions.as_bytes()[caret] == b'L' { mapping[&position].0.clone() } else { mapping[&position].1.clone() }; + step += 1; + caret = if caret + 1 == instructions.len() { 0 } else { caret + 1 }; + + if position.ends_with('Z') { + return step; + } + } +} + +fn main() { + let (instructions, mapping) = parse_input(); + + let positions = mapping.keys().filter(|key| { + key.ends_with('A') + }).map(|string| String::from(string)).collect::>(); + + println!("{:?}", positions); + + let routes = positions.iter().map(|start| { + find_route(start.clone(), &instructions, &mapping) + }).collect::>(); + + let mut steps = 1; + for route in routes { + steps = lcm(steps, route); + } + + println!("Number of steps taken: {}", steps); + +} \ No newline at end of file diff --git a/advent_of_code_2023/day9/input.txt b/advent_of_code_2023/day9/input.txt new file mode 100644 index 0000000..363e4c1 --- /dev/null +++ b/advent_of_code_2023/day9/input.txt @@ -0,0 +1,200 @@ +23 34 50 94 210 482 1077 2327 4864 9829 19209 36438 67557 123497 224466 408029 743317 1354940 2461668 4436846 7899892 +7 9 15 26 43 67 99 140 191 253 327 414 515 631 763 912 1079 1265 1471 1698 1947 +12 32 74 154 291 503 814 1298 2210 4286 9343 21393 48633 106944 226041 460406 909128 1752848 3324280 6245160 11693791 +5 18 46 106 235 508 1066 2167 4287 8327 16052 31043 60763 120970 244922 502099 1035401 2133556 4369562 8861092 17752611 +27 50 81 131 223 400 743 1399 2619 4806 8573 14811 24767 40132 63139 96671 144379 210810 301545 423347 584319 +7 20 53 118 222 367 553 793 1158 1879 3542 7421 16003 33768 68296 131782 243049 430158 733723 1211048 1941212 +7 5 12 34 74 135 240 495 1245 3405 9085 22675 52646 114551 236281 467922 901195 1708405 3219482 6070032 11475986 +5 13 33 65 109 165 233 313 405 509 625 753 893 1045 1209 1385 1573 1773 1985 2209 2445 +8 -2 -17 -37 -52 -23 148 661 1876 4388 9121 17443 31304 53399 87358 137965 211408 315562 460307 657883 923284 +15 21 44 102 223 460 922 1844 3736 7677 15877 32763 67136 136539 276119 556377 1117965 2238201 4454922 8791220 17153221 +3 16 34 67 142 305 618 1152 1977 3157 4788 7200 11632 22063 49558 121622 300847 719834 1643270 3573485 7423202 +11 17 36 88 213 494 1087 2251 4375 8024 14095 24327 42724 79084 157087 331858 726650 1607251 3529578 7627561 16167592 +-1 0 21 78 198 427 846 1608 3017 5678 10763 20486 39010 74316 142220 275028 539771 1075368 2165681 4378150 8818318 +18 22 38 82 181 381 753 1405 2517 4425 7789 13889 25102 45622 82494 147042 256780 437904 728472 1182388 1874315 +0 1 21 81 210 445 831 1421 2276 3465 5065 7161 9846 13221 17395 22485 28616 35921 44541 54625 66330 +9 27 58 113 216 424 873 1870 4069 8807 18742 39037 79480 158128 307321 583238 1080569 1954363 3451690 5956433 10051312 +0 15 43 82 139 256 556 1322 3137 7150 15616 33032 68536 140880 288411 588317 1192156 2388619 4709831 9104648 17212191 +4 2 12 55 158 353 677 1181 1958 3197 5262 8782 14720 24366 39171 60306 87792 119004 146304 153505 110810 +6 21 45 69 80 61 -9 -155 -406 -795 -1359 -2139 -3180 -4531 -6245 -8379 -10994 -14155 -17931 -22395 -27624 +19 32 45 58 71 84 97 110 123 136 149 162 175 188 201 214 227 240 253 266 279 +10 13 24 50 101 199 404 873 1976 4501 9988 21240 43067 83327 154336 274727 471846 784781 1268128 1996606 3070641 +0 3 7 18 51 129 282 546 962 1575 2433 3586 5085 6981 9324 12162 15540 19499 24075 29298 35191 +17 31 45 59 73 87 101 115 129 143 157 171 185 199 213 227 241 255 269 283 297 +8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 +1 10 39 114 273 568 1066 1847 3012 4748 7561 12914 24758 52917 120106 275652 620853 1353401 2841486 5742580 11189623 +14 17 17 14 8 -1 -13 -28 -46 -67 -91 -118 -148 -181 -217 -256 -298 -343 -391 -442 -496 +10 18 23 25 24 20 13 3 -10 -26 -45 -67 -92 -120 -151 -185 -222 -262 -305 -351 -400 +7 21 35 40 27 5 46 380 1577 4877 12782 30145 66241 138771 281571 559245 1094594 2119788 4072116 7774237 14774706 +16 23 49 115 254 527 1061 2136 4362 9015 18660 38309 77606 155029 306115 599783 1171024 2286635 4477211 8800303 17358594 +6 12 17 21 24 26 27 27 26 24 21 17 12 6 -1 -9 -18 -28 -39 -51 -64 +8 13 38 102 241 526 1092 2186 4257 8134 15369 28861 53924 100017 183417 331187 586870 1018427 1729032 2871440 4666755 +18 30 55 98 178 340 676 1361 2711 5278 10014 18564 33789 60676 107865 190115 332144 574414 981593 1654614 2747468 +18 20 21 22 34 89 257 674 1586 3414 6845 12954 23362 40435 67529 109286 171986 263960 396069 582254 840162 +20 35 60 100 175 341 727 1591 3407 7019 13956 27133 52437 102235 202842 409760 837515 1715946 3493279 7021299 13886128 +15 25 44 79 155 343 810 1895 4220 8855 17578 33324 61032 109319 193790 343400 612197 1100085 1988056 3595765 6472489 +19 38 71 118 179 254 343 446 563 694 839 998 1171 1358 1559 1774 2003 2246 2503 2774 3059 +10 24 49 99 199 402 824 1713 3579 7433 15232 30745 61319 121575 241175 481021 966676 1956580 3979811 8111053 16511955 +19 31 57 103 175 279 421 607 843 1135 1489 1911 2407 2983 3645 4399 5251 6207 7273 8455 9759 +0 -1 4 24 87 253 640 1478 3206 6627 13136 25036 45957 81393 139372 231274 372812 585191 896460 1343072 1971667 +10 36 75 127 192 270 361 465 582 712 855 1011 1180 1362 1557 1765 1986 2220 2467 2727 3000 +-6 -5 -2 12 69 245 687 1656 3603 7306 14121 26447 48580 88239 159197 285682 509691 903614 1594019 2811443 5002638 +-1 -1 0 4 21 82 254 660 1510 3152 6155 11439 20470 35541 60163 99593 161529 257005 401522 616454 930771 +14 21 40 91 194 361 591 871 1192 1618 2508 5092 12744 33476 84391 199070 439114 911299 1792008 3360753 6044662 +11 22 47 97 194 371 672 1152 1877 2924 4381 6347 8932 12257 16454 21666 28047 35762 44987 55909 68726 +1 -6 -20 -31 -5 141 579 1630 3858 8230 16404 31252 57788 104755 187233 330765 577663 996354 1694860 2839779 4682449 +7 8 10 20 45 88 156 295 667 1684 4214 9874 21425 43284 82168 147885 254287 420400 671746 1041872 1574101 +20 40 65 95 130 170 215 265 320 380 445 515 590 670 755 845 940 1040 1145 1255 1370 +21 31 40 48 53 57 85 218 635 1647 3701 7367 13449 23654 42799 84428 183024 417769 955047 2119794 4510308 +6 25 58 105 166 241 330 433 550 681 826 985 1158 1345 1546 1761 1990 2233 2490 2761 3046 +19 34 70 153 321 623 1112 1827 2763 3834 4847 5535 5753 6022 8685 19939 52788 130387 288488 576099 1059512 +0 -7 -16 -22 -9 59 247 658 1442 2805 5018 8426 13457 20631 30569 44002 61780 84881 114420 151658 198011 +8 10 17 34 73 164 376 847 1827 3757 7444 14462 28051 55078 110200 224438 462238 954184 1957407 3963142 7881761 +20 34 57 89 130 180 239 307 384 470 565 669 782 904 1035 1175 1324 1482 1649 1825 2010 +3 4 9 17 27 38 49 59 67 72 73 69 59 42 17 -17 -61 -116 -183 -263 -357 +-3 -3 4 30 91 219 486 1046 2204 4519 8951 17097 31687 57858 106570 203428 410155 873797 1933322 4339084 9684335 +10 25 40 55 70 85 100 115 130 145 160 175 190 205 220 235 250 265 280 295 310 +-4 7 33 80 157 272 422 571 607 266 -992 -4173 -11026 -24431 -48925 -91396 -161978 -275183 -451309 -718166 -1113165 +8 16 39 93 198 378 661 1079 1668 2468 3523 4881 6594 8718 11313 14443 18176 22584 27743 33733 40638 +3 7 20 59 156 383 906 2082 4613 9771 19708 37865 69494 122307 207266 339528 539559 834431 1259316 1859191 2690768 +9 30 55 79 102 142 254 566 1367 3319 7914 18366 41259 89580 188492 386780 780041 1557464 3094013 6126141 12074720 +11 22 51 109 212 373 595 886 1342 2384 5301 13362 33956 82595 190387 418201 884049 1816682 3660479 7278227 14335104 +19 22 26 35 62 136 318 749 1775 4227 9978 22954 50842 107815 218682 424970 793555 1428580 2487530 4202477 6907662 +21 31 45 68 100 139 194 325 737 1960 5143 12466 27624 56293 106580 190008 325237 550617 959681 1788700 3611684 +-4 5 32 90 203 415 814 1586 3126 6256 12634 25483 50825 99472 190104 353853 640912 1129799 1940028 3249072 5314647 +13 34 66 106 155 238 434 929 2114 4764 10362 21685 43875 86463 167418 321730 620219 1210847 2407738 4877617 10018867 +15 40 88 175 333 636 1247 2495 4992 9801 18667 34324 60892 104379 173304 279458 438821 672654 1008786 1483117 2141359 +9 15 37 84 164 289 479 771 1250 2130 3924 7753 15855 32366 64456 123914 229287 408689 703407 1172442 1898134 +9 26 55 117 251 530 1096 2234 4517 9074 18070 35550 68900 131341 246150 453809 824268 1478552 2628474 4653755 8260732 +17 18 15 4 -13 -10 90 449 1359 3325 7268 15036 30585 62440 128345 263285 532179 1048390 1998963 3678322 6537405 +21 28 35 42 49 56 63 70 77 84 91 98 105 112 119 126 133 140 147 154 161 +22 41 69 120 231 472 954 1844 3416 6207 11424 21894 44129 92630 198667 428027 916737 1942612 4067342 8415103 17210070 +10 4 9 47 159 425 996 2137 4282 8113 14703 25819 44590 76974 134963 243555 455734 883874 1763329 3576095 7281317 +0 9 28 57 96 145 204 273 352 441 540 649 768 897 1036 1185 1344 1513 1692 1881 2080 +4 4 10 27 72 179 400 804 1476 2512 3989 5857 7651 7858 2727 -15596 -61125 -153822 -309483 -500209 -540831 +2 11 36 92 206 423 812 1472 2538 4187 6644 10188 15158 21959 31068 43040 58514 78219 102980 133724 171486 +7 13 27 73 191 453 991 2042 4034 7776 14888 28737 56364 112236 225186 450672 891561 1732103 3291689 6107481 11058165 +12 40 92 177 299 453 621 768 838 750 394 -373 -1731 -3901 -7149 -11790 -18192 -26780 -38040 -52523 -70849 +2 10 36 91 202 431 909 1893 3855 7616 14545 26853 48025 83449 141320 233919 379392 604182 946298 1459639 2219628 +16 29 65 143 282 494 787 1185 1768 2732 4467 7650 13350 23143 39237 64610 103168 159935 241293 355297 512098 +10 5 12 38 96 220 487 1059 2282 4931 10788 23917 53323 118277 258683 554867 1164838 2393797 4822956 9546940 18608510 +11 24 50 99 183 327 594 1138 2302 4788 9954 20347 40665 79456 152009 285077 524313 945636 1672246 2899791 4933431 +1 7 33 99 232 470 883 1622 3013 5733 11152 22022 43880 87868 176248 352827 701969 1382067 2682539 5117917 9578800 +8 4 -2 -3 27 147 473 1223 2795 5897 11776 22662 42674 79652 148739 279218 527591 1003263 1920647 3706984 7225286 +8 9 11 16 45 163 513 1361 3153 6581 12649 22723 38542 62161 95793 141516 200814 273929 359015 451106 540939 +13 16 14 10 9 14 23 34 84 384 1667 5941 17938 47682 114784 255368 533109 1057155 2012660 3716109 6720753 +13 23 42 77 147 297 614 1246 2441 4667 8966 17865 37461 81790 181409 399474 860801 1802863 3662826 7221761 13835595 +24 33 39 50 87 186 405 841 1671 3258 6416 13015 27236 57965 123052 256464 519738 1019599 1934157 3550744 6319205 +12 25 46 90 192 414 860 1709 3277 6126 11266 20576 37758 70530 135517 268659 546296 1125970 2322222 4742431 9522654 +0 1 -3 -14 -33 -60 -94 -133 -174 -213 -245 -264 -263 -234 -168 -55 116 357 681 1102 1635 +-4 7 26 50 83 141 270 590 1387 3309 7796 18018 40870 91096 199609 429975 910670 1897655 3894826 7883742 15756517 +21 24 37 69 127 230 435 875 1809 3684 7209 13441 23883 40594 66311 104583 159917 237936 345549 491133 684727 +6 4 -1 1 34 148 444 1112 2482 5088 9745 17639 30430 50368 80422 124422 187214 274828 394659 555661 768554 +23 40 66 101 145 198 260 331 411 500 598 705 821 946 1080 1223 1375 1536 1706 1885 2073 +14 16 29 70 165 350 675 1231 2244 4314 8934 19546 43664 97163 212917 457876 965814 1997888 4050487 8040434 15612411 +4 13 43 102 195 328 530 917 1841 4196 9996 23406 52516 112337 229827 452313 861586 1597375 2896065 5153678 9026609 +-8 -1 25 77 164 297 492 782 1244 2047 3527 6295 11384 20441 35970 61632 102608 166031 261493 401633 602812 +24 37 55 79 115 180 314 604 1234 2601 5588 12166 26609 57758 123022 255360 515860 1017797 1975233 3803805 7328983 +12 14 23 61 175 445 998 2039 3924 7327 13593 25419 48056 91256 172164 319258 577398 1014674 1734881 2909539 4869847 +12 10 19 51 124 273 579 1231 2648 5714 12236 25864 54002 111875 231267 479212 997404 2083634 4356277 9078801 18785272 +-2 -11 -17 -13 5 49 169 507 1380 3397 7615 15739 30371 55313 95929 159571 256074 398325 602911 890851 1288417 +3 1 -4 -3 32 153 441 1011 2017 3657 6178 9881 15126 22337 32007 44703 61071 81841 107832 139957 179228 +3 5 24 76 193 433 900 1791 3497 6802 13259 25907 50693 99390 195638 387278 770904 1539404 3071735 6098927 12005782 +7 15 42 95 182 316 512 779 1116 1541 2240 4056 9795 27268 75688 198084 483877 1107795 2394006 4917853 9662028 +3 15 33 60 99 152 224 335 555 1095 2507 6064 14403 32516 69162 138743 263635 476887 825093 1371100 2196035 +14 19 29 53 108 219 416 728 1174 1751 2419 3083 3572 3615 2814 614 -3730 -11189 -22999 -40703 -66196 +19 47 96 171 270 385 522 756 1339 2881 6626 14847 31386 62367 117112 209292 358347 591211 944380 1466363 2220558 +13 17 32 67 148 344 820 1942 4475 9944 21289 44066 88659 174301 336168 637393 1188485 2177203 3912210 6883485 11841026 +11 22 46 93 177 329 615 1155 2138 3825 6522 10483 15664 21188 24293 18415 -10099 -87352 -260282 -609319 -1266917 +5 16 42 93 188 369 722 1418 2810 5668 11714 24759 53000 113516 240922 503944 1037329 2104085 4218930 8396808 16657278 +13 22 30 34 33 26 4 -57 -179 -287 81 2511 11446 38112 109202 285643 702073 1647364 3723532 8148980 17318427 +-10 -16 -15 9 80 230 499 935 1594 2540 3845 5589 7860 10754 14375 18835 24254 30760 38489 47585 58200 +25 48 79 118 165 220 283 354 433 520 615 718 829 948 1075 1210 1353 1504 1663 1830 2005 +17 33 66 114 169 221 276 393 742 1698 4035 9394 21409 48259 108122 240351 527839 1141439 2428576 5091846 10552481 +17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97 +24 31 39 48 54 49 21 -46 -172 -381 -701 -1164 -1806 -2667 -3791 -5226 -7024 -9241 -11937 -15176 -19026 +24 32 35 33 26 14 -3 -25 -52 -84 -121 -163 -210 -262 -319 -381 -448 -520 -597 -679 -766 +-4 -11 -26 -48 -57 -1 217 752 1830 3761 6952 11920 19305 29883 44579 64480 90848 125133 168986 224272 293083 +25 49 86 151 280 550 1119 2294 4635 9103 17260 31529 55522 94444 155581 248880 387629 589245 876178 1276939 1827260 +21 40 80 166 333 631 1135 1960 3281 5358 8566 13430 20665 31221 46333 67576 96925 136820 190236 260758 352661 +1 14 42 90 162 255 349 393 287 -140 -1156 -3156 -6696 -12531 -21657 -35357 -55251 -83350 -122114 -174514 -244098 +11 36 72 123 194 294 458 797 1583 3374 7182 14685 28482 52388 91764 153875 248267 387152 585788 862839 1240698 +0 0 15 55 130 250 425 665 980 1380 1875 2475 3190 4030 5005 6125 7400 8840 10455 12255 14250 +8 18 36 57 73 67 16 -82 -125 294 2321 8719 25582 65633 154559 343189 730803 1509265 3045463 6033724 11776940 +-6 8 45 117 255 527 1073 2181 4453 9156 18932 39171 80556 163599 326438 637799 1217892 2271160 4136295 7360841 12810093 +-5 -7 6 61 210 541 1199 2438 4747 9126 17628 34331 66985 129775 248135 467680 871677 1616059 2999641 5603532 10565076 +16 20 26 45 102 241 537 1116 2189 4114 7509 13460 23936 42715 77591 145645 285394 583456 1230208 2630623 5615774 +16 27 47 76 114 161 217 282 356 439 531 632 742 861 989 1126 1272 1427 1591 1764 1946 +26 44 80 156 300 550 965 1643 2746 4532 7394 11906 18876 29406 44959 67433 99242 143404 203636 284456 391292 +3 3 17 56 143 329 710 1445 2775 5043 8715 14402 22883 35129 52328 75911 107579 149331 203493 272748 360167 +8 25 61 139 309 661 1334 2526 4517 7724 12814 20908 33916 55050 89569 145817 236622 381131 607163 954169 1476895 +17 30 42 44 27 -8 -27 76 541 1851 4949 11704 25947 55791 118750 252688 538313 1143420 2406244 4986244 10126859 +27 41 55 69 83 97 111 125 139 153 167 181 195 209 223 237 251 265 279 293 307 +19 38 72 139 263 485 903 1751 3536 7282 15003 30691 62449 127086 259832 534432 1103901 2281810 4701898 9626407 19531031 +7 14 32 58 84 97 79 7 -147 -416 -838 -1456 -2318 -3477 -4991 -6923 -9341 -12318 -15932 -20266 -25408 +-1 13 36 65 99 139 188 251 335 449 604 813 1091 1455 1924 2519 3263 4181 5300 6649 8259 +19 29 31 27 21 19 30 75 231 764 2438 7135 19006 46526 106073 227986 466399 914279 1724577 3136463 5501023 +8 14 38 95 203 383 659 1058 1610 2348 3308 4529 6053 7925 10193 12908 16124 19898 24290 29363 35183 +-9 -18 -19 -2 42 134 336 799 1827 3947 7969 15027 26651 45129 74986 127739 234931 480152 1071709 2497940 5843812 +1 2 6 20 57 149 367 848 1829 3688 6992 12552 21485 35283 55889 85780 128057 186542 265882 371660 510513 +19 26 49 115 277 640 1410 2974 6028 11792 22384 41477 75463 135555 241668 429671 764877 1366666 2452191 4411515 7932621 +18 18 12 -2 -26 -62 -112 -178 -262 -366 -492 -642 -818 -1022 -1256 -1522 -1822 -2158 -2532 -2946 -3402 +20 47 92 163 281 493 889 1625 2954 5267 9146 15431 25303 40385 62863 95629 142448 208151 298856 422219 587717 +8 25 63 142 290 541 933 1506 2300 3353 4699 6366 8374 10733 13441 16482 19824 23417 27191 31054 34890 +-3 10 33 61 89 112 125 123 101 54 -23 -135 -287 -484 -731 -1033 -1395 -1822 -2319 -2891 -3543 +0 6 34 97 214 418 769 1377 2440 4302 7536 13057 22270 37258 61015 97729 153120 234838 352926 520353 753622 +3 6 21 61 161 390 865 1780 3476 6607 12522 24112 47605 96194 197051 404364 822757 1648136 3237095 6222123 11698781 +-3 6 24 52 102 210 465 1062 2386 5146 10618 21150 41290 80351 158174 317705 651388 1354197 2825776 5860072 11987885 +-6 1 25 68 128 196 258 321 490 1123 3092 8203 19921 44787 95443 197247 402536 820630 1679579 3451173 7100776 +16 28 52 87 138 238 491 1150 2759 6421 14320 30749 64118 130805 262403 519191 1015136 1964740 3772294 7204873 13731480 +17 29 45 63 93 169 357 759 1519 2853 5169 9451 18313 38575 86999 202117 467101 1051637 2285101 4779391 9628013 +17 24 30 38 66 166 448 1107 2455 4974 9440 17236 31101 56807 106721 207074 412313 832592 1684894 3385342 6711128 +5 12 21 37 65 110 177 271 397 560 765 1017 1321 1682 2105 2595 3157 3796 4517 5325 6225 +15 33 67 137 276 542 1055 2084 4236 8841 18684 39306 81179 163152 317662 598301 1090421 1925537 3300345 5501199 8934878 +17 33 56 88 146 275 564 1183 2471 5124 10576 21774 44787 92171 189935 391680 806673 1654423 3368668 6791624 13529572 +14 20 29 41 57 85 155 359 952 2587 6822 17155 41070 94032 207286 443115 924585 1892777 3814446 7578544 14842554 +19 33 47 61 75 89 103 117 131 145 159 173 187 201 215 229 243 257 271 285 299 +9 35 74 126 191 269 360 464 581 711 854 1010 1179 1361 1556 1764 1985 2219 2466 2726 2999 +4 1 -3 -8 -14 -21 -29 -38 -48 -59 -71 -84 -98 -113 -129 -146 -164 -183 -203 -224 -246 +8 22 49 111 240 488 962 1896 3776 7544 14922 28916 54583 100178 178876 311485 531164 892610 1491347 2505101 4281102 +19 25 35 58 109 213 416 814 1624 3340 7055 15121 32534 69903 149820 320260 681865 1441415 3012595 6198864 12513843 +16 24 31 39 50 66 89 121 164 220 291 379 486 614 765 941 1144 1376 1639 1935 2266 +-3 2 26 80 175 322 532 816 1185 1650 2222 2912 3731 4690 5800 7072 8517 10146 11970 14000 16247 +3 23 67 152 306 588 1137 2277 4718 9906 20588 41671 81467 153429 278496 488178 828525 1365137 2189385 3426026 5242408 +4 14 34 69 135 276 589 1253 2558 4930 8948 15349 25017 38952 58215 83845 116744 157526 206326 262565 324667 +-2 5 32 87 178 313 500 747 1062 1453 1928 2495 3162 3937 4828 5843 6990 8277 9712 11303 13058 +10 14 18 22 26 30 34 38 42 46 50 54 58 62 66 70 74 78 82 86 90 +-4 7 31 65 109 181 344 747 1693 3774 8172 17357 36698 78069 167555 361054 774146 1636229 3383653 6812237 13315587 +4 3 -1 0 27 122 368 939 2212 4999 11017 23842 50835 106942 221926 453569 910780 1792467 3450595 6489188 11915283 +-5 4 19 33 35 10 -61 -201 -437 -800 -1325 -2051 -3021 -4282 -5885 -7885 -10341 -13316 -16877 -21095 -26045 +-1 -2 3 28 89 197 347 503 579 416 -245 -1794 -4787 -9985 -18397 -31327 -50425 -77742 -115789 -167600 -236799 +4 16 37 72 137 274 567 1154 2230 4036 6829 10828 16131 22598 29695 36294 40424 38968 27301 -1136 -55331 +2 13 42 101 214 443 933 1986 4193 8694 17720 35731 71758 144096 289487 580743 1159992 2300323 4517950 8772093 16813322 +19 28 42 73 149 325 716 1577 3466 7551 16174 33877 69240 138092 268946 511891 952661 1734206 3088826 5384809 9192551 +2 12 44 108 210 343 470 500 267 -468 -1961 -4318 -7079 -8198 -1557 28951 123080 374933 1000696 2486171 5904680 +12 21 55 131 278 562 1132 2306 4725 9607 19136 37035 69422 126176 223308 387327 663438 1130801 1930337 3314239 5732378 +3 25 68 152 326 684 1385 2692 5067 9394 17455 32857 62708 120511 231130 439616 827811 1547071 2883854 5389714 10131642 +2 15 40 71 109 177 336 710 1539 3290 6867 13972 27680 53302 99621 180597 317648 542625 901610 1459677 2306767 +2 0 9 39 112 282 671 1538 3403 7244 14765 28683 52886 92176 151206 232390 333580 449312 586517 820327 1443696 +3 -2 -7 -12 -17 -22 -27 -32 -37 -42 -47 -52 -57 -62 -67 -72 -77 -82 -87 -92 -97 +-4 3 32 100 230 468 924 1844 3714 7393 14277 26519 47387 81978 138840 233850 399463 706075 1309191 2548656 5147939 +10 12 8 -1 -4 25 132 388 894 1786 3240 5477 8768 13439 19876 28530 39922 54648 73384 96891 126020 +-1 -2 -1 15 76 237 590 1278 2507 4563 7879 13270 22570 40087 75597 150131 306718 629679 1278058 2541040 4924779 +6 11 37 93 189 349 636 1199 2368 4855 10167 21409 44779 92290 186698 370476 722452 1389717 2651819 5056495 9717067 +18 24 33 47 67 97 163 363 978 2701 7081 17332 39723 85844 176135 345170 649306 1177438 2065745 3517469 5828939 +18 35 65 129 273 595 1288 2705 5466 10653 20177 37451 68565 124233 222868 395239 691274 1189695 2011305 3336893 5430881 +8 16 22 39 105 300 779 1846 4105 8744 18060 36461 72466 142823 281093 555533 1106071 2219890 4483805 9086663 18409344 +-2 -6 -10 -14 -18 -22 -26 -30 -34 -38 -42 -46 -50 -54 -58 -62 -66 -70 -74 -78 -82 +17 32 61 125 265 555 1131 2256 4457 8803 17454 34711 68956 136139 265959 512819 975397 1831886 3403551 6268573 11463055 +4 20 45 80 138 264 573 1311 2944 6280 12629 24006 43382 74988 124677 200349 312444 474508 703837 1022204 1456674 +19 35 60 97 147 205 256 271 203 -17 -484 -1323 -2693 -4791 -7856 -12173 -18077 -25957 -36260 -49495 -66237 +15 26 56 115 223 439 909 1947 4181 8823 18169 36525 71936 139470 267591 510765 974681 1866797 3596898 6974250 13586527 +15 20 22 31 65 150 327 680 1422 3125 7280 17566 42555 101170 233169 518440 1111279 2299649 4605667 8953841 16950205 +6 10 13 20 47 146 449 1238 3054 6878 14462 28969 56209 106944 200990 374179 689670 1255626 2251915 3969258 6865147 +12 20 28 45 98 239 551 1158 2254 4193 7746 14769 29806 63702 141370 317903 711064 1565202 3374044 7111009 14650730 +7 27 74 167 335 632 1161 2107 3779 6661 11472 19235 31355 49706 76727 115527 169999 244943 346198 480783 657047 +7 14 30 80 206 479 1019 2029 3848 7028 12452 21545 36696 62115 105534 181588 318906 576315 1082463 2134847 4443259 +22 30 37 42 55 117 328 891 2183 4871 10104 19841 37454 68967 125892 232163 441415 879483 1845822 4046547 9108744 +11 29 62 129 272 570 1155 2238 4162 7508 13289 23276 40509 70055 120084 203343 339117 555775 894008 1410875 2184782 +7 20 48 97 183 345 664 1311 2667 5589 11946 25630 54378 112952 228561 449940 862323 1611794 2944352 5267719 9247757 +11 10 20 57 143 310 603 1080 1820 2985 5049 9416 19824 45236 105488 242048 538249 1156912 2409250 4878527 9636677 \ No newline at end of file diff --git a/advent_of_code_2023/day9/main1.rs b/advent_of_code_2023/day9/main1.rs new file mode 100644 index 0000000..deed9c4 --- /dev/null +++ b/advent_of_code_2023/day9/main1.rs @@ -0,0 +1,26 @@ +use std::fs::read_to_string; + +fn extrapolate(sequence: &Vec) -> i64 { + if sequence.iter().all(|num| { *num == 0 }) { + return 0; + } + + let mut deltas: Vec = Vec::new(); + for idx in 1..sequence.len() { + deltas.push(sequence[idx] - sequence[idx - 1]); + } + + sequence.last().unwrap() + extrapolate(&deltas) +} + +fn main() { + let sequences = read_to_string("input.txt").unwrap().lines().map(|line| { + line.split(' ').map(|num| { + num.parse::().unwrap() + }).collect::>() + }).collect::>(); + + println!("Sum of extrapolations: {}", sequences.iter().map(|sequence| { + extrapolate(sequence) + }).sum::()); +} \ No newline at end of file diff --git a/advent_of_code_2023/day9/main2.rs b/advent_of_code_2023/day9/main2.rs new file mode 100644 index 0000000..4bea0b2 --- /dev/null +++ b/advent_of_code_2023/day9/main2.rs @@ -0,0 +1,26 @@ +use std::fs::read_to_string; + +fn extrapolate_backwards(sequence: &Vec) -> i64 { + if sequence.iter().all(|num| { *num == 0 }) { + return 0; + } + + let mut deltas: Vec = Vec::new(); + for idx in 1..sequence.len() { + deltas.push(sequence[idx - 1] - sequence[idx]); + } + + sequence.first().unwrap() + extrapolate_backwards(&deltas) +} + +fn main() { + let sequences = read_to_string("input.txt").unwrap().lines().map(|line| { + line.split(' ').map(|num| { + num.parse::().unwrap() + }).collect::>() + }).collect::>(); + + println!("Sum of extrapolations: {}", sequences.iter().map(|sequence| { + extrapolate_backwards(sequence) + }).sum::()); +} \ No newline at end of file