diff --git a/2023/.inputs/07 b/2023/.inputs/07 new file mode 100644 index 0000000..e96d605 --- /dev/null +++ b/2023/.inputs/07 @@ -0,0 +1,1000 @@ +K8KK6 75 +TAK97 148 +8345K 129 +QT45K 170 +77J7J 573 +7JJK7 796 +JQA74 769 +3T733 204 +KK66K 166 +47222 657 +56JTQ 527 +2375J 424 +36A63 352 +JJKK3 513 +373Q3 547 +TT344 993 +8A788 302 +A7AAJ 625 +646J4 270 +J448Q 635 +A7K7K 982 +9QA96 876 +77772 696 +6K77Q 516 +KJ33J 816 +A292J 33 +97Q77 488 +KKK4K 856 +AAQA7 511 +365A4 784 +252K2 144 +J88JJ 389 +25KKT 754 +4T44T 951 +975J9 357 +K7637 799 +3333K 942 +2A4JT 929 +5J595 750 +77388 65 +6K398 830 +Q3K6J 605 +333T3 537 +44447 48 +T958Q 624 +48424 328 +A9TQ7 793 +T8558 838 +47884 387 +77AAA 890 +J569Q 610 +89T95 232 +3A633 992 +22JJA 651 +J4639 367 +4376K 957 +593Q2 165 +J2277 502 +A3AAJ 451 +68T9K 548 +AAAQT 231 +KK77Q 350 +556J5 791 +Q462K 421 +T4J44 611 +54T48 518 +8K8AT 960 +Q2Q82 258 +AA7Q7 724 +TTJAT 969 +TT889 269 +QA24Q 90 +KK727 601 +9Q745 41 +8AA88 783 +J4852 491 +42454 425 +327A4 145 +98K87 604 +A26T7 12 +98Q8T 348 +443QK 467 +27478 10 +K75KK 566 +KKAQA 986 +T5J35 371 +78452 575 +2398Q 426 +83J63 428 +83J65 471 +6229T 866 +9K333 108 +9A2A9 564 +7767J 306 +3A849 822 +2A7K7 979 +QQQ7Q 230 +2J2QJ 81 +32JT3 833 +KJK8K 127 +73764 126 +AA4JA 72 +83363 365 +99K9K 130 +8KK8K 976 +77JK8 981 +JTAAA 164 +JAQ36 113 +5K5K5 183 +J3222 508 +444T4 654 +TKKKK 965 +A4A54 391 +TT8T2 753 +58J77 669 +84356 340 +TK7K4 868 +KJ53T 941 +A28J2 372 +Q9995 961 +AA55K 175 +7779J 327 +3JA6A 546 +5JTAA 857 +67768 558 +KJ386 539 +K632A 50 +T2TTJ 119 +A8TAQ 520 +T3K58 795 +K44J4 901 +887T7 120 +4J362 314 +TKJ3K 423 +44544 153 +3Q23Q 369 +A85AA 602 +29993 44 +QT4TQ 689 +99A99 182 +989J8 190 +45454 962 +46846 659 +74877 915 +A5636 603 +65T5J 568 +3J76T 203 +2JQQQ 704 +TJ856 254 +6665K 220 +6J38T 408 +KKKKQ 222 +6A55A 155 +43337 888 +33AA9 341 +Q7QQK 719 +979A7 275 +9QTAQ 361 +KTA73 448 +A43QQ 878 +2Q6J7 305 +9T745 137 +35Q58 596 +QK4T3 85 +78Q32 798 +T29J6 606 +QKQ6A 22 +T2T5J 107 +3JJK6 849 +9JTTT 895 +55855 676 +49A65 407 +27T72 899 +4TTT9 201 +77798 249 +27222 773 +5642J 834 +95589 819 +6JJ4K 485 +4TJ56 437 +96296 359 +4444J 588 +83777 663 +J8555 757 +KJKKK 524 +43437 216 +TJ6JT 154 +7J787 894 +36KKJ 288 +J44J9 56 +54KT2 921 +QQ9J9 928 +48AT6 854 +AT7Q6 726 +TTJJT 483 +TKAKT 366 +92938 615 +7777J 210 +TJ66T 752 +7TA77 64 +85693 478 +KK232 242 +88484 435 +JA573 529 +T9A65 886 +35Q7T 25 +8KK86 54 +33343 841 +QA346 185 +6JQ66 809 +AJQ78 217 +557K7 290 +QQQ29 450 +K558K 409 +6J722 832 +44494 931 +22729 789 +32K97 671 +22992 697 +T9Q37 744 +8J8J8 550 +3367T 125 +AJ725 255 +QQA94 262 +A446A 496 +77678 650 +J39Q5 110 +89A8T 218 +66Q6Q 701 +J72KK 162 +T2333 53 +64382 179 +54K27 777 +A5T23 630 +Q48QQ 644 +22J2A 115 +92735 620 +99QQ7 686 +33335 181 +J42JJ 392 +T6427 19 +29T93 788 +6Q72Q 474 +A2AAA 40 +4A2A6 595 +QJ44Q 169 +4453J 336 +777Q5 619 +2TTTT 97 +7TQ95 687 +22Q22 705 +6QQ9A 551 +2997Q 945 +TTJ9J 466 +49J52 785 +26557 839 +88497 691 +TQ263 700 +5JA5A 440 +5A9KQ 202 +JJT8T 685 +2AA6A 599 +JKK5T 292 +3333A 200 +2T6K7 920 +9K4T7 460 +74547 95 +88538 297 +77J73 36 +53999 977 +97988 376 +94352 540 +98888 598 +KQAQQ 887 +AKAA8 80 +6J556 629 +TA26A 195 +55595 343 +6T7K7 123 +7JT84 268 +K9828 879 +J8K6K 543 +23823 640 +KK7QJ 380 +AAAK4 926 +7JTK4 388 +AAKAA 246 +77578 913 +534AT 855 +4K5K8 582 +TA65T 172 +AAQAK 514 +86666 337 +TQTJT 739 +7477J 42 +56TA8 585 +2QK2Q 587 +K938A 867 +49449 319 +55255 647 +9AAAA 623 +K4KK5 974 +KQJ7Q 781 +6T985 487 +553A3 439 +AA5AJ 987 +QJ333 874 +TJJJT 211 +AJ9J7 464 +9TK48 433 +JJ6J6 192 +TT44T 664 +799AA 196 +A8A94 782 +7Q777 732 +Q3Q99 88 +T3A65 661 +22442 881 +72277 234 +3KJ36 225 +J3336 597 +8JTJK 903 +QQ43Q 277 +Q5TKJ 583 +AQTAQ 955 +68888 892 +TAT5A 557 +44772 827 +38338 442 +96669 312 +766J7 412 +TK89T 713 +33233 591 +A99K9 150 +44Q33 289 +Q5585 52 +5T3KK 161 +J8J4T 51 +7KK8K 475 +2QAJ5 943 +TTQ6Q 703 +4Q56T 375 +834K9 173 +TTT5Q 354 +272JA 975 +J54Q5 490 +6QK26 949 +947KK 642 +4AAA4 463 +K796Q 678 +QQA93 168 +7JJ39 311 +57779 504 +K6JKJ 925 +55775 158 +4JA45 535 +Q8323 560 +A5J74 940 +QQQ6J 160 +6A3J4 953 +A5256 469 +6TTTA 677 +Q3366 865 +5T55T 427 +3QQ3Q 414 +AAQ9K 265 +T6535 74 +5892A 845 +KK775 980 +A738Q 446 +6K5AQ 924 +K5359 214 +TQ968 614 +87A97 507 +4A4T3 988 +QQAQ2 280 +44934 385 +QTJAJ 422 +AA2A2 186 +QKA94 444 +8TK42 565 +J2JA6 751 +K2TAK 227 +2Q5T7 626 +23722 178 +4Q2QQ 968 +Q2Q42 432 +77774 695 +9KKJ9 330 +ATJ49 935 +T3682 828 +57757 213 +66949 572 +495JA 294 +K5KJ5 682 +33K3A 198 +462Q2 766 +KQJKK 55 +AQA98 207 +88887 43 +KK84K 104 +8K8KA 958 +QJ9QQ 73 +4K444 641 +5JK5A 149 +7J99K 756 +AT799 737 +QJ2Q3 413 +392J2 871 +22JJ9 984 +TTTAA 167 +AJ2AA 643 +82QK6 538 +78877 774 +93JQ8 103 +92522 578 +54446 429 +36A87 381 +2Q573 916 +2323A 510 +4AK85 228 +266J2 76 +49KT2 49 +Q324J 346 +J3843 708 +T9399 78 +53QQ5 592 +99922 329 +93669 35 +43344 667 +96J22 638 +33633 394 +6666Q 717 +J2242 825 +T879K 91 +A8A22 253 +26QQ2 47 +83732 62 +22K5J 553 +T6628 379 +J333J 322 +6KK8T 709 +2Q6J2 944 +22J2T 417 +QQK4Q 679 +T993T 762 +3666T 634 +J43T2 850 +A96KQ 9 +88KK8 377 +T67JK 967 +AKQQJ 660 +K222T 767 +AAAQQ 272 +47474 237 +JJ999 403 +J6666 247 +TT7TJ 373 +2A932 284 +88837 954 +5Q555 880 +Q888Q 456 +528A2 570 +44642 273 +262Q6 283 +75595 806 +58443 368 +4464A 208 +3833T 462 +AAAAQ 20 +K6873 370 +3879A 824 +73J26 718 +72JJ5 776 +AA9A9 652 +K6646 184 +36J66 68 +28T88 790 +5QJ55 238 +2A2A2 221 +J22J2 742 +3JK89 668 +9TT29 656 +8K256 522 +J8666 805 +8869J 966 +6K333 345 +6A99A 728 +TTA32 259 +66776 2 +44K64 187 +AAAJJ 143 +TT22T 684 +955K5 71 +TT2J2 729 +78J94 287 +88568 665 +372JT 594 +33J88 454 +K3257 910 +J5K3K 45 +T6TT6 105 +24972 586 +85J84 461 +4TJ45 618 +3957Q 846 +K2572 995 +K4J8K 864 +KKKK3 362 +488Q4 758 +64JKK 476 +Q2Q7J 18 +2856J 152 +T994T 552 +JA45A 404 +4444A 436 +7JA2T 477 +J58JT 628 +73J28 948 +Q8T42 863 +49977 922 +J444J 205 +T2769 420 +7JT38 13 +A8AAA 59 +9JA92 58 +7A77A 690 +67686 655 +8TJJA 731 +AAAQ9 252 +QQJ24 794 +T99T6 525 +49994 991 +99669 98 +KT54K 633 +QAQQA 889 +94TQ8 382 +62266 27 +5J999 248 +Q3333 353 +2A2AQ 159 +TA759 733 +53544 325 +37Q6A 188 +KK4J4 111 +44Q73 323 +4K67A 157 +7K7K7 313 +JKKJK 736 +33573 764 +3333J 484 +3TTJ3 5 +2QK6J 304 +5Q37K 637 +KQ476 66 +56688 60 +2KTAQ 612 +K4J99 534 +A4A73 1000 +A5A55 533 +3TQ36 31 +TJQQT 317 +9AJQT 674 +77797 946 +QJ827 554 +69K99 443 +5847A 410 +7888J 692 +Q5J58 219 +77357 83 +55QJ3 706 +4347K 23 +99A9A 308 +9T73K 82 +8Q456 517 +5QQQQ 215 +6T22T 763 +7A82K 459 +J5588 770 +9J9JT 333 +889A8 235 +9AK74 131 +A52J8 486 +7AJJ7 418 +J5A2J 902 +36633 932 +34543 985 +55355 923 +88478 296 +88666 761 +6266K 616 +595Q8 989 +A52KA 458 +44467 748 +2T7T7 627 +TT25T 765 +36725 191 +KQKKT 840 +88828 1 +666JJ 493 +TT58K 481 +KKTKJ 37 +J9333 282 +3677J 39 +84Q94 393 +J8JJJ 658 +3QJQJ 740 +9378Q 549 +56KK6 338 +6J363 542 +AJKKA 310 +8J8KK 792 +QKA5J 699 +44646 808 +TA6K7 430 +76677 263 +9Q987 498 +A69J9 96 +K3J2K 898 +4A7T8 468 +77494 693 +JATA8 233 +42K64 180 +QJQ62 128 +JK2KK 990 +A7AAA 900 +QK874 860 +J4KK5 532 +Q842Q 844 +48JA2 978 +65565 662 +AJT8Q 114 +KAJKK 206 +22J22 46 +93999 452 +6677K 500 +55378 6 +2342J 891 +3KKKJ 132 +J9999 802 +37373 622 +5J459 482 +AK648 177 +Q52K6 226 +AAJ64 318 +999T9 561 +48JK3 722 +67265 730 +8KQQK 872 +QA579 398 +522KK 16 +55522 680 +55765 324 +835T7 315 +6359K 38 +K2QQ8 787 +TTT86 734 +777A7 576 +6T866 136 +K43Q6 479 +58588 271 +23323 29 +JKAK2 14 +A6936 499 +9T92K 905 +ATT28 851 +J64K9 503 +2TAK5 963 +74875 138 +3T553 670 +755J7 384 +5KK5Q 351 +TT4TT 842 +K6K22 501 +2K222 807 +8Q62J 526 +36K2K 295 +9TTKT 580 +ATT9J 495 +882Q9 786 +22Q25 146 +Q3TJ9 632 +453TT 399 +2A92A 303 +A2J6A 813 +55235 34 +KTTJJ 326 +2282T 286 +9Q63T 811 +8333A 688 +J4554 241 +K7K33 821 +38427 646 +T9956 556 +49J94 100 +3K887 363 +35T7A 109 +A722A 541 +5A525 441 +2T252 639 +5QAJ7 117 +A44Q4 122 +8297J 473 +32A4K 63 +3A5JA 530 +2AJA7 147 +KAATK 710 +AAQJQ 494 +64968 212 +A4J58 332 +64944 397 +ATQ68 3 +43TTJ 301 +95559 7 +33393 101 +55Q8Q 917 +6QQQQ 698 +AT59A 199 +9AQ89 457 +7J744 267 +888J8 300 +KJ888 581 +AA557 257 +T9TTT 893 +45458 804 +JQ529 694 +J8AA9 636 +KQJTK 820 +T8A88 997 +A25A2 912 +676QJ 707 +QQ7AQ 224 +595A9 959 +778J8 28 +6562A 465 +4K99T 908 +Q5Q56 715 +67K77 749 +T2AJQ 316 +7QQKK 140 +739AQ 720 +325J8 209 +TTKKK 135 +T8688 877 +7KKKJ 334 +42444 291 +QQQT9 298 +95999 347 +22225 193 +4J9JQ 15 +J66QT 106 +9TT2T 716 +888Q8 559 +9JJ8T 276 +Q5Q5Q 4 +79997 245 +335AJ 711 +8867J 673 +476K8 907 +J4343 431 +822J6 8 +JQ5Q5 562 +89999 492 +JTK2J 607 +J46AT 102 +A6AA8 569 +J6J7J 768 +92949 885 +9Q4J7 972 +K9499 406 +69A83 589 +J8K8J 914 +K7A5K 87 +54277 937 +523JJ 383 +J7295 139 +QQQQT 142 +78JA7 455 +Q86T7 521 +Q3393 747 +44J49 279 +7682A 897 +T2322 250 +44484 447 +87435 800 +A863A 30 +6QT8T 489 +AAKAK 320 +8Q272 608 +9676T 240 +QQQJT 801 +QQ77Q 189 +TTTT3 344 +J339Q 17 +87878 621 +7QTJQ 84 +TA663 141 +55554 236 +88696 256 +K22AT 331 +9586K 579 +3A453 21 +76A85 176 +5AJTJ 449 +T4T7Q 349 +54AA5 810 +7JQ8T 947 +99333 378 +7QQ33 24 +26622 681 +T3KT5 480 +8A8JQ 299 +KJ9QQ 401 +JAQ39 858 +847AA 818 +8QQJ2 952 +A333A 400 +4J489 307 +4JKKJ 515 +62222 771 +94787 94 +J955J 950 +QJQ3T 577 +TA3A3 197 +Q8T39 121 +TAAAA 600 +2KJJJ 812 +22822 613 +J6888 260 +65667 536 +A75AK 741 +997Q7 712 +9QA44 497 +A27KA 194 +776JQ 339 +577T7 402 +33342 930 +J4A53 918 +3A3AA 453 +2QQ22 772 +TJTT3 11 +K2KKK 938 +6TTQ6 281 +39923 735 +4Q44Q 843 +Q5Q55 321 +T3T5A 434 +QQQ7J 852 +T974Q 574 +777K8 545 +46466 853 +4KA53 584 +T3Q3J 396 +QJJQQ 509 +5Q9J7 266 +39QQQ 803 +22242 69 +25545 416 +JJ555 649 +77337 666 +4T5K7 831 +52K4J 567 +555A5 57 +45335 261 +44644 124 +JJJJJ 171 +J9J64 355 +66466 229 +K4268 356 +Q33Q3 725 +TKTTT 999 +86A86 869 +33JKK 973 +T69TT 904 +T64K3 823 +7T7TT 780 +7Q478 760 +6T625 738 +KKKK9 309 +8AQ75 983 +QT39Q 92 +KK82K 555 +22J27 727 +84948 156 +89T67 927 +T8AAK 133 +Q3A72 778 +Q2822 883 +5J552 411 +9K9A6 505 +999J6 358 +62A5A 118 +Q6464 826 +AJ666 934 +Q8KKK 223 +AT3J8 964 +J7A96 829 +3AK5K 861 +68TQ3 360 +T8Q88 919 +AA24A 544 +TJTTT 264 +82686 415 +45J9J 93 +58Q7T 79 +6Q665 251 +55556 631 +TTT43 239 +J9595 746 +AJAAA 648 +98899 779 +74AJA 675 +89398 419 +JQA5T 590 +95K3J 70 +A4AAA 836 +A7J7A 61 +33TQ4 243 +Q9983 759 +34K5Q 26 +TJ77T 723 +Q3937 174 +A3259 609 +KA24J 528 +K56T3 151 +459KT 342 +66566 797 +23A84 32 +JJ383 896 +9J222 405 +6J764 862 +44K4K 293 +87Q94 67 +7A923 815 +5J58J 814 +9487A 870 +QKQQQ 438 +396JT 519 +44ATA 374 +TK77J 395 +A29AA 445 +A2ATA 998 +J9292 390 +979Q9 939 +5A2QT 683 +977J9 653 +TJA3Q 112 +7J689 817 +QQ677 859 +J3J63 873 +Q28Q3 994 +A55JJ 523 +K7462 364 +65596 470 +9Q45J 956 +ATT2T 506 +TK4QQ 875 +AA5AA 743 +28693 714 +2J786 745 +89T77 512 +94474 884 +3Q626 86 +J742K 837 +636KK 278 +TA4TT 571 +JQQQQ 563 +8283Q 996 +Q42K3 77 +TTTT6 911 +JTJ3J 835 +555J5 847 +J779K 244 +35775 909 +TQQ99 134 +8A8Q8 163 +36325 335 +A9886 386 +25T37 971 +24A86 882 +A9KAK 936 +KQ7Q3 531 +69666 89 +39369 672 +4J666 755 +252Q5 775 +2TJA8 933 +56566 645 +7QA92 593 +3KKQK 617 +AQ896 906 +99992 721 +JTQ9J 848 +K5KKK 970 +43TAA 702 +KQ97A 472 +24A44 274 +TK2J7 116 +K6666 99 +48845 285 diff --git a/2023/haskell/aoc2023.cabal b/2023/haskell/aoc2023.cabal index 42452b9..df3422f 100644 --- a/2023/haskell/aoc2023.cabal +++ b/2023/haskell/aoc2023.cabal @@ -28,7 +28,6 @@ library -- other-modules: - -- LANGUAGE extensions used by modules in this package. -- other-extensions: build-depends: @@ -46,7 +45,6 @@ executable aoc2023 other-modules: Utils - -- LANGUAGE extensions used by modules in this package. -- other-extensions: build-depends: @@ -61,13 +59,10 @@ executable aoc2023 test-suite aoc2023-test import: warnings - -- Modules included in this executable, other than Main. -- other-modules: - -- LANGUAGE extensions used by modules in this package. -- other-extensions: - -- The interface type and version of the test suite. type: exitcode-stdio-1.0 hs-source-dirs: tests diff --git a/2023/haskell/solutions/Day03.hs b/2023/haskell/solutions/Day03.hs index b8d902b..c2b9e7a 100644 --- a/2023/haskell/solutions/Day03.hs +++ b/2023/haskell/solutions/Day03.hs @@ -37,16 +37,15 @@ parse = first errorBundlePretty . runParser full "" full :: Parser [[Item]] full = many line <* eof -findSpans :: (a -> a -> Bool) -> [a] -> [[a]] -findSpans = helper [] +spansBy :: (a -> a -> Bool) -> [a] -> [[a]] +spansBy p = helper [] where - helper :: [[a]] -> (a -> a -> Bool) -> [a] -> [[a]] - helper acc _ [] = reverse . map reverse $ acc - helper [] p (x:xs) = helper [[x]] p xs - helper acc@(a:as) p (x:xs) = + helper acc [] = reverse . map reverse $ acc + helper [] (x:xs) = helper [[x]] xs + helper acc@(a:as) (x:xs) = if p (head a) x - then helper ((x:a):as) p xs - else helper ([x]:acc) p xs + then helper ((x:a):as) xs + else helper ([x]:acc) xs withCoords :: [[a]] -> [((Row, Col), a)] withCoords grid = [((r, c), a) | (r, row) <- zip [0..] grid, (c, a) <- zip [0..] row] @@ -75,7 +74,7 @@ getNumbers = concat . zipWith processRow [0..] e = maximum $ map fst items in (n, (r, s, e)) processRow :: Row -> [Item] -> [(Int, (Row, Col, Col))] - processRow r = map (merge r) . findSpans isNext . mapMaybe getDigit . zip [0..] + processRow r = map (merge r) . spansBy isNext . mapMaybe getDigit . zip [0..] getNeigbors :: (Row, Col, Col) -> [(Row, Col)] getNeigbors (r, s, e) = [(r, s-1), (r, e+1)] diff --git a/2023/haskell/solutions/Day07.hs b/2023/haskell/solutions/Day07.hs index e2c1688..bd260f0 100644 --- a/2023/haskell/solutions/Day07.hs +++ b/2023/haskell/solutions/Day07.hs @@ -6,11 +6,11 @@ import Data.Char (isDigit, digitToInt) import Data.Text (Text) import Data.List (sort, find, sortBy) import Data.Function (on) -import Data.Bifunctor (first, Bifunctor (bimap)) +import Data.Bifunctor (first, bimap, second) +import Control.Monad (join) import Text.Megaparsec (Parsec, errorBundlePretty, runParser, many, eof) import Text.Megaparsec.Char (alphaNumChar, space) import Text.Megaparsec.Char.Lexer (decimal) -import Control.Monad (join) data Card = X | Plain Int | T | J | Q | K | A @@ -30,8 +30,8 @@ parse = first errorBundlePretty . runParser plays "" where card :: Char -> Card card c - | isDigit c = Plain $ digitToInt c - | otherwise = read $ pure c + | isDigit c = Plain . digitToInt $ c + | otherwise = read . pure $ c play :: Parser Play play = do cs <- map card <$> many alphaNumChar @@ -43,48 +43,43 @@ parse = first errorBundlePretty . runParser plays "" plays = many play <* eof spansBy :: (a -> a -> Bool) -> [a] -> [[a]] -spansBy = helper [] +spansBy p = helper [] where - helper :: [[a]] -> (a -> a -> Bool) -> [a] -> [[a]] - helper acc _ [] = reverse . map reverse $ acc - helper [] p (x:xs) = helper [[x]] p xs - helper acc@(a:as) p (x:xs) = + helper acc [] = reverse . map reverse $ acc + helper [] (x:xs) = helper [[x]] xs + helper acc@(a:as) (x:xs) = if p (head a) x - then helper ((x:a):as) p xs - else helper ([x]:acc) p xs + then helper ((x:a):as) xs + else helper ([x]:acc) xs group :: Hand -> [[Card]] group = spansBy (==) . sort classify :: Hand -> HandType -classify cs - | has [5] = Five - | has [4] = Four - | has [3, 2] = Full - | has [3] = Three - | count 2 2 = TwoPair - | has [2] = OnePair - | otherwise = High - where - sizes :: [Int] - sizes = map length . group $ cs - has :: [Int] -> Bool - has = all (`elem` sizes) - count :: Int -> Int -> Bool - count n = (==) . length . filter (n==) $ sizes +classify = cast . sortBy (flip compare) . map length . group + where + cast :: [Int] -> HandType + cast ns = case ns of + 5:_ -> Five + 4:_ -> Four + 3:2:_ -> Full + 3:_ -> Three + 2:2:_ -> TwoPair + 2:_ -> OnePair + _ -> High -withType :: Play -> (HandType, Play) -withType = first (classify . fst) . join (,) +withType :: (Hand -> HandType) -> Play -> (HandType, Play) +withType toType = first (toType . fst) . join (,) score :: Int -> Play -> Int score = flip $ (*) . snd solveA :: [Play] -> Int -solveA = sum . zipWith score [1..] . map snd . sort . map withType +solveA = sum . zipWith score [1..] . map snd . sort . map (withType classify) -classify' :: [Card] -> HandType +classify' :: Hand -> HandType classify' cs = - let counts = map (bimap length head . join (,)) . spansBy (==) . sort $ cs + let counts = map (bimap length head . join (,)) . group $ cs jokers = maybe 0 fst . find ((J ==) . snd) $ counts others = sortBy (flip compare `on` fst) . filter ((J /=) . snd) $ counts in case others of @@ -99,8 +94,5 @@ erase e = helper | e == c = X : helper cs | otherwise = c : helper cs -withType' :: Play -> (HandType, Play) -withType' = bimap (classify' . fst) (first (erase J)) . join (,) - solveB :: [Play] -> Int -solveB = sum . zipWith score [1..] . map snd . sort . map withType' +solveB = sum . zipWith score [1..] . map snd . sort . map (second (first $ erase J) . withType classify')