diff --git a/input/day07.txt b/input/day07.txt new file mode 100644 index 0000000..02477b7 --- /dev/null +++ b/input/day07.txt @@ -0,0 +1,1000 @@ +AT777 727 +7QT8A 998 +95925 783 +JK7T3 899 +JQ99A 970 +Q8AJQ 630 +44493 399 +TT47T 671 +88846 921 +7K7K7 279 +2K2KA 477 +2282J 277 +5QT64 886 +92J9J 80 +99987 929 +72333 958 +QA884 555 +8999J 850 +6KK6A 940 +TT22T 814 +TQTTT 681 +2A5KT 746 +K5K9K 239 +77828 964 +76A24 915 +9KKKK 379 +9KJK4 720 +2T87K 298 +TT7T3 655 +3Q7QK 96 +33739 265 +TT8TQ 270 +6QJQ9 44 +48QA6 610 +93399 328 +J38A6 362 +59Q57 79 +AQ456 949 +82AQA 857 +3333J 759 +5Q298 177 +9Q9Q9 721 +QQ55J 490 +24263 593 +Q4555 608 +K96K4 151 +644JK 354 +8J9KJ 62 +55A22 340 +TK38J 293 +K9774 64 +95229 518 +A8435 460 +9TT3T 629 +725AA 706 +4A4A4 950 +4QAK6 991 +A222K 393 +Q447J 112 +2Q223 108 +2KQKQ 865 +9JKKJ 197 +K8KKK 131 +Q6T96 471 +JT6T2 549 +4AA4J 572 +22Q24 740 +54367 333 +4KK4K 152 +94422 363 +77JQQ 413 +8A6J6 359 +76Q66 601 +KK77K 81 +88J99 419 +K62JA 897 +22J2J 370 +222A2 12 +34983 695 +6TKJT 384 +9763T 938 +5QK37 21 +3JK3Q 909 +37A33 113 +A6AQA 182 +2T222 213 +Q84KK 1 +AQT4T 660 +96696 777 +9JA54 162 +KQA2T 139 +333J5 903 +79654 786 +QAQ3A 734 +T888T 576 +28825 838 +JAAJA 312 +9955K 148 +K4JQT 132 +7J784 314 +ATAAA 784 +255Q4 930 +6699J 956 +45447 858 +88828 757 +J9594 267 +KKJK9 205 +527JA 848 +65A56 751 +QQJ88 533 +86Q97 331 +JT4Q8 846 +84258 707 +AAAA2 718 +AA769 808 +64KTJ 421 +QK637 574 +84KJ4 300 +88848 153 +T3TTQ 563 +443Q4 943 +T5T6T 632 +JA8A9 866 +424KK 932 +53555 58 +7Q737 794 +QJ3Q2 155 +JKA37 795 +AQQA4 609 +829J3 296 +7T46A 502 +855A5 802 +JQQ9Q 845 +55877 455 +224Q4 102 +35355 647 +QA6QA 564 +J4222 90 +85835 137 +5737K 36 +QQQ6Q 869 +77479 93 +85K55 622 +A3T77 754 +A5AAA 859 +JKKJK 824 +9K85T 100 +44785 444 +T262T 377 +QQJQ7 348 +22323 46 +6AKAA 585 +J5K66 39 +22244 454 +T8252 436 +75Q83 114 +K5Q26 4 +A9KAK 926 +6QAJK 369 +7778J 160 +37J55 860 +ATJ63 452 +97QQQ 542 +KTTTA 358 +9444T 731 +86J3Q 763 +73A75 725 +3AA3A 772 +68379 828 +A896T 284 +Q55QK 883 +JAAAA 8 +A67Q2 426 +33393 360 +JQT39 407 +9QJA5 667 +2A78A 631 +7J777 318 +9T949 592 +7AK88 361 +A997A 904 +99TJ4 37 +37377 513 +33K3K 928 +QAJQQ 640 +TK6KT 15 +4953T 780 +9TT9T 558 +3KJK4 174 +3J975 800 +353Q3 636 +88998 826 +65663 10 +5Q355 790 +545QQ 398 +J99A9 166 +7A7TT 690 +92T98 486 +28J88 191 +5A557 353 +99T99 605 +TTAA4 679 +4JT75 143 +36TJ7 591 +77T7J 881 +7JTQQ 990 +352T8 289 +9999J 642 +J555Q 561 +3A4J9 801 +4J5A5 22 +8J8KT 82 +7J667 953 +JJ553 526 +KT2K2 821 +88J88 343 +22474 285 +6A67A 94 +54354 56 +K3Q2Q 199 +4444K 169 +QKQKQ 432 +4KQ78 401 +T6A6J 465 +4999J 906 +A6A93 997 +55377 775 +J5553 901 +A3A53 19 +K6AA6 600 +AJ99A 257 +552T5 32 +55Q56 306 +TTKK2 520 +QQQQ5 185 +3877Q 150 +KA3T7 498 +6466J 449 +Q7759 594 +TTATT 77 +TTKTT 149 +52555 861 +99QQJ 299 +84468 625 +45433 159 +TT666 339 +Q589K 962 +2363K 587 +8J793 543 +K33AK 337 +22K2K 193 +99669 536 +AA666 68 +K5K5K 787 +444J4 588 +9A899 971 +QTTKQ 439 +2KQ5T 430 +T9T49 411 +344K5 822 +5T58T 724 +QQQ2Q 666 +3348K 375 +QAJQA 837 +A475A 415 +K324A 390 +5555J 933 +75525 31 +J6TTT 483 +829QA 807 +J7KQJ 584 +Q2Q34 127 +TTT5T 283 +3J633 17 +3A737 659 +5255Q 761 +3QKJ9 319 +7K7QK 689 +43844 559 +Q77QQ 804 +65454 202 +9QQ8K 286 +2888Q 580 +KA848 135 +6TT55 75 +38K38 656 +AA72A 429 +4J445 51 +49447 809 +576J6 234 +K965K 566 +555A5 357 +22282 321 +T663T 491 +6AAAT 59 +8J8A8 726 +99TKT 730 +73322 386 +446J9 222 +99979 652 +4958T 248 +AATKT 404 +58J55 245 +3477A 388 +JA33A 696 +33Q33 45 +24Q65 138 +Q66J2 554 +7779K 844 +T223T 538 +85K96 627 +53J99 194 +T76JJ 247 +43TK8 988 +KKJ28 769 +KK4K6 639 +AAATQ 701 +5682Q 553 +QQAKQ 994 +QA2QQ 20 +33332 128 +KJKK2 907 +TAJ48 612 +AATQ6 72 +55852 842 +QTTQQ 877 +J52A8 66 +QAA4A 494 +6J9A6 979 +68686 747 +K344Q 672 +K85A9 134 +897A7 852 +49559 569 +38J8T 487 +J3424 715 +3887J 570 +94939 799 +58588 13 +776T7 597 +7Q855 261 +9762T 53 +6774Q 527 +QTJQ3 372 +5JJ22 141 +KKKAA 571 +K7555 119 +K6K6K 525 +Q555Q 121 +83QT2 972 +QQQK2 482 +A4542 673 +23K64 974 +99J9J 16 +3K265 251 +QT93T 254 +A587K 442 +4J334 224 +AJA6A 324 +Q789A 957 +35QT7 552 +2T33T 76 +293JQ 999 +37535 297 +64774 249 +A38T4 524 +3Q6T7 253 +494Q9 665 +4Q9Q3 544 +7Q662 756 +28868 457 +A738J 745 +3652A 186 +KKK7A 303 +TTKTK 329 +5A6K4 104 +A56T9 403 +872T8 519 +99T8T 336 +AAKJT 628 +4T44T 836 +AKAKA 42 +3Q67J 397 +36734 230 +AT9TA 968 +29253 317 +3K76A 27 +K4JA6 551 +K92K9 78 +52TJJ 614 +AJA88 692 +T8J8T 955 +T7TT9 654 +9255J 776 +28855 500 +776J7 813 +79A77 616 +3939J 305 +T8857 505 +9T233 517 +KK2KK 986 +985J3 48 +A777A 165 +9QQ82 770 +3A997 700 +66776 262 +A56T2 238 +5555K 653 +42647 325 +K86TT 33 +9393K 764 +98A8Q 540 +A2KJT 509 +9T9JT 85 +J7995 338 +3Q2QQ 650 +2QQQ7 896 +59K5A 641 +8J979 719 +88J3J 57 +4QKAT 98 +J935A 758 +77577 722 +9AAA9 615 +QQJJQ 892 +55T55 451 +ATAJ5 456 +TT6K6 290 +T6TJA 810 +9T99T 352 +Q5T82 3 +57K36 607 +7736Q 440 +8K983 557 +JA4QA 793 +Q66QQ 743 +A9AQQ 895 +88A88 461 +J834T 475 +T7797 749 +39998 638 +4AQ3T 963 +7A592 973 +A699J 935 +KKTK8 993 +4444A 762 +T6QJQ 427 +28J3T 985 +38K3Q 503 +77755 595 +923QQ 414 +7Q6Q7 863 +AAQAA 678 +K7KKQ 263 +99929 229 +66TQ6 890 +8TATA 507 +987TT 5 +KQKKK 107 +75A66 63 +3KKKK 1000 +3J26Q 684 +6776T 402 +6A922 366 +3T334 129 +4TKKK 237 +KKK24 603 +6AT2Q 511 +QQA8Q 748 +33K33 392 +9J927 86 +6J3KJ 586 +65J98 714 +26669 712 +4AJ89 646 +Q3QT3 545 +8J5Q5 206 +92995 606 +35QK3 462 +36TQJ 323 +TTT2T 733 +4A847 876 +66AAJ 211 +4KK44 870 +AA77A 782 +384K9 445 +76382 7 +63655 99 +A2758 313 +4K228 698 +K5355 207 +A6388 894 +63268 853 +JAAQA 136 +3Q223 670 +7JJA2 164 +QJQK5 728 +5JAA5 753 +8JK83 983 +QQQQJ 223 +22922 713 +68888 766 +AAA7A 531 +A4352 996 +88787 816 +77637 568 +K82Q9 739 +QAK48 781 +42J2A 124 +J5J72 773 +TJT79 110 +86868 443 +TJJTJ 49 +89J86 244 +7Q6AT 741 +AAK4T 711 +A2A5A 351 +A94JA 334 +33Q4J 266 +KJKKK 750 +88AJQ 515 +K5Q4T 130 +666T6 30 +453JJ 18 +35J53 434 +A252A 378 +A86QA 156 +AJ4KK 431 +5QA5A 944 +34J92 888 +J8866 510 +6Q9TT 179 +K2722 661 +73QJT 855 +3QQJK 982 +7Q868 144 +73877 218 +JQ2K7 493 +352QA 948 +J33J6 812 +77767 644 +9J8T5 35 +48484 276 +3T3TT 11 +AAA9J 710 +82T28 819 +87J87 833 +997JQ 458 +448KK 939 +33A33 785 +988A8 683 +62555 342 +272Q2 529 +Q9QQ9 101 +TT7T8 70 +32Q79 433 +66622 735 +99494 133 +T6K84 699 +778TT 346 +3JJAA 158 +3339J 368 +J7747 774 +924A3 934 +KK3K3 326 +33553 294 +QQ444 405 +3759Q 106 +7A8J9 468 +85388 450 +J8A34 674 +7JQ64 634 +K56AJ 648 +5K972 446 +T76KQ 28 +9Q532 523 +A469A 203 +QQ4Q4 190 +25552 188 +8K3K3 167 +45QK8 344 +588J8 613 +22444 226 +A8855 620 +JK56T 535 +AAK99 806 +KKTKA 619 +35TTT 496 +QQQ4Q 474 +J77J7 84 +4Q54Q 473 +93K33 316 +TKAJQ 210 +3KKKJ 479 +TAJ55 556 +995Q9 208 +8K23A 52 +J7755 669 +9699J 947 +JT335 736 +77QTT 103 +TT3TT 69 +86838 792 +A7777 596 +46556 662 +44744 275 +22T82 74 +A5AA5 959 +6J66A 367 +ATTK2 796 +29384 599 +KJ9T4 495 +KKTKT 992 +Q4TQK 867 +38888 521 +TTJ7T 771 +77772 117 +A35J8 854 +KKTJA 910 +KK22K 236 +79484 146 +395A8 301 +7K775 635 +7397K 965 +TT973 126 +J4449 55 +AAAAK 195 +T8365 116 +44564 891 +AAJ4A 927 +J9737 382 +4T26K 534 +79979 862 +A35AA 273 +TT5QA 347 +22777 851 +93Q9J 142 +A545A 38 +44555 878 +T727J 428 +366JA 788 +TTT44 95 +66696 425 +T333J 803 +6Q66J 441 +394J6 976 +TJQQQ 29 +93752 23 +2798J 980 +252J2 43 +33QK6 278 +5J75J 917 +TT66Q 967 +QJ4TQ 744 +JQQ5Q 435 +8T999 420 +Q77A9 246 +K8K86 856 +55585 88 +JTJTT 34 +29Q89 913 +K5A96 508 +AAQQA 470 +QQAA8 274 +4Q2A7 697 +AQAQQ 742 +55574 232 +A748K 868 +K87T9 831 +JK5KT 196 +JJJJ8 466 +JQ3JA 448 +53JA3 120 +5JK5J 484 +Q8QQ8 60 +48488 729 +4ATTT 541 +4274K 387 +2233J 355 +447K4 488 +9Q7A2 506 +26237 737 +54J43 154 +445JA 264 +J8JJ8 464 +TAT7T 252 +6Q95A 581 +87JAK 335 +27654 817 +JJ444 530 +T8JTT 288 +43AKQ 623 +975J4 307 +44484 547 +44944 240 +8J88Q 767 +24J6J 24 +32646 499 +T3724 832 +666TJ 705 +45T24 841 +7J3J4 984 +Q2KJQ 463 +5J5J5 898 +3Q3QQ 176 +46474 760 +KQKQ9 67 +942T9 818 +TAJT7 381 +43QQQ 716 +8KJKK 738 +836J6 823 +J4888 105 +9J46T 418 +KK828 175 +J6556 250 +A354J 573 +68AK9 282 +35755 937 +K343K 514 +22552 924 +AQ5K3 645 +47AAJ 966 +8Q649 830 +QJAQ5 693 +6AAAA 349 +AJAAT 140 +AA557 657 +88K8K 911 +44545 2 +5JK52 125 +98T87 161 +T55TT 702 +7Q767 73 +6KQ64 611 +AQJQK 380 +39947 171 +JAQK4 241 +T2T22 231 +23222 271 +44743 201 +AAAA8 424 +74835 952 +KKKTK 908 +TT377 214 +TTK44 111 +J78J4 579 +49QJ3 923 +6K2Q3 269 +K55J5 717 +27J7A 682 +J2KQ8 893 +84Q26 578 +22325 512 +T67K3 322 +39368 840 +6T2K8 765 +9943J 178 +KQ3JK 308 +88QQ8 522 +TTJTT 687 +4TA4Q 118 +TTKK7 834 +KKJTT 889 +75755 677 +558J2 453 +QQ5T5 220 +7J2Q3 87 +4QQTQ 459 +4466T 243 +TTA8T 686 +5255J 811 +K2555 385 +54795 575 +66646 624 +4JKK6 548 +49A4J 902 +A2TT7 330 +273TA 885 +8A928 847 +95555 216 +3J733 768 +J99T9 900 +48J48 310 +TT2T5 791 +T8TT6 691 +KT4TK 637 +AAK7A 916 +8A2AA 987 +92T22 280 +ATATA 258 +KQ9QQ 981 +7378T 472 +T7TJ7 590 +69TQ9 172 +6J6J6 704 +A4494 147 +93A66 65 +67TTT 887 +J58Q9 374 +77773 537 +AA5A4 198 +KT33T 946 +J9J39 145 +QA888 383 +TJ229 942 +44784 26 +39QQQ 501 +58A88 778 +JATTT 89 +A7222 356 +88J86 373 +KA69J 447 +724TJ 233 +26T22 839 +72884 633 +8K3QT 170 +66667 260 +8TJ88 187 +4A7KJ 184 +A2947 685 +744A7 219 +JQKQQ 272 +T62J2 256 +4T2J3 589 +635K3 995 +2A6Q4 481 +99998 688 +TTTT4 122 +33388 304 +66Q86 582 +5K55K 189 +26479 371 +TTTJ3 295 +66K66 829 +47949 873 +645Q8 395 +6666A 504 +262A8 676 +35333 825 +7KJ73 827 +638JT 752 +86889 50 +85J6T 919 +J4TT4 602 +TT68J 123 +J2229 604 +237QA 396 +22J37 365 +6JJT8 880 +99969 560 +632T4 225 +K3K39 723 +TKT22 872 +TTQ9J 281 +6KAKK 83 +88QJT 389 +T8Q3T 423 +TTJ5T 905 +62T58 309 +7J77A 227 +34JT3 485 +6284J 492 +7KKJK 874 +42A6J 882 +28872 217 +QQ9QQ 408 +78796 550 +77799 157 +6J656 480 +5K83A 422 +8TTTT 864 +3J638 192 +3QQ5Q 621 +8TK83 115 +K99JK 598 +5J3T6 884 +3Q8KQ 61 +T55K5 989 +AA8A8 675 +33J43 320 +3674J 797 +77977 936 +22466 703 +9J488 945 +7TTKT 680 +82828 875 +AAKKJ 663 +JJJJJ 302 +JA222 25 +5TA98 364 +6J667 47 +Q398T 668 +82386 180 +34JK4 173 +3AT24 476 +2K6KT 849 +87355 97 +44424 779 +92Q29 798 +AKAK2 709 +A63Q3 92 +33366 350 +58Q5T 871 +J8855 71 +95A3A 341 +4446A 412 +49K94 417 +74J55 376 +J5K27 843 +J5TTJ 617 +6666J 694 +68KQ6 516 +35K3K 565 +T7T7T 528 +49934 539 +3J436 183 +J4477 406 +649JJ 204 +J5A2Q 583 +88827 416 +AK3Q9 562 +KT56A 532 +866J2 969 +6366Q 577 +TT788 975 +KAKK3 345 +J6922 664 +2222K 497 +23K93 438 +6J6T7 755 +68KK6 914 +85855 268 +5JJT5 287 +6J622 212 +22828 922 +9QQ96 815 +44788 960 +5T243 643 +QQQ76 410 +J3999 292 +Q566J 918 +QJ4JK 41 +99895 391 +5K4TA 835 +Q5Q8Q 651 +33686 732 +A3Q6K 879 +36663 626 +9TT9Q 649 +J365A 941 +K2KK6 163 +77237 977 +J6QT9 242 +AJ4T7 332 +KK6KK 315 +4733J 221 +K4J96 912 +33KTQ 469 +KQ78T 200 +2A32A 235 +2A33A 54 +6K63T 489 +62444 978 +J2TTQ 478 +TA6JQ 931 +46644 546 +76KKJ 168 +88JJ8 255 +23233 708 +88Q4K 228 +6A4AQ 805 +55JAJ 181 +4869T 327 +TT777 259 +7Q777 209 +4J22J 109 +22J22 789 +T88TT 91 +388QK 40 +36326 618 +44J3Q 925 +45283 215 +A4K9K 14 +T3666 961 +Q452T 920 +2JK22 437 +Q9JA8 567 +KK8K8 954 +663J6 6 +Q4J4J 409 +KQ7T2 394 +K7KKK 9 +JJ333 400 +K4999 658 +98899 467 +76778 311 +K2A99 951 +834Q2 291 +K6KJ9 820 diff --git a/src/day7.rs b/src/day7.rs new file mode 100644 index 0000000..bf7e39d --- /dev/null +++ b/src/day7.rs @@ -0,0 +1,194 @@ +use std::cmp::Ordering; +use std::collections::HashMap; +use std::io; +use std::iter::zip; + +fn get_rank(hand: &String) -> u32 { + let mut map: HashMap = HashMap::new(); + for c in hand.chars() { + if map.contains_key(&c) { + *map.get_mut(&c).unwrap() += 1; + } else { + map.insert(c, 1); + } + } + + // Five of a kind + for (_, v) in &map { + if *v == 5 { + return 7; + } + } + + // Four of a kind + for (_, v) in &map { + if *v == 4 { + return 6; + } + } + + // Full house & Three of a kind + for (_, v) in &map { + if *v == 3 { + for (_, v2) in &map { + if *v2 == 2 { + // Full House + return 5; + } + } + // Three of a kind + return 4; + } + } + + // Pairs + let mut pair_cnt = 0; + for (_, v) in &map { + if *v == 2 { + pair_cnt += 1; + } + } + + match pair_cnt { + 2 => 3, + 1 => 2, + _ => 1, + } +} + +fn get_rank_wild(hand: &String) -> u32 { + let mut map: HashMap = HashMap::new(); + for c in hand.chars() { + if map.contains_key(&c) { + *map.get_mut(&c).unwrap() += 1; + } else { + map.insert(c, 1); + } + } + + let wild = match map.get(&'J') { + Some(v) => *v, + None => 0, + }; + + map.remove(&'J'); + + if wild == 5 { + return 7; + } + + // Five of a kind + for (_, v) in &map { + if *v + wild == 5 { + return 7; + } + } + + // Four of a kind + for (_, v) in &map { + if *v + wild == 4 { + return 6; + } + } + + // Natural Full house & Three of a kind + for (_, v) in &map { + if *v == 3 { + for (_, v2) in &map { + if *v2 == 2 { + // Full House + return 5; + } + } + // Three of a kind + return 4; + } + } + + // Pairs + let mut pair_cnt = 0; + for (_, v) in &map { + if *v == 2 { + pair_cnt += 1; + } + } + + match pair_cnt { + 2 => match wild { + 1 => 5, // Full House + _ => 3, // Two Pair + }, + 1 => match wild { + 1 => 4, // Three of a kind. + _ => 2, // One Pair. + }, + _ => match wild { + 2 => 4, // Three of a kind. + 1 => 2, // Pair. + _ => 1, // High card. + }, + } +} + +fn cmp_card(first: &char, second: &char, jacks_wild: bool) -> Ordering { + let order = if jacks_wild { + "J23456789TQKA" + } else { + "23456789TJQKA" + }; + order + .find(*first) + .unwrap() + .cmp(&order.find(*second).unwrap()) +} + +fn sort_hands_internal(first: &String, second: &String, jacks_wild: bool) -> Ordering { + if jacks_wild { + match get_rank_wild(&first).cmp(&get_rank_wild(&second)) { + Ordering::Less => return Ordering::Less, + Ordering::Greater => return Ordering::Greater, + _ => {} + } + } else { + match get_rank(&first).cmp(&get_rank(&second)) { + Ordering::Less => return Ordering::Less, + Ordering::Greater => return Ordering::Greater, + _ => {} + } + } + + for (f, s) in zip(first.chars(), second.chars()) { + match cmp_card(&f, &s, jacks_wild) { + Ordering::Less => return Ordering::Less, + Ordering::Greater => return Ordering::Greater, + _ => {} + } + } + + Ordering::Equal +} + +fn sort_hands(first: &(String, u64), second: &(String, u64), jacks_wild: bool) -> Ordering { + sort_hands_internal(&first.0, &second.0, jacks_wild) +} + +pub fn get_total_winnings(jacks_wild: bool) -> u64 { + let mut buffer = String::new(); + let mut hands: Vec<(String, u64)> = Vec::new(); + while io::stdin().read_line(&mut buffer).unwrap() > 0 { + let mut parts = buffer.trim().split(' '); + let hand = parts.next().unwrap(); + let bidstr = parts.next().unwrap(); + let bid: u64 = bidstr.parse().expect("Couldn't parse bid"); + hands.push((hand.to_string(), bid)); + buffer = String::new(); + } + + hands.sort_by(|a, b| sort_hands(a, b, jacks_wild)); + + let mut score = 0; + for i in 0..hands.len() { + score += (i as u64 + 1) * hands[i].1; + } + score +} diff --git a/src/main.rs b/src/main.rs index 4f88581..dd69b4e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ mod day3; mod day4; mod day5; mod day6; +mod day7; fn main() { let args: Vec = env::args().collect(); @@ -26,6 +27,8 @@ fn main() { "day5b" => println!("Min: {}", day5::get_lowest_location(true)), "day6a" => println!("Product: {}", day6::get_winning_combos()), "day6b" => println!("Product: {}", day6::get_single_winning_combo()), + "day7a" => println!("Score: {}", day7::get_total_winnings(false)), + "day7b" => println!("Score: {}", day7::get_total_winnings(true)), _ => println!("Unrecognized day: {}", args[1]), } }