diff --git a/Day7.scala b/Day7.scala new file mode 100644 index 0000000..8d2ab0a --- /dev/null +++ b/Day7.scala @@ -0,0 +1,92 @@ +package aoc.day7 + +import aoc._ + +val possibleCards = "AKQJT98765432".reverse + +enum DeckKind: + case High + case Pair + case Pairs + case Three + case House + case Four + case Five + +object DeckKind: + def apply(deck: String) = + val ranks = deck.sorted.toArray + if ranks(0) == ranks(4) then Five + else if ranks(0) == ranks(3) || ranks(1) == ranks(4) then Four + else if ranks(0) == ranks(2) && ranks(3) == ranks(4) || ranks(0) == ranks( + 1 + ) && ranks(2) == ranks(4) + then House + else if ranks(0) == ranks(1) && ranks(2) == ranks(3) || ranks(0) == ranks( + 1 + ) && ranks(3) == ranks(4) || ranks(1) == ranks(2) && ranks(3) == ranks(4) + then Pairs + else + lazy val three = (0 until ranks.length - 2) + .find(i => ranks(i) == ranks(i + 2)) + .map(i => Three) + lazy val pair = (0 until ranks.length - 1) + .find(i => ranks(i) == ranks(i + 1)) + .map(i => Pair) + three.orElse(pair).getOrElse(High) + +import DeckKind._ + +case class Hand(deck: String, bet: Int): + def deckRank(using cardToRank: Map[Char, Int]) = deck.map(cardToRank(_)) + val kind = DeckKind(deck) + + lazy val bestKind = + deck.iterator + .foldLeft(Iterator("")) { (it, chr) => + if chr == 'J' then it.flatMap(s => possibleCards.map(s + _)) + else it.map(_ + chr) + } + .map(DeckKind(_)) + .maxBy(_.ordinal) + +inline def nonZero(ins: Int*) = ins.find(_ != 0).getOrElse(0) + +object Parser extends CommonParser: + val deck = (s"[${possibleCards}]{5}").r + val hand = deck ~ num ^^ { case (deck ~ num) => Hand(deck, num) } + def apply(s: String) = + parse(hand, s).get + +// part 1 + +def handOrdering(toKind: Hand => DeckKind)(using cardOrdering: Map[Char, Int]) = + new Ordering[Hand]: + override def compare(dx: Hand, dy: Hand): Int = + val (x, y) = (toKind(dx), toKind(dy)) + if x.ordinal != y.ordinal then x.ordinal.compareTo(y.ordinal) + else nonZero(dx.deckRank.zip(dy.deckRank).map(_ compareTo _)*) + +def print(using Ordering[Hand]) = + val hands = lines.map(Parser(_)).toSeq + val res = + hands.sorted.zipWithIndex + .map((h, idx) => h.bet * (idx + 1L)) + .sum + println(res) + +def part1 = + val ordering = possibleCards.zipWithIndex.toMap + val handOrd = handOrdering(_.kind)(using ordering) + print(using handOrd) + +// part 2 + +def part2 = + val ordering = "J23456789TQKA".zipWithIndex.toMap + val handOrd = handOrdering(_.bestKind)(using ordering) + print(using handOrd) + +@main def Day7(part: Int) = part match + case 1 => part1 + case 2 => part2 diff --git a/inputs/day7.input b/inputs/day7.input new file mode 100644 index 0000000..1a13991 --- /dev/null +++ b/inputs/day7.input @@ -0,0 +1,1000 @@ +8KKK8 324 +28885 350 +T5892 360 +K84KK 993 +K2Q6T 770 +67AA6 440 +25723 817 +K88QK 512 +46548 749 +8QTJ3 3 +KKTT4 696 +JK336 894 +KKT82 502 +8KJ94 226 +222T2 472 +659T6 336 +9Q8A8 759 +59555 634 +6T226 30 +5A598 369 +A5AAA 247 +ATTTT 132 +73T76 716 +AJ888 47 +KA6JT 923 +6A977 146 +22722 492 +K5K55 276 +99977 957 +5333T 116 +9746J 509 +J3AA6 46 +7644Q 924 +K5T8Q 910 +39336 679 +52423 383 +3K2T8 141 +J3T33 269 +J7KQ7 788 +A847Q 588 +4K7TA 810 +QJQ7Q 884 +KJKJK 200 +KJK6K 890 +3389J 59 +5AQQ5 966 +8QJQQ 451 +8QQ22 607 +8J4TK 391 +42524 356 +J4334 907 +34473 702 +99J9T 945 +QQ533 868 +4333J 893 +T8TJT 939 +J6QQ2 977 +AA555 170 +T8T88 123 +24A9T 919 +38T26 814 +834KJ 540 +5T4JT 978 +63777 270 +KAAAA 425 +9KKK4 340 +22533 948 +4J862 449 +A5955 570 +J444J 26 +338JK 76 +AA36A 829 +99KK4 947 +33883 470 +54J88 305 +QJJTQ 917 +33353 409 +Q2QAA 826 +55333 870 +878TT 880 +85K85 67 +T3AQ3 621 +2K8T7 353 +5QQ5Q 848 +QJQ36 694 +59AA9 678 +2332A 798 +2A7T3 457 +K5KKK 561 +A45JT 751 +KK444 243 +59524 598 +Q4KQ4 79 +3K628 194 +68986 487 +85855 395 +J6886 998 +T5AA5 503 +7J626 16 +84748 865 +TTJTT 426 +43Q79 17 +3Q3JQ 528 +3AAA3 974 +6577Q 916 +2AA2A 11 +98988 92 +JAAA5 428 +57JQ5 150 +A63A3 438 +44433 721 +9Q25J 404 +Q72AA 358 +6555J 653 +3TK7J 980 +Q3KQQ 667 +775J7 988 +TK2T7 225 +7777J 315 +8JT6A 706 +92AT7 236 +4333A 986 +J33J3 312 +T555T 596 +2TA35 380 +Q83AK 77 +T77JJ 527 +AK9TK 936 +85376 876 +T469K 490 +8JJA5 197 +JQ8Q8 587 +776Q7 743 +25T85 529 +48787 581 +52535 309 +K2J26 514 +47434 210 +KTTKK 717 +T5783 658 +9QQ97 186 +2223J 182 +AKTAK 102 +266T3 164 +666Q6 344 +57T64 530 +9566K 908 +T8888 897 +62AJ2 934 +QQAQQ 91 +5552J 821 +83388 320 +2JJ5T 725 +KK3A3 774 +6JQ6T 928 +26Q62 931 +55855 111 +65JJA 157 +434J4 689 +777KQ 477 +8J33J 577 +53936 852 +77772 386 +AKKQK 766 +AA299 654 +49A76 463 +87757 488 +J2QQ2 105 +22977 515 +Q77Q3 159 +877K8 790 +A89JQ 97 +46TTT 375 +57636 474 +A98AJ 180 +39TT9 683 +49Q7K 555 +7777A 962 +KK454 698 +7QJKK 442 +3KQK6 482 +KK4KK 454 +34QT4 214 +385AT 583 +J3K9K 281 +6Q888 867 +5A88T 732 +79AQK 566 +J5555 418 +333J3 930 +K2T39 149 +6363A 475 +87558 655 +T5488 585 +6J5TQ 24 +A266A 483 +J55AJ 518 +Q8469 286 +5T655 711 +896Q2 202 +JAAAA 761 +56656 100 +KKK43 207 +JA8TT 718 +84548 572 +539QK 495 +K896T 602 +4A4K3 571 +JQ485 35 +6K8JK 832 +QA338 220 +JTJA6 427 +JK788 184 +2J888 610 +2737T 544 +9K8AJ 27 +92777 57 +Q5QQK 861 +22666 131 +A2A22 740 +77788 254 +K8KA8 981 +25875 7 +J667J 15 +29446 464 +79Q7A 23 +32A2A 866 +5722J 772 +JJ8TT 983 +KQ646 812 +58TAJ 745 +4283Q 346 +44544 970 +5KKKJ 613 +8527K 460 +88T82 51 +8888J 796 +9975A 183 +98899 657 +985Q7 811 +6AQJ4 898 +6444Q 786 +99J99 989 +JJQAA 675 +A74AA 430 +86Q77 453 +93999 4 +JT465 301 +69T58 219 +64466 204 +7TK77 955 +52KJ5 513 +7A9J4 830 +TK976 437 +AAK6A 597 +84488 179 +87889 767 +JTJTT 875 +J2422 338 +55765 212 +6Q5QJ 240 +KAKAK 37 +K7777 519 +AAA8A 785 +89555 606 +QJ3K4 686 +KJ8KK 162 +AKA22 563 +44242 938 +4Q84Q 448 +QJ4K4 461 +K47AJ 142 +22772 874 +666Q7 862 +TTTQQ 612 +74J44 307 +J939K 271 +8J8AA 873 +23449 964 +58444 372 +44424 272 +AJK64 505 +92J52 548 +KAK3T 134 +2A222 359 +28794 795 +KKQK6 670 +949T4 484 +A73QJ 641 +53496 638 +5J355 439 +KJK7K 973 +TQQQT 950 +6Q74K 508 +66JJ6 321 +44446 244 +2A799 54 +TATT6 625 +77775 660 +66J63 99 +Q9AT8 228 +97478 268 +T5A64 574 +5665Q 260 +2J772 145 +T5TQ5 546 +58737 723 +AA62A 995 +8554K 466 +88666 777 +69992 221 +8Q3J6 441 +3Q778 715 +339AA 754 +3597Q 249 +55JKA 347 +4464J 888 +25999 62 +65666 9 +KT652 29 +994A9 901 +55625 951 +4T2TT 280 +KAA2A 623 +465J7 251 +77227 568 +T4448 857 +T843K 218 +Q25QQ 199 +87888 75 +33443 112 +78886 872 +93T99 330 +8JQK4 343 +2992Q 551 +JT3TJ 326 +559J8 211 +QQJ82 680 +A2JKQ 799 +77739 708 +39J44 592 +44Q44 709 +83848 595 +AJ599 419 +T3JKQ 769 +7TJ4K 603 +9JTT7 661 +Q6A79 697 +T58K7 151 +484Q4 302 +666T6 287 +KAA8A 688 +AK333 70 +T6T66 333 +24667 757 +58A58 593 +2AA29 713 +69966 217 +37787 707 +42898 115 +J43J3 547 +3Q3TQ 501 +A53A3 434 +A9T87 624 +94944 161 +AAT6A 222 +K75AA 292 +K9K99 536 +K3K38 195 +4442J 524 +J4J28 600 +A8JKQ 855 +J2TT4 656 +559KA 605 +JA994 497 +53343 569 +TT5T9 889 +84965 856 +AJ777 712 +956AA 242 +7TK2J 479 +2QQQQ 109 +85JJ8 535 +8K85J 594 +55455 436 +Q9J94 246 +966J6 590 +54556 695 +6J622 975 +66888 664 +Q3AQ3 318 +5Q678 175 +52225 155 +T59J5 849 +82T22 784 +J9699 303 +AATTT 620 +9QJ99 510 +JJA8Q 915 +2JT77 507 +9374J 523 +67726 114 +K8K7K 542 +TT9TT 334 +54575 69 +762A8 411 +9AAA8 481 +99998 158 +3TT3J 174 +94KJA 78 +TJ282 262 +8AA8A 960 +77786 363 +59T29 831 +6KT72 614 +23AJJ 351 +76J67 172 +58TQ9 871 +5QAQA 274 +3A7JK 801 +375J8 764 +42796 690 +J2733 215 +TJ747 493 +5JA97 797 +3TJ23 969 +T5T45 722 +28822 177 +99K9A 883 +T6947 794 +63J63 762 +K5832 730 +64QJ5 941 +2J22J 843 +J2QKK 384 +J4388 881 +86699 238 +79K57 933 +5J92T 854 +KK64A 234 +222Q2 599 +64J64 552 +JK9J9 319 +Q8599 14 +AAAJ2 94 +2TT2T 20 +2Q229 468 +855Q2 230 +22622 378 +9A9KA 791 +K5555 906 +K88K9 203 +77T85 361 +55445 103 +TKTK8 275 +K9A82 946 +7AQQQ 839 +44T66 82 +6QA66 209 +967KA 748 +63TK5 672 +J7Q27 124 +Q59QQ 635 +J55K5 580 +KKAJA 444 +852JQ 943 +K8TT8 648 +2637T 643 +264TK 935 +25A99 265 +QJ5J5 412 +T6KKK 87 +K4474 633 +9284K 701 +5Q5Q6 201 +35532 480 +288K2 371 +83444 52 +9KK9K 294 +55Q55 781 +22223 314 +55KQ8 357 +22249 731 +8AA48 956 +Q8553 632 +A7JAJ 650 +2K88A 33 +T5QJ5 96 +4KQKK 579 +33339 820 +QJQQQ 300 +A5K5A 584 +8T585 517 +8KQ77 952 +K7474 565 +AA877 558 +48888 5 +47747 317 +48K68 364 +5AJ24 285 +3K7AT 405 +QKKT6 736 +39J7A 489 +444K5 729 +5Q73Q 34 +K95A4 113 +Q55Q5 703 +28222 877 +QQJ5A 982 +3J78K 38 +A9A9A 639 +8A778 53 +76656 720 +6A566 631 +QQJ2Q 521 +5445K 913 +84Q5T 925 +KAA9K 44 +4862K 476 +999TT 609 +7Q979 834 +8QK6K 41 +K267J 728 +329A5 538 +63663 8 +9K999 619 +22QQ4 31 +K8588 911 +22752 32 +99AJ6 316 +6K222 129 +T628T 750 +TATAA 342 +46666 95 +T94T2 589 +93939 379 +J44TK 756 +978K6 231 +4J888 549 +K48TK 902 +T7699 365 +T5TKK 858 +7A57J 782 +99292 216 +79977 887 +QQQ99 626 +27336 800 +35T25 504 +AJQ7Q 802 +TT5AA 86 +86644 213 +585JJ 773 +TQQQQ 665 +77828 223 +J9J83 976 +QJ6K3 692 +69Q49 921 +K7K93 138 +TTTKJ 823 +K738Q 719 +43766 949 +38888 899 +Q433Q 968 +J6666 818 +2J929 12 +JQT7A 443 +T49J8 763 +72AA7 25 +8J833 900 +JJT23 996 +77KAK 478 +KK4K4 10 +J2Q32 167 +2222J 693 +A66A6 485 +J4AAJ 298 +5TTK7 415 +JT349 154 +JAAAJ 382 +AAAQJ 433 +8Q8J6 882 +K6J55 153 +KK2KK 545 +AAAAT 306 +775A7 176 +JK59J 248 +J692A 687 +96666 845 +2QJ72 835 +99969 349 +Q7944 355 +49A4K 173 +4J7A4 313 +2JJ26 954 +8TJ78 189 +782A3 148 +36Q22 940 +K3737 165 +K3742 282 +K2326 564 +K5QT4 98 +6K756 257 +772K2 421 +5TA53 104 +2K2J3 332 +QA52A 397 +4644A 807 +T8T77 435 +2846A 208 +6TAQ4 573 +7JAAA 341 +3KKK3 629 +K5622 984 +3Q393 2 +44448 520 +J2KA2 462 +23JTA 500 +88K88 245 +AA888 886 +8J8JJ 825 +4A4AJ 166 +A8A96 863 +72292 646 +QQT74 642 +K4JKK 744 +A49A9 991 +QJAA3 308 +J2A57 841 +J289J 192 +494QJ 809 +T9J9T 120 +2A3J5 601 +J2272 628 +9Q9J8 768 +T77T7 733 +59235 494 +8J889 232 +62T28 288 +22A8A 126 +KQ555 674 +75999 842 +KA85Q 582 +88QQ7 516 +4KK4J 253 +5KJ33 229 +8A33J 965 +9KT8K 329 +55557 636 +78557 846 +87668 264 +7999J 611 +AQ4J9 532 +AJJ9T 937 +J2KAA 450 +6663K 967 +TT6QQ 522 +K3TQT 506 +2KKJ2 101 +2A28T 859 +26668 290 +T87J5 942 +6TTTT 266 +J6488 608 +3KQK7 891 +5JTT5 775 +37563 185 +53737 554 +A5A9A 74 +AAA55 178 +JAK67 432 +8J4AT 43 +98386 403 +42224 771 +QQ55J 322 +46833 13 +A9JTA 198 +A36JJ 452 +Q5KA6 997 +A48KK 920 +AAA9A 392 +4AK82 311 +KK646 93 +64644 649 +24445 630 +983J7 909 +96996 813 +5252A 912 +Q4Q44 81 +55533 793 +JJ243 652 +42222 224 +QAJTQ 990 +79A44 932 +5Q8Q5 567 +A244A 783 +8QQ86 727 +3A333 618 +926AK 366 +KA287 90 +AQ8KT 929 +88A88 168 +T33TT 83 +38939 205 +4TT44 671 +J66KK 84 +54997 424 +A3J9K 765 +42232 256 +333K3 49 +97K79 373 +AA92A 71 +774J4 673 +3TA64 539 +28K4J 368 +9AA99 836 +33T33 753 +A4A4Q 704 +297TJ 299 +3J833 396 +7TT73 410 +47256 537 +35QJ5 616 +55A55 117 +442Q4 374 +38686 806 +4K4AA 511 +4T35Q 815 +J8284 714 +JKJKJ 108 +22AJA 455 +QQJQJ 56 +88TQQ 892 +33636 423 +QT278 663 +4224T 560 +K5KTK 118 +447A7 896 +5T55A 422 +QQQQ5 61 +49434 235 +2QTQQ 819 +T4T46 556 +27J84 121 +55J85 458 +5KKAK 327 +559JQ 291 +228A2 352 +J8K88 904 +45344 402 +AAT89 959 +4J498 416 +742JT 531 +6K66K 273 +A7A7Q 171 +99565 473 +6J466 431 +77357 241 +39T27 615 +QTQQ9 557 +AT8TA 699 +3T3QT 408 +A6556 73 +JAAAT 362 +77337 191 +468Q5 22 +668JA 922 +228A6 860 +AA3AA 19 +65565 471 +ATQQA 406 +JQ292 971 +24258 591 +TT222 735 +75284 28 +KK7KK 331 +7J77K 304 +6QJTK 575 +56QA2 187 +AKK2K 850 +7J9J4 106 +683T4 413 +66766 903 +99Q66 21 +K999T 550 +66692 370 +4QQ88 255 +38A38 578 +AQJJ4 824 +4A52T 18 +662JT 662 +4JTTT 446 +9T999 237 +225J2 335 +K558K 734 +55J3T 739 +KK985 627 +6A6T6 389 +22T24 905 +88AT9 526 +69337 252 +45447 979 +444J4 987 +88898 1000 +Q8888 401 +227KJ 160 +JA77A 339 +7599Q 499 +3KQ27 644 +5A3K3 68 +2T63K 48 +TTQT2 879 +KKKJK 296 +73739 399 +53J72 72 +866A8 367 +37799 844 +J54AK 140 +Q4QA5 429 +222K2 640 +3JKQJ 776 +AAA7A 80 +KJ3A2 283 +34552 414 +58K96 122 +AJKAA 833 +7575A 233 +QQJ5Q 926 +7KJK7 816 +J3K33 42 +6TT5T 853 +44964 130 +J5A55 89 +7799J 263 +532Q3 354 +9QQQA 486 +57335 972 +8K36Q 738 +55525 469 +42JQT 297 +T7TTT 705 +J5Q73 838 +44J84 586 +28J28 39 +9AJ4J 137 +A4992 6 +82332 181 +33Q3Q 125 +K2QK2 163 +AQ4JT 778 +9KKKK 398 +K627K 869 +Q947Q 284 +Q29A7 465 +TT77T 666 +77776 779 +66872 267 +K2K22 710 +T3855 562 +2TKQK 65 +6K65K 152 +JQKKQ 533 +8A97A 133 +6KJ66 345 +TQ8QT 895 +47734 393 +AAAA2 196 +TAA3Q 803 +66Q26 792 +65Q75 669 +TT3Q7 385 +QA567 394 +T5826 622 +35J35 381 +94352 376 +42323 747 +4T4K4 864 +4455Q 927 +67422 700 +QQ222 918 +3T6A7 40 +7T935 328 +873KA 837 +99KKJ 737 +73333 323 +A786Q 953 +KQ5TJ 58 +TT6T6 239 +76873 525 +444JA 682 +64445 543 +T65T2 310 +2999J 188 +53QQ5 447 +73QJ7 878 +85237 136 +974Q5 277 +92525 390 +6K224 456 +7777Q 498 +99KJ9 840 +J5TT2 827 +8J5TK 651 +7Q2JA 139 +JJJJJ 417 +723AK 496 +75575 377 +J29J4 847 +AK7A7 88 +J7J79 279 +39QJ9 576 +5Q863 752 +A8J98 684 +74A44 541 +766A3 128 +K7666 55 +4AA5A 804 +T99QJ 958 +7374A 261 +Q2A2Q 445 +8KK94 553 +64Q79 944 +JK64Q 755 +KKK22 250 +88J8J 259 +TQTTT 36 +5AA25 337 +J9J99 746 +95J99 534 +44545 647 +QQJ95 685 +97999 107 +95989 295 +22929 60 +8487A 190 +5QT76 914 +AKAKA 789 +74A54 388 +6J3A2 999 +99965 119 +4QJJT 491 +J796Q 289 +TTJ2T 144 +82T38 961 +6T2TT 45 +28288 780 +2K4J4 724 +5Q54Q 293 +89263 467 +KK99A 741 +64QK2 193 +9TT4T 851 +A95K9 659 +KQ397 387 +K6857 758 +TKTTK 676 +J9T82 66 +83333 645 +35285 135 +45Q27 985 +22646 420 +A56JT 110 +7J77J 206 +72567 787 +T8789 681 +K844K 559 +6T89A 726 +9565A 407 +AT84A 227 +7599J 147 +84A95 637 +633AJ 604 +JJQ56 885 +3AT3J 278 +26656 677 +2TQ38 63 +87887 828 +J93Q8 994 +J555J 1 +457AJ 808 +4259T 64 +T92T8 668 +T6J4J 400 +QQK27 822 +6JT39 760 +9A236 127 +KK6KK 617 +JJJ8J 143 +56365 348 +6T33T 85 +QQQQ9 963 +K7K3K 169 +35555 325 +93929 50 +936A5 156 +44J79 742 +K3QQ3 459 +TJ262 258 +3T6T5 691 +T75Q2 992 +5555T 805