summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGard Spreemann <gspr@nonempty.org>2023-12-08 23:32:52 +0100
committerGard Spreemann <gspr@nonempty.org>2023-12-08 23:32:52 +0100
commitdb1ce6683394136e68c53dfaa3da3ab2d71f1b3f (patch)
tree91376242e93e82b800e889e28a9c6c30c70ed0b3
parente97783c8162302ed4cb5359f44715c22ff138c96 (diff)
Day 7, part 1
-rw-r--r--07/Cargo.toml14
-rw-r--r--07/input.txt1000
-rw-r--r--07/src/part-1.rs33
-rw-r--r--07/src/stuff.rs177
-rw-r--r--07/test.txt5
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