diff options
author | Gard Spreemann <gspr@nonempty.org> | 2023-12-08 23:32:52 +0100 |
---|---|---|
committer | Gard Spreemann <gspr@nonempty.org> | 2023-12-08 23:32:52 +0100 |
commit | db1ce6683394136e68c53dfaa3da3ab2d71f1b3f (patch) | |
tree | 91376242e93e82b800e889e28a9c6c30c70ed0b3 | |
parent | e97783c8162302ed4cb5359f44715c22ff138c96 (diff) |
Day 7, part 1
-rw-r--r-- | 07/Cargo.toml | 14 | ||||
-rw-r--r-- | 07/input.txt | 1000 | ||||
-rw-r--r-- | 07/src/part-1.rs | 33 | ||||
-rw-r--r-- | 07/src/stuff.rs | 177 | ||||
-rw-r--r-- | 07/test.txt | 5 |
5 files changed, 1229 insertions, 0 deletions
diff --git a/07/Cargo.toml b/07/Cargo.toml new file mode 100644 index 0000000..8455c36 --- /dev/null +++ b/07/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "day-07" +version = "0.1.0" +edition = "2021" + +[[bin]] +name = "part-1" +path = "src/part-1.rs" + +#[[bin]] +#name = "part-2" +#path = "src/part-2.rs" + +[dependencies] diff --git a/07/input.txt b/07/input.txt new file mode 100644 index 0000000..10a5115 --- /dev/null +++ b/07/input.txt @@ -0,0 +1,1000 @@ +Q4QKK 465 +28555 580 +JJQK2 602 +84448 722 +7QQ7Q 734 +KKKAK 278 +JQ274 574 +9J242 805 +A33AK 619 +TAK9T 659 +34QK8 514 +23273 199 +T8TT8 318 +333TT 101 +5A955 482 +TT5KJ 784 +59K37 126 +T59TQ 890 +3K549 806 +37QQ3 655 +TJ5T4 958 +8Q7KQ 148 +888AT 868 +4KKKA 67 +QQQ8Q 520 +555Q5 325 +8T4K2 132 +K32Q5 399 +QQ455 937 +55QQQ 592 +63T89 220 +434Q4 254 +88KK8 944 +79799 793 +KJKKK 725 +99J59 70 +73777 788 +5892A 641 +J8JJJ 26 +76676 336 +55T5T 354 +5755T 431 +22299 746 +82462 803 +3J63J 408 +95999 711 +Q59K6 511 +QKJK4 977 +QQKK9 606 +QQ9Q9 47 +A2TQ5 214 +68A88 281 +TQA64 453 +T4633 648 +95959 53 +23377 293 +39993 844 +8QTT8 974 +95655 10 +AAQ4Q 773 +69243 213 +44244 953 +6297T 850 +KAAK4 443 +Q77J2 865 +J4A3A 651 +3Q7Q7 163 +9A28T 129 +J2277 68 +AAAAT 568 +T33TT 907 +KA3Q9 942 +67787 21 +9TAJA 751 +K6KKK 485 +5T4J5 900 +3TKTK 207 +4KQQ4 961 +TTQ4T 613 +K6TQ4 906 +A8K8Q 965 +63QJ5 807 +597Q7 634 +64664 723 +63479 505 +JQQ7Q 870 +JT888 185 +7JTQ8 650 +9888J 7 +6646T 405 +9J66J 140 +2JT22 194 +K5KKK 361 +T7T79 274 +33535 758 +27638 314 +99699 49 +K2QQQ 351 +2K72K 92 +J63KK 702 +J7KT5 795 +J6KJ5 770 +97K99 928 +K376Q 139 +882AT 34 +KK8K8 995 +98AQA 894 +5928Q 364 +AA6A5 633 +T96Q4 249 +96696 567 +AQ9A5 855 +Q6Q44 335 +6K2A8 763 +7665Q 295 +J7364 89 +88848 875 +285K3 623 +6932T 735 +999T6 484 +77888 903 +J8888 261 +324A2 610 +Q6Q53 662 +83QTQ 499 +J6666 256 +5Q5Q2 507 +T6A4K 787 +J5AT5 210 +AQ39Q 400 +8K6K2 331 +J3Q44 280 +KK8KK 926 +66784 923 +87K88 142 +7J235 445 +4QQ44 676 +84KKK 30 +65J56 169 +3AA3A 631 +QTQ4Q 760 +A5A5J 342 +5QT5T 674 +9K549 776 +T2232 343 +96Q66 616 +8J899 597 +J76A6 116 +77388 321 +53333 433 +KK797 394 +9J53Q 545 +5K9KK 985 +66868 874 +J6T63 654 +9A333 696 +678JJ 738 +AATAT 812 +AAT6J 801 +JTTQK 441 +75757 993 +JQ4QQ 523 +222JJ 671 +Q5552 459 +944J9 133 +69A8A 588 +A75K6 872 +KKK44 661 +2K43Q 83 +3KKKK 350 +47773 887 +35858 710 +K65T9 731 +ATQ8J 496 +8K484 397 +TT9QT 157 +2J332 630 +5K3K4 743 +68J26 135 +555J5 975 +K4KQT 452 +QAAAA 884 +8J4J9 398 +4TJ77 679 +55585 93 +J9A4T 182 +42942 503 +5JK2A 151 +2T2K7 672 +4Q2T5 563 +22422 291 +28868 947 +KT7KK 759 +JQQ88 31 +8273K 54 +55588 418 +5K28K 849 +2Q279 896 +65995 590 +723A4 598 +6KA74 127 +KK333 284 +44696 714 +777Q7 277 +K469A 673 +433QJ 862 +A4442 512 +66624 665 +8AA88 536 +7777J 268 +A7575 586 +7K42Q 789 +6A32A 159 +T97Q6 218 +KJA5J 108 +363AJ 510 +4JAT7 960 +88898 534 +2Q2J7 383 +57A9T 852 +TJ9TQ 750 +9T748 775 +QTA83 13 +4KK5K 701 +Q8482 72 +66655 109 +6TTTT 381 +A33JA 779 +62AAA 968 +3KA2Q 924 +2J54A 444 +6A285 886 +63697 595 +459QA 134 +JK5KQ 41 +34628 231 +94544 446 +K6JK6 824 +KKTT6 815 +22229 327 +88TT8 916 +K6J56 2 +T7A73 945 +2J222 555 +727T2 106 +K5664 390 +KJ77Q 326 +555A5 272 +55757 943 +33447 128 +4A37Q 462 +7JJ2T 609 +5T2T5 920 +49932 219 +9J297 221 +QK2J2 332 +J23KK 745 +8A5K4 854 +374K5 371 +35Q7T 663 +666T6 721 +9K9Q3 842 +J55J2 73 +AT6AA 969 +2TAQK 689 +KQ9QQ 486 +99KJ9 996 +4894Q 774 +T9J8Q 61 +TK6T6 488 +7777K 226 +77767 922 +K5QK8 12 +45444 740 +4A448 752 +A8793 426 +3393J 771 +7JTTT 830 +434J9 938 +66656 470 +6JJ66 333 +444J4 170 +33JJJ 800 +Q2K79 467 +254JK 757 +9994Q 186 +94499 804 +J86K6 908 +J8K8K 946 +4276T 164 +K9QAA 695 +779AT 519 +7K463 660 +55454 208 +KK8K9 339 +QJJK9 146 +6K3J6 538 +38T79 732 +6QQ6Q 474 +Q8J4K 299 +99T99 475 +3JK42 87 +T8Q8J 107 +Q4QQK 682 +3J333 811 +54662 744 +JJ4J2 972 +2QA87 473 +249TK 51 +65JA9 251 +AAA6A 871 +QTT73 222 +44J45 670 +47747 3 +2T299 604 +9A922 122 +4T428 359 +4744T 814 +944QQ 532 +28JA8 522 +JJJJJ 230 +88432 910 +K6TAJ 315 +K7AA3 544 +6729J 600 +95QQQ 300 +T7J77 976 +J448T 587 +72J58 412 +T8888 168 +83333 450 +98Q9T 298 +5249Q 352 +58656 558 +347JA 579 +27222 893 +4QK82 131 +5TTT8 994 +43494 454 +474TT 458 +22338 728 +77AJ8 562 +86633 410 +Q7J5A 501 +955J2 242 +QQQ79 835 +ATAQT 525 +A5AAA 178 +39287 289 +KTKQK 845 +364K2 449 +AK3A2 259 +627J2 138 +K8K82 285 +66669 794 +6Q2TA 911 +TTJTJ 24 +KKK33 997 +QKKQK 372 +3K7QQ 264 +62994 175 +3T244 227 +Q77K7 14 +88568 44 +8JT98 404 +7277Q 250 +66555 529 +2KJK2 709 +94T85 263 +T6652 313 +53555 113 +J5T88 432 +Q6949 624 +TKTA8 202 +96667 748 +4AAAA 491 +4A4K4 329 +6252K 998 +4Q269 347 +Q3QQ3 95 +488J6 262 +99J9Q 100 +82T77 591 +35T22 362 +Q7KQQ 691 +A56A5 22 +649Q4 898 +53J22 301 +J4Q5Q 569 +585QJ 81 +82528 495 +K6TTT 32 +Q2222 737 +2Q5T5 990 +Q888Q 341 +8Q866 416 +4449A 508 +88KQQ 819 +AA274 879 +K8Q88 160 +26TK5 237 +JJQQQ 492 +K52QA 490 +JJ974 223 +7T846 136 +32236 820 +9AJ9A 239 +J6QQQ 380 +97Q94 970 +56552 856 +6QQTQ 905 +JJ5AA 837 +K9TT9 103 +8A9TA 267 +J8AA4 196 +2ATAQ 897 +JQTJQ 279 +TTT2T 699 +T2TJ2 966 +JJ5J5 294 +J4K4K 60 +63KKK 768 +AAAA7 38 +K4J44 502 +23493 888 +666KK 831 +TAQ58 434 +AK75T 319 +565A8 769 +58K88 705 +97579 506 +TTQTT 120 +5QQJ8 77 +55KJ5 328 +Q6T3T 375 +KQ9T6 476 +9K777 305 +TT5TT 581 +5557K 955 +69869 91 +Q6925 367 +9624J 530 +9A9A2 550 +5854J 71 +T588T 857 +74QA4 1 +5TJ83 956 +T797J 413 +T6534 935 +T93T3 162 +7A488 859 +737A3 19 +72877 195 +3QAAA 78 +44449 927 +77792 420 +43227 537 +K986T 84 +3J444 754 +83AA5 436 +89T55 553 +86JT6 603 +J22JT 461 +KQ8QQ 309 +82292 43 +J6QQA 211 +T986J 62 +38383 382 +4AQ6Q 614 +2223J 42 +8T36A 435 +JTTAT 66 +44QJQ 829 +9TTTT 236 +JAJ4A 959 +4QJ4J 621 +34333 235 +Q2Q79 245 +Q2A22 388 +QQ44Q 635 +58A54 539 +26A87 440 +727A9 149 +J33Q6 406 +6479T 627 +KK66K 419 +3333T 664 +KK9KK 317 +J2Q2Q 306 +K5K5K 201 +44224 63 +6644J 322 +QQQ3J 96 +A4AK4 212 +K46JQ 557 +J656J 608 +JAJAA 584 +K5KK8 615 +AAAA2 889 +T6T66 478 +QQTJ3 494 +5QQ75 16 +492QJ 909 +JKK9K 411 +346KQ 144 +J27A7 403 +88QQ4 707 +T6579 866 +TT669 358 +TKT84 847 +QAJQ4 848 +9J9JA 229 +3443A 479 +455J3 154 +43QQ3 762 +A9449 246 +JK666 417 +5588J 448 +5KAQ3 427 +62A47 58 +K4Q74 632 +9999Q 468 +37537 785 +8KT74 166 +K93Q2 428 +2QQ5Q 688 +A6A22 873 +5986A 424 +74T36 677 +J3958 46 +4J4Q4 451 +64654 863 +58TK3 409 +JK6KJ 348 +Q8QQJ 666 +QQQ53 35 +JAK28 839 +6KKJK 713 +23567 792 +QQ5QQ 147 +J9447 582 +77QQ7 963 +4T84K 204 +44747 583 +K858Q 307 +76J5A 542 +A57Q8 180 +22262 252 +7J689 105 +44844 836 +76674 23 +7A22A 29 +7JT56 570 +7857J 456 +9Q685 215 +83878 190 +277A7 172 +T5T5T 500 +64464 477 +4T445 65 +A43Q9 152 +JT5J7 310 +TTK55 715 +7K85J 365 +4A4AA 98 +Q68QJ 952 +6T266 929 +2442T 629 +6A776 119 +Q57K2 369 +555JJ 187 +525TJ 438 +Q99K7 980 +Q9888 657 +85854 967 +QK85T 930 +332A3 667 +QJQQQ 243 +AAAA3 121 +44TQT 270 +K35T6 637 +TJ7Q7 559 +TJT85 797 +J6J25 853 +J6348 593 +7T6T7 498 +J222Q 877 +Q4QQQ 112 +Q93KQ 117 +48934 258 +44465 817 +AA66A 253 +TJTT2 167 +K67QK 384 +T2292 430 +77337 344 +T99J8 192 +334J4 982 +2J939 833 +23229 353 +TJ6Q5 912 +36T8K 755 +2822J 535 +48446 5 +A8QA5 988 +4J464 130 +K9K88 694 +A4777 266 +888T9 17 +33QQ3 639 +67868 643 +T78T7 248 +6382Q 577 +444Q7 596 +2222K 981 +99KK4 288 +TJ4T4 575 +QTJTT 99 +33QAA 97 +525J5 189 +24QQ3 864 +8465J 936 +T48KA 571 +JT9TT 255 +6Q6J8 517 +24999 387 +TKAQJ 687 +93944 914 +JT4Q3 158 +T76QT 481 +48T9Q 225 +JJA6J 141 +95555 549 +4JK37 686 +62662 197 +68QA7 566 +J3742 747 +J8K9K 287 +QJ4J3 638 +AAKKK 607 +72A6T 948 +JK2KK 878 +67337 978 +TT8TT 895 +A8A8A 181 +4K977 939 +K44AQ 102 +5T264 33 +54TQK 183 +6K666 340 +KT9KK 366 +3QQ9Q 742 +5K829 311 +2KK77 576 +67A9Q 589 +J4A5Q 712 +8ATTJ 345 +KK339 9 +774J9 698 +69996 652 +KQQKQ 548 +43339 188 +J6585 681 +62253 979 +99J47 8 +32522 425 +K43KQ 115 +33Q33 483 +55AA5 636 +48Q54 973 +Q55QJ 184 +9TTQ9 203 +3J733 546 +339JJ 556 +J62J2 48 +JT4Q5 780 +99AA9 25 +KKJQJ 275 +75A42 273 +QKTJ5 232 +4JJ4T 808 +7647K 786 +22522 876 +76737 599 +J8858 217 +9Q45T 153 +8JT2K 493 +26634 913 +7QJTA 302 +KK998 645 +49TT8 840 +T22T6 904 +9AK2A 899 +3TQ7J 304 +3A48Q 376 +33TTJ 720 +246A6 983 +9TJ32 224 +35343 605 +J4AQA 269 +332T8 692 +KK9K9 949 +87KJ8 917 +56KK8 303 +76K52 933 +AAJA2 82 +38339 915 +J2299 391 +677J7 826 +A22TA 316 +69J6T 123 +9JJ99 437 +J5624 730 +Q7QT7 292 +5Q9QJ 547 +K876J 541 +7JJ44 377 +K2435 901 +TK64T 228 +8878J 902 +99989 193 +222TT 708 +QQ88Q 813 +59294 668 +TKTKJ 50 +KQ893 932 +3557T 265 +7A396 110 +Q8888 85 +36663 447 +87A99 818 +7442J 37 +TQ4T5 622 +45J7J 20 +Q6697 414 +2226Q 892 +Q7QQQ 233 +5J395 429 +22KJ6 986 +662K6 94 +J7398 783 +AQJA8 843 +78K8K 716 +Q4QTK 810 +J54J5 885 +32223 238 +97776 594 +33693 69 +47T2Q 286 +2QA52 781 +Q4J22 761 +99A6A 685 +9A999 11 +444Q4 200 +TAK95 56 +7Q363 528 +KA99J 809 +QQTQQ 991 +2KAK2 4 +599K8 28 +TT27T 717 +22525 165 +78222 349 +A6667 838 +3Q39T 393 +87868 741 +8AAJK 513 +TQ555 543 +79777 925 +866J6 560 +72788 931 +23TTT 374 +AA66T 772 +K75K4 356 +J6JKJ 509 +K3K4J 891 +44443 276 +K8A88 611 +8483A 753 +KKKJJ 312 +AA6JA 463 +K9TKT 704 +JTT66 296 +6A987 869 +22232 951 +7K9A7 385 +K2223 987 +Q24AJ 554 +766J8 240 +8Q9JA 114 +7AKJ9 736 +QQ9QQ 851 +28AA2 124 +3939K 179 +3K284 324 +94K3J 964 +63333 883 +89J45 143 +8J2T2 471 +TT5QK 719 +JKQKQ 823 +A2898 407 +4AK94 565 +K889J 260 +8KQQT 950 +59K59 104 +AA7TA 487 +36666 308 +T64TJ 573 +6864J 626 +6Q4QQ 703 +AAQA4 75 +9KJ9Q 649 +26J22 257 +99889 989 +KJTTT 881 +83TK9 79 +82828 765 +KKQK6 552 +J5JQQ 683 +A9A98 457 +KKK2K 290 +49999 464 +64QTJ 706 +88Q7Q 55 +23233 118 +37333 739 +QTQTT 378 +AT8T7 767 +A687A 421 +9A63T 15 +325J9 749 +K7966 921 +AAAKK 489 +29829 675 +7377A 455 +KJ3KK 57 +4QT2K 36 +J7384 718 +K3K77 656 +Q4J85 442 +53AK9 39 +53782 766 +Q4545 572 +522TJ 330 +J4J42 472 +JA56A 497 +64534 137 +4J322 27 +57777 111 +TT338 828 +44J4J 984 +8AAAA 612 +J7Q25 821 +Q7J57 368 +88289 415 +888JJ 646 +36833 727 +T9TT2 271 +44A88 802 +K33J2 155 +Q3TQT 59 +AK755 524 +3J3J2 346 +AJ3TA 941 +9635K 357 +499JJ 234 +Q8884 337 +J8QJ8 678 +3333A 860 +TT775 480 +AATAQ 882 +5QQAA 247 +95833 80 +3TTQ8 690 +T32TJ 934 +QAQQ6 370 +A9998 684 +KTJ37 585 +52JKJ 320 +879A8 640 +7KJ77 161 +9QQAA 216 +32J6T 373 +389A5 76 +T988T 282 +86865 518 +45K45 578 +8288T 796 +96524 297 +78J55 625 +QJQKT 954 +J4353 334 +37KAJ 86 +4J9TQ 401 +Q674K 940 +QQKQQ 617 +A2356 460 +2A38K 825 +Q3TQ2 45 +57AJ3 790 +3A7J7 841 +A43A4 669 +24AJ3 653 +68666 466 +33793 88 +9J999 439 +5J577 389 +9Q7J6 173 +Q5T8T 540 +A7AT7 531 +T99TT 206 +565A5 858 +7935J 561 +A593Q 861 +898A9 18 +A8887 392 +424J2 40 +36336 867 +7J577 205 +5JJ43 386 +TTTTJ 693 +QT624 628 +A7TT7 832 +K44K5 150 +3J35Q 198 +9T29A 726 +KK5J7 423 +AAJAT 396 +37J7K 764 +7TTT7 971 +7K63A 647 +TT66T 515 +4644A 798 +TJ944 177 +2J6K9 323 +47674 880 +AAJAA 379 +86884 74 +6J366 64 +ATQ2T 469 +7J9QK 680 +TATT7 782 +Q7QQ4 52 +52555 816 +AA9A5 156 +K2K8T 283 +278J8 724 +95Q55 360 +3K332 516 +7Q5A3 125 +TAATT 733 +2K44K 363 +58K74 601 +7J77J 919 +4474J 191 +7T4JJ 521 +22A6K 620 +33T3J 244 +JTAJT 551 +879Q5 338 +67324 1000 +JJ333 918 +887AA 957 +QTAKK 504 +22A22 999 +A336A 700 +4J93T 729 +K5555 992 +QTTAJ 846 +QT59A 791 +42J4A 145 +JKK9T 526 +JA887 658 +J2255 618 +JQJ3Q 6 +6A4JT 176 +683J8 171 +A66Q6 533 +Q268J 527 +8Q2K9 241 +792T2 778 +QJJQA 402 +AAT24 827 +A75AA 697 +99444 209 +AKA99 799 +77667 777 +52275 962 +7688K 422 +72689 174 +99929 395 +TJ444 642 +22Q2Q 90 +AJ447 834 +58545 564 +JT5J4 756 +86888 822 +9A563 644 +666QQ 355 diff --git a/07/src/part-1.rs b/07/src/part-1.rs new file mode 100644 index 0000000..920bae2 --- /dev/null +++ b/07/src/part-1.rs @@ -0,0 +1,33 @@ +mod stuff; + +use crate::stuff::{ascii_to_u64, read_helper, Card, Hand}; + + +fn main() { + let mut stdin = std::io::stdin().lock(); + + let mut buf: Vec<u8> = Vec::new(); + let mut hands: Vec<(Hand, u64)> = Vec::new(); + + loop { + let num_bytes = read_helper(&mut stdin, &mut buf, b' ').expect("IO error"); + if num_bytes == 0 { break; } + let cards: [Card; 5] = std::array::from_fn(|i| Card::try_from(buf[i]).expect("Malformed input")); + let hand = Hand::new(cards); + + let num_bytes = read_helper(&mut stdin, &mut buf, b'\n').expect("IO error"); + if num_bytes == 0 { panic!("Malformed input"); } + let bid: u64 = ascii_to_u64(& buf); + + hands.push((hand, bid)); + } + + hands.sort_unstable_by(|(h1, _), (h2, _)| h1.cmp(h2)); + + let result: u64 = hands.into_iter() + .zip(1_u64..) + .map(|((_, bid), rank)| rank*bid) + .sum(); + + println!("{}", result); +} diff --git a/07/src/stuff.rs b/07/src/stuff.rs new file mode 100644 index 0000000..25ee3ff --- /dev/null +++ b/07/src/stuff.rs @@ -0,0 +1,177 @@ +use std::io::{BufRead}; + +pub const NUM_CARDS: u8 = 13; + +pub fn ascii_to_u64(s: & [u8]) -> u64 { + #[cfg(debug_assertions)] + { + assert!(s.into_iter().all(|& c| c.is_ascii_digit()), "Not an ASCII base-10 number"); + } + + // SAFETY: AoC is ASCII-only. + unsafe { std::str::from_utf8_unchecked(s) }.parse().unwrap() +} + +pub fn read_helper<'a, 'b, R: BufRead>(r: &'a mut R, buf: &'b mut Vec<u8>, token: u8) -> std::io::Result<usize> { + buf.clear(); + let num_bytes = r.read_until(token, buf)?; + if buf.last() == Some(& token) { buf.pop(); } + Ok(num_bytes) +} + +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub enum Card { + A, K, Q, J, T, + Nine, Eight, Seven, Six, Five, Four, Three, Two +} + +impl Card { + fn key(self: & Self) -> usize { + usize::from(self.value() - 2) + } + + pub fn value(self: & Self) -> u8 { + match self { + Self::Two => 2, + Self::Three => 3, + Self::Four => 4, + Self::Five => 5, + Self::Six => 6, + Self::Seven => 7, + Self::Eight => 8, + Self::Nine => 9, + Self::T => 10, + Self::J => 11, + Self::Q => 12, + Self::K => 13, + Self::A => 14 + } + } +} + +impl TryFrom<u8> for Card { + type Error = &'static str; + + fn try_from(c: u8) -> Result<Self, Self::Error> { + match c { + b'A' => Ok(Self::A), + b'K' => Ok(Self::K), + b'Q' => Ok(Self::Q), + b'J' => Ok(Self::J), + b'T' => Ok(Self::T), + b'9' => Ok(Self::Nine), + b'8' => Ok(Self::Eight), + b'7' => Ok(Self::Seven), + b'6' => Ok(Self::Six), + b'5' => Ok(Self::Five), + b'4' => Ok(Self::Four), + b'3' => Ok(Self::Three), + b'2' => Ok(Self::Two), + _ => Err("ASCII character not a valid card") + } + } +} + +impl PartialOrd for Card { + fn partial_cmp(self: & Self, other: & Self) -> Option<core::cmp::Ordering> { + self.value().partial_cmp(& other.value()) + } +} + +impl Ord for Card { + fn cmp(self: & Self, other: & Self) -> core::cmp::Ordering { + self.value().cmp(& other.value()) + } +} + +#[derive(Debug, Eq, PartialEq)] +pub struct Hand { + cards: [Card; 5], + histogram: [u8; NUM_CARDS as usize] +} + +impl Hand { + fn count(self: & Self, card: Card) -> u8 { + self.histogram[card.key()] + } + + pub fn new(cards: [Card; 5]) -> Self { + let mut histogram: [u8; NUM_CARDS as usize] = [0; NUM_CARDS as usize]; + for card in cards.into_iter() { + histogram[card.key()] += 1; + } + Self { cards: cards, histogram: histogram } + } + + pub fn is_n_of_a_kind(self: & Self, n: u8) -> bool { + self.histogram.into_iter().find(|& count| count == n).is_some() + } + + pub fn is_full_house(self: & Self) -> bool { + self.is_n_of_a_kind(3) && self.is_n_of_a_kind(2) + } + + pub fn is_two_pairs(self: & Self) -> bool { + self.histogram.into_iter() + .position(|count| count == 2) + .and_then(|i| (& self.histogram[i+1..]).into_iter() + .position(|& count| count == 2)) + .is_some() + } + + pub fn strength(self: & Self) -> u8 { + if self.is_n_of_a_kind(5) { 6 } + else if self.is_n_of_a_kind(4) { 5 } + else if self.is_full_house() { 4 } + else if self.is_n_of_a_kind(3) { 3 } + else if self.is_two_pairs() { 2 } + else if self.is_n_of_a_kind(2) { 1 } + else { 0 } + } +} + +impl PartialOrd for Hand { + fn partial_cmp(self: & Self, other: & Self) -> Option<core::cmp::Ordering> { + let strength_ord = self.strength().cmp(& other.strength()); + if strength_ord == core::cmp::Ordering::Equal { + Some(self.cards.cmp(& other.cards)) + } + else { + Some(strength_ord) + } + } +} + +impl Ord for Hand { + fn cmp(self: & Self, other: & Self) -> core::cmp::Ordering { + let strength_ord = self.strength().cmp(& other.strength()); + if strength_ord == core::cmp::Ordering::Equal { + self.cards.cmp(& other.cards) + } + else { + strength_ord + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_1() { + let hand_1 = Hand::new([Card::Five, Card::Q, Card::Q, Card::Seven, Card::Five]); + let hand_2 = Hand::new([Card::Q, Card::Q, Card::T, Card::J, Card::Three]); + assert_eq!(hand_1.cmp(& hand_2), core::cmp::Ordering::Greater); + } + + #[test] + fn two_pairs() { + assert!(Hand::new([Card::Five, Card::Q, Card::Q, Card::Seven, Card::Five]).is_two_pairs()); + } + + #[test] + fn two_pairs_2() { + assert!(Hand::new([Card::Three, Card::Three, Card::Four, Card::Four, Card::Seven]).is_two_pairs()); + } +} diff --git a/07/test.txt b/07/test.txt new file mode 100644 index 0000000..e3500c3 --- /dev/null +++ b/07/test.txt @@ -0,0 +1,5 @@ +32T3K 765 +T55J5 684 +KK677 28 +KTJJT 220 +QQQJA 483 |