diff --git a/advent_of_code/2023/7/Cargo.toml b/advent_of_code/2023/7/Cargo.toml new file mode 100644 index 0000000..846ccce --- /dev/null +++ b/advent_of_code/2023/7/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "main" +version = "0.1.0" +edition = "2021" + +[dependencies] +nom = "7.1.3" diff --git a/advent_of_code/2023/7/input.txt b/advent_of_code/2023/7/input.txt new file mode 100644 index 0000000..33f5900 --- /dev/null +++ b/advent_of_code/2023/7/input.txt @@ -0,0 +1,1000 @@ +JJJJJ 435 +29QA4 847 +6A9A9 348 +TKQKT 260 +J3J58 486 +6JT4T 908 +K898J 553 +KKJK6 957 +TQJTT 394 +33353 431 +J3JTT 89 +K787Q 296 +JA727 236 +7T779 914 +9J2J7 774 +Q866T 36 +4QQ34 745 +T3366 197 +7777Q 825 +TTA9T 894 +22292 50 +Q4KJK 733 +69TK9 144 +7427J 930 +T6372 580 +T5TT4 451 +9T5TT 282 +2Q29Q 778 +77K77 822 +J777Q 489 +27445 542 +44JAT 474 +678T9 266 +J99TT 987 +88826 907 +Q2748 477 +Q7A4K 584 +J7J72 480 +94797 417 +2Q2TQ 972 +Q8225 943 +Q5666 731 +TAA63 485 +7AATJ 627 +A496A 609 +Q7Q72 776 +Q593K 702 +KK55J 455 +5A56K 980 +44342 969 +353K3 216 +44644 759 +Q777A 884 +KAKTA 634 +A4628 75 +32Q3Q 342 +J6Q6Q 843 +8K83K 630 +7JJT7 1 +T6T22 931 +7A329 991 +893Q7 471 +TA3AT 290 +AQJTA 838 +K733K 793 +76K27 408 +6TKJT 701 +4J3TK 673 +4278A 487 +72A24 15 +89488 779 +86678 428 +222TT 248 +77872 920 +AKAKK 685 +76972 72 +99J2K 948 +KKTKK 576 +T7Q6A 671 +K5T55 76 +66J55 828 +Q23A2 183 +63333 990 +JJ45A 903 +84AA8 985 +J272J 308 +5666K 953 +3QT3Q 611 +777TT 737 +JAA2A 592 +2J992 244 +J5242 268 +6J86K 973 +J43KJ 40 +8A888 832 +5T66A 723 +38J55 47 +9765J 473 +2K45T 415 +772J2 788 +55772 399 +J6256 676 +69776 684 +9KQ99 808 +J33J3 452 +TJ4T7 314 +455J4 550 +92K99 29 +KT77J 427 +3J3A3 965 +KKQQK 842 +K4KK5 916 +QJTT2 614 +8QQQA 767 +88JTJ 518 +T8TTQ 22 +KKKK8 303 +4JJ4A 898 +97T7J 813 +28JK6 926 +225KK 189 +96966 132 +T34T4 520 +5QQ5Q 418 +4J444 482 +56667 532 +44JQ4 306 +JTAA5 762 +88836 846 +55655 148 +57K5K 217 +3AQQ3 784 +2TTAT 91 +88887 327 +83T4J 720 +22226 391 +26266 163 +QQQKQ 386 +24JAT 495 +3TJ3T 919 +T96TT 849 +K66K6 612 +2J272 110 +68688 792 +AQAAT 116 +5AKA7 754 +JA96A 806 +T74JJ 498 +6K629 208 +7J62Q 209 +44JT3 768 +44884 624 +55575 119 +5896A 463 +J262K 66 +7666Q 739 +5J52J 9 +98999 915 +5TT7T 235 +2K546 963 +J6J66 365 +7J22K 84 +4J4T4 821 +222KT 589 +K33K3 372 +22777 12 +66TAJ 258 +56J42 962 +28888 19 +423T5 354 +K6KKK 818 +5K489 320 +37958 62 +888J8 629 +665T7 238 +8888T 615 +JTQ72 426 +3333K 142 +Q6KQQ 38 +6QKT5 73 +89558 467 +K3AKK 703 +TTKT8 356 +6J668 597 +5555J 732 +57TA2 139 +34433 439 +33537 993 +JJAAK 337 +A2J24 274 +688JT 698 +79AKQ 853 +34KK4 791 +492AK 199 +29323 309 +KT8KK 42 +88488 777 +6K678 870 +35698 515 +22683 94 +T88TJ 594 +TJTJK 96 +99699 459 +44QJ3 711 +92699 799 +KJK44 631 +99299 862 +6AATA 649 +K8888 27 +4T222 493 +AA4AA 362 +QKQ4K 856 +57JA5 146 +K75JK 669 +88785 575 +4TQ2T 864 +JTTTJ 628 +3JTJ3 722 +A26J2 531 +6J65Q 367 +74J77 775 +3888K 728 +T97T9 527 +8AA5A 188 +99555 346 +J5TJ5 725 +TTJ63 207 +7773T 693 +3KKK2 979 +97QT2 453 +4T499 118 +A662A 548 +29TTJ 665 +4A664 952 +79354 267 +QQ6Q6 241 +KA934 69 +J88KK 623 +T66T7 332 +JT7A6 156 +A555A 335 +65669 492 +5AAAA 265 +22252 566 +K22Q2 743 +86K26 900 +5J726 697 +9K99K 803 +39222 387 +82749 569 +TT77T 33 +QJ6QQ 95 +7487Q 997 +KAK87 124 +Q2Q22 404 +82822 591 +TJ9A2 177 +44KK6 14 +98T4Q 967 +TA6A6 46 +2T483 710 +JK6AA 133 +92922 128 +92JAQ 654 +5TKA7 436 +97KA6 106 +4TA52 448 +98988 140 +22272 823 +KTKK5 4 +599A4 798 +6J578 411 +J7777 865 +3KKK3 845 +J8JJ8 240 +A2AQ6 272 +5TT55 77 +388A8 873 +T9K52 816 +88822 130 +32888 30 +J9J7Q 219 +KTKTK 836 +6AJ26 839 +KAA99 67 +966Q9 41 +95596 276 +79467 512 +233A2 321 +677A7 195 +392AK 558 +24T7K 758 +QK55K 230 +T6T66 252 +JQQJQ 171 +QTQ95 170 +JKJ4K 150 +52A76 851 +535T5 1000 +6QQQ8 780 +K7KKK 600 +55754 396 +AA88A 646 +85J8A 114 +6666J 595 +J6Q3Q 514 +4K774 992 +67464 297 +K4777 921 +8Q38J 464 +T3933 456 +573A9 946 +23949 995 +5K9KJ 852 +5K57A 149 +J2279 854 +AKAK7 164 +492TQ 105 +32JQT 443 +J737J 412 +5A552 787 +4KKKK 369 +23333 632 +TJT22 664 +6T766 423 +32J54 289 +5TQK3 984 +9K955 528 +34Q6J 607 +JKKAA 159 +22627 807 +98J9Q 513 +66866 425 +33776 878 +J4J4K 11 +5TKJ5 249 +65565 419 +7K7K6 121 +97QJ2 347 +TTJ48 228 +4747T 26 +65TTJ 410 +7KQQ2 913 +K9977 789 +JKK93 511 +A32JJ 55 +AK8Q4 795 +KQKK3 162 +Q652K 34 +T2523 58 +TKQTT 588 +99Q63 196 +4A427 24 +55A5T 315 +AA43A 831 +69692 294 +TKTTT 688 +TQJT8 287 +TAT72 49 +777T7 445 +99839 961 +39545 949 +TA99A 712 +KKQKK 934 +Q7QJQ 281 +333KJ 334 +2KKJA 255 +85T88 866 +99J9J 805 +J44J4 247 +33AK3 97 +33J38 165 +2J2K3 168 +A69J9 180 +9Q726 695 +49T32 304 +86K66 947 +3Q9K7 277 +J6662 200 +A5628 438 +Q727A 278 +27688 295 +J5573 888 +43T68 640 +65656 496 +QJ38J 68 +83488 536 +K2K2J 918 +JK26K 658 +Q44J2 719 +73677 261 +KT3K8 585 +9J969 226 +Q7QQ7 837 +Q7797 705 +T442A 351 +66559 134 +8AJ8T 970 +3JAAA 892 +5A5JA 738 +A2639 54 +KKT78 284 +T7864 6 +997J9 51 +K8J72 176 +K7J84 213 +65668 929 +KAT63 565 +8TQ53 988 +3555J 462 +K3J5K 279 +3J99J 98 +2JK24 932 +3JK4Q 204 +7277K 507 +739AA 465 +KJ839 187 +JT69K 620 +866AA 333 +36835 582 +K2255 971 +9T59T 833 +7A3K9 886 +5K844 734 +73642 458 +JKKJ8 300 +6KK99 186 +K2K2K 577 +336A2 905 +4897Q 769 +22A26 137 +8Q888 893 +J443K 694 +72777 883 +TQQQQ 951 +QQQQ5 57 +5T5TJ 184 +J7KKQ 358 +K7796 637 +55J52 817 +JJ6Q6 714 +42556 521 +2772A 896 +9K27A 881 +4574Q 618 +75557 863 +A95A5 885 +AA8AA 794 +88Q85 108 +AQQ44 5 +7JJA7 619 +3J798 92 +K6T95 63 +JA5Q9 112 +JT2T7 756 +76677 996 +4K24K 826 +KJKKK 909 +56TQ7 911 +5T6J2 479 +T46K2 923 +658T7 643 +3T999 225 +4K75A 126 +JQ568 23 +Q5482 721 +JAATT 706 +AKJ5T 782 +776J3 517 +27227 291 +42424 283 +KAT47 234 +TT8TT 766 +A7JQA 651 +222Q2 804 +JK55Q 85 +24999 933 +Q888Q 757 +74778 141 +Q855Q 352 +9J6QQ 552 +K532T 328 +AAQQQ 572 +6J823 407 +Q29K6 889 +99644 964 +62666 590 +5QQ45 638 +5J599 912 +QJQQT 724 +7J62K 494 +Q38K5 301 +Q4Q85 115 +Q9JT6 275 +A46A8 319 +TT4TT 35 +66QT9 81 +35242 8 +43AQT 405 +J8728 686 +JTKK4 400 +62252 214 +94Q93 325 +TT4KK 501 +9QJKA 305 +JQJ9J 508 +2497T 786 +KKK88 522 +23339 682 +77Q57 568 +947JQ 539 +Q9764 74 +A3A3A 444 +282T2 506 +AQ863 86 +Q9QQQ 374 +K8285 879 +6QAQT 368 +63K68 976 +Q4QQQ 382 +6J8KT 924 +4JAK5 827 +93339 475 +6TTTT 502 +24Q32 603 +T6555 650 +Q6TT6 574 +3355J 316 +T4888 750 +TK82A 229 +49J7T 764 +KA69A 403 +TK777 153 +79887 497 +QQQ9J 421 +JT8KK 959 +42444 82 +TTT72 259 +Q5892 783 +35Q5Q 111 +TK2T3 740 +TTTT3 312 +85952 392 +62393 59 +66466 844 +TTJ9T 887 +9TJ64 147 +4A447 182 +8Q39Q 790 +5969Q 535 +TA28A 117 +79285 174 +2376K 641 +7Q25K 809 +QTA68 939 +KKAKK 376 +532A8 598 +T4JJK 329 +QQQ2J 323 +46A4J 93 +66333 434 +A43A9 349 +4Q4QQ 416 +5K326 578 +T8T28 880 +4KQ63 273 +J555J 330 +7748J 977 +53595 385 +3JKA3 271 +JJ222 83 +4836K 285 +KQQ4Q 581 +T63JK 763 +T35T3 221 +4KK33 753 +333TA 557 +QQJQQ 730 +J39T7 986 +33235 80 +Q828Q 231 +5TTQ5 983 +35J7T 668 +AJ8JA 16 +JJ4QJ 954 +6Q62Q 437 +A3J26 678 +79654 938 +6J624 815 +K9KK7 449 +TT92T 830 +926JA 203 +556Q5 707 +5565K 835 +3K4QK 692 +8JKJ5 727 +Q7QAQ 161 +K7KK4 2 +Q2253 810 +45K45 37 +Q975T 123 +J6J7J 18 +QQQ24 709 +69868 322 +96AQ4 917 +TT4AT 679 +T543J 602 +JATTT 310 +5Q2K9 251 +56J99 383 +56999 796 +44447 192 +Q2QK2 748 +Q362Q 958 +J8788 88 +555Q5 937 +675J6 476 +9494J 901 +8A47K 998 +47869 529 +7J95J 935 +5438J 331 +222J2 254 +635J9 157 +QAJ39 989 +22297 422 +K8488 160 +AJAA4 593 +6KK9J 621 +66J88 895 +K9J99 384 +37Q37 169 +3333Q 239 +4K956 546 +55455 735 +2JAKA 656 +878K7 381 +KK9KK 457 +K6QT7 904 +67J7K 897 +39993 544 +T8TT5 736 +T552A 103 +44555 191 +K8KQ5 484 +4TT4T 420 +555J4 872 +924T6 713 +6J7T7 608 +26TQ9 760 +95999 390 +738JQ 135 +JJTTJ 717 +54444 504 +KJJKK 999 +4Q5TQ 874 +5558J 470 +J7898 729 +7TKK7 336 +JK8A8 373 +JJTQ5 344 +T936A 256 +AAAJ5 606 +T7776 526 +JA467 978 +J2Q82 755 +8A878 955 +A8AQA 670 +JKK6Q 253 +A88A8 945 +7A8K8 224 +77572 350 +Q2475 324 +6444K 409 +AAK22 819 +3A68T 461 +9T9T9 100 +559KJ 71 +93J99 683 +4444Q 560 +82222 61 +39Q42 3 +T2TTQ 547 +KAAAA 525 +A2563 446 +T7JT7 744 +TK8A9 155 +66667 811 +9J599 483 +TTKKA 193 +499J9 556 +K7JT4 79 +J9999 233 +8Q88A 771 +J6TJ8 389 +48884 940 +9J398 201 +TKTKT 343 +KKKJ4 540 +AA3AA 696 +58KKK 269 +KKJ9Q 432 +JJ888 488 +K9999 661 +QQQ99 361 +29729 353 +925JK 243 +QT642 704 +47777 770 +994K8 245 +74AAK 960 +83K33 505 +TTT52 773 +A52A2 636 +55992 586 +9A88A 691 +52725 860 +KTJ27 107 +7K7QK 605 +T8332 340 +JJ897 899 +3AA6A 359 +6J63K 677 +88AQQ 524 +KJQ88 625 +5A6A4 250 +599AA 172 +KK3K5 194 +2JK7J 393 +7788J 433 +2332J 113 +AJ79K 218 +TKKKQ 802 +TT878 371 +T44T9 503 +3JA4K 902 +JAQT7 708 +95777 781 +Q82J4 966 +58484 715 +557A7 834 +56568 397 +75A55 17 +68TTJ 562 +994T5 481 +KAKA8 380 +TTTTJ 52 +J3663 812 +J346J 699 +4484J 292 +K4KT7 355 +4273K 689 +69889 741 +66644 642 +4KT49 151 +T287J 181 +85955 549 +7J643 857 +7384T 820 +37877 302 +27438 509 +4J222 299 +69K73 48 +9478K 179 +777JJ 906 +55A3A 868 +Q7Q77 232 +82384 469 +747J4 942 +8927A 516 +A86K2 891 +J66J5 401 +A624Q 414 +42JT5 31 +9K959 928 +6KT88 360 +A8796 101 +AQAQA 626 +38539 491 +T5393 413 +2TK2K 975 +5K555 44 +999Q9 604 +QA8J4 956 +3Q958 537 +Q7T82 925 +8J434 138 +A992A 613 +8899J 270 +285J7 246 +5TT5K 326 +JQ373 286 +5J25T 652 +QKQQK 158 +77T96 32 +AA978 64 +4ATTJ 478 +T558Q 215 +Q2685 500 +K7QAA 20 +8TTA3 563 +3T9TT 441 +4AKAK 633 +34434 538 +AAA7A 747 +397K2 370 +Q8878 610 +QK3KQ 56 +4T448 175 +888TT 875 +3QA85 554 +T2KTT 660 +Q6QQQ 824 +9QA9T 341 +9QQ54 364 +89989 858 +AJAAA 855 +77977 395 +55T59 599 +AQQ77 202 +74TJ8 466 +63J93 87 +K3665 237 +222TJ 375 +594JT 7 +9999T 519 +J339J 377 +TJ7A7 551 +832Q7 388 +33J33 968 +7777A 28 +KAT4A 543 +6J427 635 +AAATT 655 +75AJ4 152 +AAJJA 622 +A8A6Q 122 +5984T 657 +JA338 125 +J3J6T 129 +246QJ 752 +Q2A65 555 +A2A95 936 +9J882 143 +8A8T6 227 +958K8 797 +58T43 653 +58558 25 +9JTKQ 718 +42622 680 +7837J 167 +44844 402 +62K62 675 +KKK72 746 +9A33A 876 +6T666 293 +Q333Q 571 +333J6 178 +K4577 772 +9T9KK 690 +J7997 601 +JTTKK 206 +5J677 644 +77Q73 338 +J3377 877 +88777 131 +2J2J5 801 +62622 534 +24944 742 +6TTAK 21 +A5Q98 749 +8A8T8 648 +T2222 366 +T4335 190 +46365 761 +29K92 205 +444TT 185 +A4A4A 583 +3229T 882 +6QJ93 859 +22232 223 +72666 499 +Q8QQJ 65 +87667 210 +98K7T 211 +7J459 944 +23537 663 +AT6Q9 726 +KA263 666 +5QK67 567 +54548 222 +K7AA7 681 +89AA9 468 +JA774 687 +QTT4Q 564 +22AKK 561 +JQ3KQ 981 +T3T6T 78 +3666K 430 +JJJJ8 154 +5T3TT 639 +KK4QK 280 +6T9A9 890 +K5J4Q 941 +64464 800 +J47K3 867 +AA7A4 667 +JK68A 166 +99779 379 +9K848 212 +AJ433 378 +5TQJ4 447 +53252 785 +3T333 318 +777K9 662 +9J9KK 765 +2J288 313 +889J8 298 +77755 848 +J4442 406 +4Q6J8 454 +79J82 60 +4AATJ 173 +KKJK2 53 +AAQ4Q 39 +7468K 460 +6A654 99 +J3888 345 +T9TT9 109 +2243T 13 +KKKAJ 339 +Q99JQ 950 +66689 861 +K9J8A 104 +AQ99Q 263 +T66J6 127 +3QA44 850 +QAAA5 523 +9T3TJ 994 +A99AA 145 +6TT6T 242 +36444 90 +6QQTT 573 +57J75 596 +3725J 579 +J333Q 814 +22AA4 533 +55QQ5 647 +228JK 424 +A3333 442 +29295 45 +83236 472 +Q74Q4 490 +TTATT 317 +667J7 871 +AA4QA 288 +QQ3Q6 429 +77577 910 +K9997 220 +6A738 70 +TK85T 198 +T733T 264 +T23TT 357 +4K22K 541 +7TAA8 716 +39999 363 +Q6666 136 +66663 674 +QQJ37 120 +22K53 829 +2Q93T 659 +23KKQ 262 +75785 307 +3TK47 617 +A8285 840 +A4238 982 +4AA44 645 +972AA 751 +T465K 927 +J33KJ 587 +JT9T7 700 +6JK49 922 +4A237 841 +75Q2J 974 +6J8AJ 545 +9KQKK 311 +K4AJT 450 +Q7JQ7 257 +4QJ88 102 +9JTQJ 570 +KQJ25 616 +78J85 440 +65482 559 +5Q538 10 +5JJ62 869 +777J6 510 +28T4Q 398 +AJ53A 672 +53543 530 +77373 43 \ No newline at end of file diff --git a/advent_of_code/2023/7/src/main.rs b/advent_of_code/2023/7/src/main.rs new file mode 100644 index 0000000..d6fbb7a --- /dev/null +++ b/advent_of_code/2023/7/src/main.rs @@ -0,0 +1,263 @@ +use std::{cmp::Ordering, collections::HashMap, iter::zip}; + +use nom::{ + character::complete::{alphanumeric1, multispace1, u64}, + multi::separated_list1, + sequence::separated_pair, + IResult, Parser, +}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +enum HandType { + HighCard, + OnePair, + TwoPair, + ThreeKind, + FullHouse, + FourKind, + FiveKind, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +enum CardType { + Two, + Three, + Four, + Five, + Six, + Seven, + Eight, + Nine, + T, + Jack, + Queen, + King, + Ace, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +enum CardType2 { + Jack, + Two, + Three, + Four, + Five, + Six, + Seven, + Eight, + Nine, + T, + Queen, + King, + Ace, +} + +fn parse_input(input: &str) -> IResult<&str, Vec<(String, u64)>> { + let (input, result) = separated_list1( + multispace1, + separated_pair(alphanumeric1::<&str, _>, multispace1, u64) + .map(|(hand, bid)| (hand.to_string(), bid)), + )(input)?; + + Ok((input, result)) +} + +fn classify_hand(hand: &String) -> HandType { + use HandType::*; + + let mut card_numbers: HashMap = HashMap::new(); + for c in hand.to_owned().chars() { + card_numbers.insert( + c, + match card_numbers.get(&c) { + Some(n) => n + 1, + None => 1, + }, + ); + } + + let mut card_numbers = card_numbers.values().collect::>(); + card_numbers.sort_unstable(); + match card_numbers[..] { + [1, 1, 1, 1, 1] => HighCard, + [1, 1, 1, 2] => OnePair, + [1, 2, 2] => TwoPair, + [1, 1, 3] => ThreeKind, + [2, 3] => FullHouse, + [1, 4] => FourKind, + [5] => FiveKind, + _ => unreachable!(), + } +} + +fn classify_hand2(hand: &String) -> HandType { + use HandType::*; + + let mut card_numbers: HashMap = HashMap::new(); + for c in hand.to_owned().chars() { + card_numbers.insert( + c, + match card_numbers.get(&c) { + Some(n) => n + 1, + None => 1, + }, + ); + } + + if let Some(jokers) = card_numbers.remove(&'J') { + let mut card_numbers = card_numbers.values().collect::>(); + card_numbers.sort_unstable(); + let highest = card_numbers.pop().unwrap_or(&0) + jokers; + card_numbers.push(&highest); + + match card_numbers[..] { + [1, 1, 1, 2] => OnePair, + [1, 1, 3] => ThreeKind, + [2, 3] => FullHouse, + [1, 4] => FourKind, + [5] => FiveKind, + _ => unreachable!(), + } + } else { + let mut card_numbers = card_numbers.values().collect::>(); + card_numbers.sort_unstable(); + match card_numbers[..] { + [1, 1, 1, 1, 1] => HighCard, + [1, 1, 1, 2] => OnePair, + [1, 2, 2] => TwoPair, + [1, 1, 3] => ThreeKind, + [2, 3] => FullHouse, + [1, 4] => FourKind, + [5] => FiveKind, + _ => unreachable!(), + } + } +} + +fn classify_card(card: char) -> CardType { + use CardType::*; + + match card { + 'A' => Ace, + 'K' => King, + 'Q' => Queen, + 'J' => Jack, + 'T' => T, + '9' => Nine, + '8' => Eight, + '7' => Seven, + '6' => Six, + '5' => Five, + '4' => Four, + '3' => Three, + '2' => Two, + _ => unreachable!(), + } +} + +fn classify_card2(card: char) -> CardType2 { + use CardType2::*; + + match card { + 'A' => Ace, + 'K' => King, + 'Q' => Queen, + 'T' => T, + '9' => Nine, + '8' => Eight, + '7' => Seven, + '6' => Six, + '5' => Five, + '4' => Four, + '3' => Three, + '2' => Two, + 'J' => Jack, + _ => unreachable!(), + } +} + +fn compare_hands(hand_1: &String, hand_2: &String) -> Ordering { + let (hand_type_1, hand_type_2) = (classify_hand(hand_1), classify_hand(hand_2)); + if hand_type_1 == hand_type_2 { + for (card_1, card_2) in zip(hand_1.to_owned().chars(), hand_2.to_owned().chars()) { + if card_1 != card_2 { + return classify_card(card_1).cmp(&classify_card(card_2)); + } + } + Ordering::Equal + } else { + hand_type_1.cmp(&hand_type_2) + } +} + +fn compare_hands2(hand_1: &String, hand_2: &String) -> Ordering { + let (hand_type_1, hand_type_2) = (classify_hand2(hand_1), classify_hand2(hand_2)); + if hand_type_1 == hand_type_2 { + for (card_1, card_2) in zip(hand_1.to_owned().chars(), hand_2.to_owned().chars()) { + if card_1 != card_2 { + return classify_card2(card_1).cmp(&classify_card2(card_2)); + } + } + Ordering::Equal + } else { + hand_type_1.cmp(&hand_type_2) + } +} + +fn solve_1(plays: &Vec<(String, u64)>) -> u64 { + let mut plays = plays.clone(); + + plays.sort_unstable_by(|(hand_1, _bid1), (hand_2, _bid2)| compare_hands(hand_1, hand_2)); + + plays + .into_iter() + .enumerate() + .map(|(rank, (_hand, bid))| (rank as u64 + 1) * bid) + .sum() +} + +fn solve_2(plays: &Vec<(String, u64)>) -> u64 { + let mut plays = plays.clone(); + + plays.sort_unstable_by(|(hand_1, _bid1), (hand_2, _bid2)| compare_hands2(hand_1, hand_2)); + + plays + .into_iter() + .enumerate() + .map(|(rank, (_hand, bid))| (rank as u64 + 1) * bid) + .sum() +} + +fn main() { + println!("Hello, this is Patrick!"); + + let input_text = include_str!("../input.txt"); + + let (_, plays) = parse_input(input_text).unwrap(); + + println!("The total winnings are {}", solve_1(&plays)); + println!("The new total winnings are {}", solve_2(&plays)); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_1() { + let input_text = include_str!("../test_input.txt"); + + let (_, plays) = parse_input(input_text).unwrap(); + + assert_eq!(solve_1(&plays), 6440); + } + + #[test] + fn test_2() { + let input_text = include_str!("../test_input.txt"); + + let (_, plays) = parse_input(input_text).unwrap(); + + assert_eq!(solve_2(&plays), 5905); + } +} diff --git a/advent_of_code/2023/7/test_input.txt b/advent_of_code/2023/7/test_input.txt new file mode 100644 index 0000000..bf2815e --- /dev/null +++ b/advent_of_code/2023/7/test_input.txt @@ -0,0 +1,5 @@ +32T3K 765 +T55J5 684 +KK677 28 +KTJJT 220 +QQQJA 483 \ No newline at end of file