diff --git a/aoc2023/src/day07.rs b/aoc2023/src/day07.rs index f435fcb..41076c8 100644 --- a/aoc2023/src/day07.rs +++ b/aoc2023/src/day07.rs @@ -19,14 +19,29 @@ impl Solution for Day07 { let res: u64 = hands.iter() .enumerate() - .map(|(i, (hand, bet))| ((i+1) as u64) * bet + .map(|(i, (hand, bet))| ((i + 1) as u64) * bet ).sum(); Answer::from(res) } fn part_2(&self, input: &str) -> Answer { - Answer::Unimplemented + let lines: Vec<&str> = input.split("\n").collect(); + let mut hands: Vec<(&str, u64)> = lines.iter().map(|l| + { + let x = l.split(" ").collect::>(); + (x[0], x[1].parse::().unwrap()) + } + ).collect(); + + hands.sort_by(crate::day07::compare2); + + let res: u64 = hands.iter() + .enumerate() + .map(|(i, (hand, bet))| ((i + 1) as u64) * bet + ).sum(); + + Answer::from(res) } } @@ -65,3 +80,59 @@ fn compare(hand1: &(&str, u64), hand2: &(&str, u64)) -> Ordering { return Ordering::Equal } + +fn compare2(hand1: &(&str, u64), hand2: &(&str, u64)) -> Ordering { + let mut s: HashMap = HashMap::new(); + let mut o: HashMap = HashMap::new(); + + for c in hand1.0.chars() { + s.insert(c, match s.get(&c) { + Some(v) => v+1, + None => 1 + }); + } + + for c in hand2.0.chars() { + o.insert(c, match o.get(&c) { + Some(v) => v+1, + None => 1 + }); + } + + if o.contains_key(&'J') { + let val = o[&'J']; + o.remove(&'J'); + let max_key = o.iter().max_by(|a, b| a.1.cmp(&b.1)).unwrap_or((&'A', &0)).0; + o.insert(*max_key, match o.get(&max_key) { + Some(x) => x, + None => &0 + } + val); + } + + if s.contains_key(&'J') { + let val = s[&'J']; + s.remove(&'J'); + let max_key = s.iter().max_by(|a, b| a.1.cmp(&b.1)).unwrap_or((&'A', &0)).0; + s.insert(*max_key, match s.get(&max_key) { + Some(x) => x, + None => &0 + } + val); + } + + if ( s.keys().count() < o.keys().count() ) | + ( s.values().max() > o.values().max() ) { return Ordering::Greater } + else if ( s.keys().count() > o.keys().count() ) | + ( s.values().max() < o.values().max() ) { return Ordering::Less } + + let ordering = vec!['A', 'K', 'Q', 'T', '9', '8', '7', '6', '5', '4', '3', '2', 'J']; + + for (i, j) in zip(hand1.0.chars(), hand2.0.chars()) { + if ordering.iter().position(|&x| x==i) < ordering.iter().position(|&x| x==j) { + return Ordering::Greater + } else if ordering.iter().position(|&x| x==i) > ordering.iter().position(|&x| x==j) { + return Ordering::Less + } + } + + return Ordering::Equal +} diff --git a/data/2023/day07 b/data/2023/day07 index bf2815e..75218bf 100644 --- a/data/2023/day07 +++ b/data/2023/day07 @@ -1,5 +1,1000 @@ -32T3K 765 -T55J5 684 -KK677 28 -KTJJT 220 -QQQJA 483 \ No newline at end of file +55559 2 +Q525J 656 +457J4 324 +T6668 259 +38847 640 +777T3 595 +J545J 876 +25554 748 +353T3 974 +6KQKK 178 +A3353 31 +23239 195 +J3TTT 238 +897A3 580 +QAKJ3 701 +J6758 273 +666J8 475 +A4K5K 241 +9T4TJ 32 +K9K4J 786 +69666 472 +AJKAT 389 +8Q73J 204 +9K8KK 780 +886J4 855 +8T8TJ 828 +5TQA2 64 +3Q6Q6 638 +TTJTT 601 +K2J5K 338 +QQQTQ 196 +Q8JQ8 801 +7AK3J 437 +Q8535 1000 +K2JK3 853 +A3J86 672 +TJT9J 107 +89Q9K 127 +A794K 242 +J8A22 819 +66688 690 +35357 861 +JK87J 864 +46KJ7 642 +829J5 890 +22JJJ 334 +4J959 795 +7365A 662 +A4449 579 +TT77J 809 +27456 239 +4K9T6 162 +J44KJ 282 +5J55J 736 +T9ATT 648 +J22TJ 7 +2T7TQ 28 +38338 723 +449Q4 505 +QJJQQ 408 +KKK5J 38 +4TJ87 867 +3T333 103 +65995 614 +TAQQ6 730 +79J57 822 +85K48 812 +9JA4A 140 +48J8A 966 +49J9Q 159 +223AK 113 +Q73Q7 6 +66J63 247 +TJ5TT 501 +9JKJJ 824 +893T7 13 +6JT42 46 +63JK3 210 +7J972 138 +A4KQ3 58 +K856K 154 +8TKAJ 255 +66333 615 +KKK48 585 +4QQ6Q 63 +43J5K 295 +72393 968 +3334Q 687 +Q4K6T 16 +T9T99 817 +3TK44 443 +22J53 686 +KQKKQ 40 +3K2TJ 848 +44JJ8 365 +36262 844 +55322 175 +2A622 973 +QQ3QQ 685 +AJT5A 919 +93J49 544 +93693 458 +9KKA9 892 +7278J 332 +T7QT3 562 +K2225 257 +5555T 912 +44844 435 +QQK48 863 +92A6J 322 +Q8Q29 775 +7T3JA 772 +T8855 887 +34Q59 167 +JTQ98 17 +AAA66 83 +58459 954 +A53Q6 37 +T6A4A 171 +Q2JKQ 732 +73Q52 714 +77787 82 +77J97 476 +229A2 744 +Q77QQ 271 +997J9 986 +7A9J2 98 +K8AQ4 155 +7J77J 409 +2A424 425 +2A522 297 +8488J 482 +69799 676 +33J73 635 +JJKKK 329 +8337T 826 +T5335 796 +99957 250 +88J22 494 +3K897 975 +55553 533 +58T5K 388 +JTTQ5 907 +JQ866 448 +6682J 706 +KQ8KK 807 +JT9T9 967 +63A9Q 720 +QK25T 488 +3JQ8J 893 +K2K7T 761 +K5QQ5 66 +35989 430 +6KK76 962 +35565 203 +9QT4K 752 +92722 59 +5A329 727 +K732Q 498 +Q9K3Q 994 +83336 766 +4A4T6 600 +9Q2KA 503 +8AAJJ 386 +35AAT 814 +555K5 265 +4AJ9T 774 +K5KK8 316 +AJAA3 378 +88K88 508 +KK3KK 213 +K8TA4 858 +84844 806 +22TT2 550 +92333 422 +44J48 412 +22555 842 +66686 940 +6666J 557 +28A77 143 +73737 390 +2J66A 996 +33232 570 +37A7Q 264 +74644 517 +KTTKK 1 +JJJKK 882 +JJ5J6 725 +QQA6Q 73 +88J8J 914 +7KK77 590 +27JQJ 964 +A6AAA 307 +47363 692 +42Q2Q 125 +6T26T 916 +29K63 400 +969T9 869 +66366 120 +499K4 961 +A6444 715 +55454 755 +4K6QK 258 +8Q627 397 +Q2J8K 341 +8JJ36 988 +38888 232 +A69A9 756 +J37J3 467 +59T95 39 +9QQQA 746 +QQQQ4 618 +6TT66 385 +27225 619 +J44TJ 874 +92955 214 +J4999 700 +TQQ56 303 +9J443 884 +43Q89 211 +75795 370 +Q5T7T 733 +2A287 199 +5KK22 709 +3T8QQ 891 +22A28 96 +5T5T5 308 +88KTK 469 +KJK8K 449 +3K97T 678 +T8Q66 377 +7TT9T 426 +A8979 228 +Q2984 833 +J37KQ 513 +A5A5A 846 +66689 355 +457T3 717 +9949Q 424 +446QK 304 +A5TT5 313 +827KT 163 +J6AQ9 767 +46KJ4 815 +34JJQ 432 +63J76 665 +79J96 598 +J6288 710 +A555J 279 +QKTQQ 913 +55AA5 321 +KJK83 949 +2222J 49 +3KKAA 771 +A965Q 860 +6779Q 658 +8K539 769 +2K2Q8 121 +999J2 540 +8KK7K 284 +52284 67 +A2QJJ 466 +K7692 530 +9AQ2J 702 +9J66J 889 +Q2TAT 296 +3KTJ3 251 +J44Q2 300 +272TT 941 +A979A 166 +88848 252 +383A8 54 +93K35 413 +336J6 173 +KK7QJ 76 +7J879 911 +88JQ8 145 +6A7A4 368 +37TJ7 612 +9K824 369 +TA2JQ 115 +3JATQ 576 +6T6Q6 468 +7TT77 743 +Q424K 291 +QAQJJ 224 +T7TT7 493 +AK6K8 177 +22226 776 +9QK59 179 +79625 481 +QJ785 489 +AT76K 945 +Q2Q2J 380 +AT3AT 248 +8QKK8 928 +44KKJ 47 +T9999 305 +JJJJJ 270 +3395Q 668 +8A6A8 803 +KKK55 754 +99939 454 +K7JKK 563 +33344 94 +AAAKA 144 +7TT3T 515 +686JJ 793 +JJ5T8 337 +QJ4Q9 549 +JA55A 281 +7QK7Q 641 +7J878 452 +546K8 484 +542A2 376 +86Q36 477 +9T248 105 +JQ955 41 +Q9336 810 +8JJJ8 765 +777JT 785 +2T7TK 261 +6K62A 611 +A667T 218 +52522 102 +QQ2KQ 554 +5T455 68 +66KK6 543 +8KT4J 111 +JK2T2 872 +89665 358 +67677 931 +K98J9 926 +TTTAA 578 +4236J 197 +KJTTT 731 +J7777 302 +6226K 497 +44KK4 97 +QTQTQ 971 +9AAAA 541 +838J4 535 +65KA6 935 +85496 663 +J9Q99 153 +544AA 269 +99J6J 43 +4QQQ4 721 +34T47 542 +6Q55J 627 +777A8 502 +T2T44 581 +KQA3T 346 +25524 506 +4377J 998 +KAQQ3 636 +3A777 277 +24224 707 +8JTT2 26 +47477 419 +8877Q 943 +39793 361 +5K586 904 +9K99K 832 +TTT9J 286 +93726 679 +22544 93 +2J692 840 +5964K 176 +2AKK6 898 +K454K 108 +7534A 114 +6J88T 939 +38883 231 +7KKK7 582 +87778 946 +444A4 101 +A9T27 100 +TTT6T 207 +Q9Q5A 459 +676K6 436 +438TJ 899 +QQJQQ 728 +7JA77 447 +83988 192 +K42A6 490 +7J867 556 +AAJ4T 9 +KJ999 633 +5AK72 407 +23276 81 +2K364 921 +Q999Q 718 +QQ5Q5 243 +8JJ72 254 +3T243 245 +66KAJ 888 +Q2AT3 363 +2J76Q 514 +5Q338 573 +95595 529 +68268 628 +AAQA7 797 +QQ5Q2 664 +3393Q 868 +693KT 670 +85895 862 +K3K63 288 +K2KK2 401 +K8525 565 +A233A 937 +66446 72 +J8448 738 +927J2 532 +JT888 309 +5252J 834 +JK9JK 520 +5886J 8 +8AAAA 372 +A5A98 50 +AQQQQ 632 +Q5JT6 839 +2A996 768 +8659J 845 +47T37 745 +J73TQ 586 +6K63K 836 +2333A 142 +A4493 566 +T2ATA 260 +69699 25 +5TTA6 367 +45Q4J 875 +8QJA7 574 +J55K3 712 +TTTQT 548 +TT422 923 +4T63J 895 +4KKK4 325 +2Q287 762 +22225 34 +Q2646 596 +QQ758 492 +3TT22 800 +JA2JA 345 +QT3T2 830 +88525 348 +6AA58 500 +77K76 684 +32522 330 +224JJ 660 +5A72Q 593 +74572 151 +42442 592 +7KQ35 158 +373K7 485 +46A4Q 711 +QQ644 198 +74447 184 +T6T46 263 +74842 584 +T959K 328 +8883J 651 +JTAJ7 227 +86K79 930 +JQAKT 675 +6T688 607 +8QKA6 473 +666A6 693 +25KJ5 446 +J39KQ 933 +733TT 873 +QQ2QQ 553 +266A6 75 +6AAKT 719 +6TJ95 156 +2KKQA 947 +7888T 877 +5A666 537 +T5462 547 +2J7T2 373 +QQ6Q6 680 +2A498 534 +52395 428 +544K5 42 +445A4 677 +AK554 220 +934K5 392 +A53AA 770 +99A99 314 +QJ456 272 +AA7AA 91 +7A77A 623 +KAA4J 30 +92229 92 +Q4Q4K 857 +J4J7Q 782 +5QT5Q 897 +KKKK5 19 +77883 645 +33J63 349 +J2T95 989 +98242 411 +QK33T 336 +395T4 546 +J22J2 48 +7J8KT 496 +44K6A 52 +2K687 60 +44K4J 654 +9AKAK 375 +72J65 146 +AJJAJ 977 +99QJQ 705 +3AJ7J 716 +7KKT7 222 +2Q222 148 +8J3A7 249 +K6656 417 +23772 518 +2J229 495 +QQAKA 507 +JT27T 813 +AKT5T 416 +74676 821 +KKKK9 950 +TT335 301 +J7TQ4 172 +437Q5 445 +QA562 395 +K7A2Q 777 +4TA87 818 +92929 217 +23777 237 +4KKQT 894 +A29Q3 283 +6AT7J 387 +J4275 71 +47624 206 +4K7QJ 883 +JTQ6K 910 +33832 149 +7K227 708 +73KJ7 740 +K2K92 456 +2K9KT 753 +2222T 87 +55545 626 +333J3 917 +35K47 655 +52772 871 +Q9292 758 +T7Q7J 859 +2K4T3 352 +47QKA 504 +QT655 561 +46446 825 +767Q7 531 +2583A 4 +4A5K9 136 +6372Q 56 +Q8A44 229 +83333 567 +QJQQ7 152 +TQJQJ 669 +26AAT 524 +Q5T42 86 +37333 465 +3J833 922 +2J464 734 +AA2A2 99 +7QQ7J 306 +TJKA6 951 +99988 659 +9Q999 124 +AA99A 605 +97AQ5 326 +78TQK 132 +497Q2 21 +29222 866 +33753 538 +AK4KK 784 +J5677 559 +KKK6J 781 +27222 643 +77833 671 +Q73Q4 440 +K5284 216 +28936 699 +6T6JT 790 +5J55T 139 +6966J 667 +6Q8Q8 741 +7777A 293 +7Q7Q7 410 +53J73 749 +27727 62 +9K6K4 331 +22AJQ 69 +797J9 778 +22A6J 637 +42AQ8 856 +484T4 35 +49494 483 +JA993 987 +2637K 617 +686AA 442 +J4555 183 +87Q84 51 +KJ33K 423 +4TTKJ 421 +JK433 186 +AAA98 650 +J5JJ5 886 +5K5K3 350 +536T5 80 +55K45 880 +K2TKT 783 +TTKK4 644 +9QQK9 499 +29K27 429 +QQ5JQ 333 +T6554 647 +7JK77 779 +3A55A 604 +A38AJ 480 +78828 603 +5J556 491 +KKJKK 674 +78J75 253 +98KK8 606 +Q2269 268 +AA28A 439 +KTTKT 391 +9559J 312 +QQ3TT 646 +85475 622 +57757 323 +53JJ3 317 +3K357 168 +T6K66 11 +5J572 757 +66488 575 +8KAT2 22 +AA77A 849 +T3QQ4 327 +T46Q4 18 +22QQ2 234 +8T88A 589 +37733 450 +33958 70 +89643 362 +6999J 609 +6T8T6 630 +22JT2 990 +JA759 631 +88KJK 275 +5Q5Q4 885 +8JJ84 742 +7K4J5 347 +42738 27 +TTT9T 901 +2AK3J 462 +7J7KK 344 +399A8 927 +QK3JQ 613 +K94A2 516 +Q769K 290 +Q8QQ8 564 +7ATQ4 794 +24K62 750 +77757 150 +TQ62T 55 +5Q5Q5 280 +3JJA6 583 +23333 847 +KKK6K 455 +J779J 878 +JA87K 905 +JQQ3J 696 +7AA87 691 +KT77T 463 +7K777 77 +2T8J3 773 +37565 478 +8TK68 851 +67J27 119 +999J9 61 +85QAA 900 +2J232 639 +T9T9T 965 +5AKA5 703 +QQTT2 594 +J5Q35 841 +55A53 319 +3535K 981 +AK3QA 135 +493AK 970 +72KT7 128 +K3J28 957 +QJ3JA 979 +2225T 983 +27A42 688 +5879T 335 +J7J88 384 +6A6AK 160 +AAAAT 572 +98J2A 451 +6Q886 661 +Q6865 470 +2AA54 230 +KAKKJ 526 +696K6 393 +332J3 729 +32TQ3 320 +49T89 190 +A3AA3 798 +66654 963 +A2A7Q 382 +4TTJ4 147 +2886Q 934 +QJQTQ 959 +T8T48 112 +74K25 552 +AA4TA 116 +74777 854 +4J444 90 +8T5A4 624 +7A337 865 +22KK2 713 +A3Q22 95 +TTAJT 89 +JK554 545 +JJTTQ 629 +67KAJ 444 +66356 106 +KAKKA 903 +74979 925 +J25QT 852 +KAJ44 379 +648K7 938 +TT5TT 20 +KJJ7J 558 +733J7 12 +6666K 999 +77776 404 +J333J 510 +92959 993 +Q4528 811 +KJJ33 621 +QK557 406 +74773 980 +6TJ98 568 +8249J 433 +2T248 187 +34KK2 551 +98T99 956 +88Q28 225 +3J9T9 354 +67626 267 +888A3 835 +32K33 560 +J8JJJ 982 +KQKKK 226 +37397 698 +5572Q 827 +7588J 170 +Q333A 695 +5T598 24 +KKK7K 522 +JJ999 881 +K6J55 521 +83382 764 +TTT2T 512 +QJ8TT 88 +Q5666 123 +335TK 118 +984T5 724 +36236 820 +QAQT5 918 +AA338 620 +QQ36Q 403 +39738 634 +44575 802 +5QQQQ 129 +35355 789 +KT3J8 805 +234JK 383 +AJ69J 486 +T455J 487 +5856J 460 +8K8K8 188 +J37T6 180 +24TTT 681 +32222 587 +Q3Q25 126 +K437T 838 +QKQ7A 599 +9Q9QQ 972 +44344 14 +J679T 36 +6QA7T 788 +98488 208 +47Q77 555 +QAQQ8 189 +32K8T 610 +A3TJA 294 +22955 185 +K64Q9 704 +5T92Q 33 +22882 577 +AAAA2 181 +AJJAA 464 +K58JK 194 +AA88A 653 +222K2 652 +T5A57 174 +776KQ 694 +8K822 597 +33399 353 +4Q942 396 +TJ838 829 +46Q63 953 +KK4KK 479 +5A7JQ 212 +T2932 244 +AA599 84 +9597T 474 +63J82 434 +82AJA 215 +QKJQK 235 +43344 209 +6TKKT 616 +Q222A 371 +AAAAJ 992 +98K34 246 +J226J 747 +99979 399 +79779 274 +QA4AA 57 +2622Q 591 +22284 236 +5Q888 357 +666T6 133 +333TT 359 +5329Q 104 +77737 978 +43J74 299 +36365 906 +JT2T2 735 +KAJAK 527 +KQ2TA 74 +888A8 134 +88KT7 942 +24344 649 +94559 65 +3Q39Q 29 +K8AT7 471 +Q6832 256 +9AT7J 787 +T336T 266 +388JA 831 +4QAA4 278 +T8T88 3 +5TTT7 528 +47Q98 109 +85J7T 763 +22667 995 +2222A 45 +47AJQ 799 +6J94T 791 +AJ3A3 944 +5KJTT 523 +25927 233 +KQQ7Q 837 +9KKJ9 366 +9J7JQ 461 +5AAA2 816 +27722 360 +48385 625 +6K588 697 +Q3962 929 +29Q56 262 +JTKKT 997 +Q6628 374 +JQTQK 117 +44JJJ 850 +5JAQA 394 +2TK4J 588 +58TT2 936 +522TQ 991 +4444T 726 +8J33J 157 +TTTT4 201 +T353Q 342 +Q77Q5 310 +7KKKT 221 +83733 110 +9J5AA 722 +35993 984 +434T4 525 +2JKQ3 969 +J5299 292 +T49QA 240 +6AAA3 955 +KA666 571 +98892 908 +33QKQ 405 +T92A8 509 +AJ349 137 +39939 427 +J6435 79 +666A9 311 +22J47 15 +T57AJ 920 +555A5 760 +QK99J 985 +5AK79 169 +8J5JA 298 +KQ6KQ 438 +7TTTT 519 +37J32 44 +KK99Q 431 +KTTK3 414 +8JAJ6 960 +88868 536 +83439 870 +T3Q63 356 +77277 915 +ATT6K 948 +76666 141 +68JT4 808 +AQQQA 823 +9K933 10 +KQ9QQ 219 +6J6A9 958 +A9JAQ 569 +79J3Q 418 +Q338J 843 +4TK98 287 +85885 289 +89842 339 +7K6JJ 343 +5K48A 976 +ATJQT 804 +4J644 689 +QQQ7Q 739 +77978 453 +99499 420 +TKK4J 5 +K688K 285 +765QQ 608 +AA3AA 364 +55A2A 879 +8585J 318 +A8Q68 85 +45544 909 +Q4A8J 182 +7777T 759 +T3K55 165 +J7377 276 +98282 666 +AAKAK 952 +Q38KA 122 +26AA6 130 +AJQAA 202 +JJT2T 205 +TA8TT 53 +227J6 932 +36J46 751 +8A88A 351 +T5AA5 200 +64885 792 +T44JK 457 +97656 683 +TTJJT 737 +T287T 381 +99298 402 +567JQ 398 +3729A 191 +KJ4AK 924 +TJTT6 682 +AJA5A 315 +5J555 164 +7T585 657 +K929T 78 +733A3 673 +596K8 23 +K5JK9 896 +6445J 340 +62626 223 +77999 441 +84A82 511 +4T4J4 131 +58585 539 +5A565 902 +J8888 602 +QKJQQ 193 +6J638 415 +AATAT 161 \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index b4ed939..4e3f73c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,7 +11,7 @@ fn main() { let Ok(data) = load_actual(2023, 7) else { return; }; - let result = aoc2023::day07::Day07.part_1(&data); + let result = aoc2023::day07::Day07.part_2(&data); let elapsed = now.elapsed();