diff --git a/advent-of-code-2023.csproj b/advent-of-code-2023.csproj
index d69084c..a424841 100644
--- a/advent-of-code-2023.csproj
+++ b/advent-of-code-2023.csproj
@@ -42,6 +42,8 @@
+
+
diff --git a/inputs/07.txt b/inputs/07.txt
new file mode 100644
index 0000000..b67ac8f
--- /dev/null
+++ b/inputs/07.txt
@@ -0,0 +1,1000 @@
+A8J5J 809
+3433Q 57
+228KA 203
+33232 521
+34A57 552
+94939 454
+7J6AT 988
+66K63 19
+54AJK 879
+Q8K23 628
+429A8 449
+KK2K2 487
+T2Q34 830
+4TQQ4 425
+K44K9 695
+K9QK6 85
+225J6 9
+9TJT9 226
+25844 204
+T3993 931
+T8369 961
+28K82 368
+Q5K64 575
+72999 847
+T7777 198
+55999 522
+28882 156
+84J27 55
+67Q77 631
+JQK38 107
+38Q43 199
+7QJ84 359
+Q5656 379
+83843 384
+6J27Q 667
+69TQ6 30
+36774 187
+JA666 680
+33J48 715
+QQ999 305
+7Q9TJ 870
+453Q7 767
+AKAKK 597
+2JKKT 576
+JKQ2Q 320
+QQTQK 101
+TQ975 468
+6T73K 41
+98A34 11
+JK4AJ 463
+666JJ 742
+T333J 332
+9AK46 880
+324J9 283
+5535Q 224
+QQKKQ 352
+66266 177
+K89K9 458
+TTTT9 649
+KQ935 848
+J8JJJ 155
+555A6 136
+9QKQ5 309
+6AJ65 964
+A23Q2 862
+K7QA9 241
+43759 265
+66A66 129
+TKKK8 634
+5TKKK 735
+QKKK4 414
+33JTT 95
+63A6A 983
+K78K8 942
+4Q52A 885
+QTAAT 314
+TTTQT 264
+999A9 194
+7JKJA 936
+J4444 893
+QQAQA 864
+K8888 731
+AAJKK 472
+867T5 729
+9QKJ6 255
+8A5A5 930
+A3KQ3 489
+KK999 664
+Q22QQ 310
+J8TJ3 105
+4285J 533
+AQQQ2 516
+5755J 793
+2TT2T 12
+78KJ8 873
+995AJ 643
+7977J 990
+295T5 422
+QJ3A4 184
+QQQ26 248
+44848 287
+5J656 315
+QQQ9Q 294
+TQA67 484
+8A662 920
+59393 56
+9997Q 828
+TJ3QJ 277
+2Q277 600
+JKQQT 500
+58888 673
+55522 236
+26887 245
+3JA3A 21
+TK4TK 15
+T38K4 891
+AKQAQ 490
+AJ9QA 452
+44T43 208
+T9Q9J 905
+JQJQ4 574
+AA369 783
+Q8K49 158
+8Q74K 387
+7AAAA 216
+Q5KQQ 68
+54J5K 617
+KK2JK 32
+4A29T 398
+444JJ 517
+9T82Q 531
+T868Q 238
+5585J 52
+9JAK3 456
+26289 295
+3766J 622
+KKTAK 147
+9J46K 334
+739QT 512
+8TTQ5 252
+78957 162
+555J5 13
+A3858 14
+J9JJ9 662
+KK8KK 424
+QTQTT 871
+5TT5J 20
+8897A 342
+99J9T 884
+T6J78 710
+ATTTA 934
+TTJ63 346
+A4325 290
+5K7K7 83
+QQA96 605
+8K8KK 693
+82885 232
+8A3A2 38
+KJQ93 802
+34TTT 829
+6T2TQ 406
+748J4 826
+AJ555 530
+Q4K48 994
+48948 223
+74666 181
+49444 278
+54886 470
+99A7A 803
+4784Q 543
+4AK3T 747
+T9J8Q 306
+Q4K77 275
+Q3QQQ 672
+A237J 459
+3J333 776
+JJJK5 349
+5Q455 619
+343AA 71
+97777 817
+69669 835
+85J45 766
+TT2TA 998
+5555Q 34
+KT245 620
+5T7AA 93
+KKK36 432
+5QQJ4 956
+A375A 79
+Q9229 948
+JQ33Q 291
+858A8 925
+T4JKT 892
+366Q9 240
+2J8QQ 967
+66646 243
+68866 726
+TTJAT 682
+3A248 446
+33373 122
+6J866 813
+Q9QK9 404
+2TTT9 49
+A28K7 935
+KA458 467
+333A3 451
+7A7AJ 402
+6K9T9 852
+77747 426
+JQK53 661
+4T455 653
+Q5527 109
+K3399 822
+78A9T 161
+454J5 423
+49T86 630
+77778 537
+722JJ 955
+Q248J 760
+3J26A 725
+3533J 593
+T7T7Q 568
+J7JQQ 298
+3K878 66
+94994 272
+44344 175
+66Q64 688
+7J737 811
+2J84A 113
+JT9T4 51
+KKJ7K 103
+5T5TT 50
+8858Q 455
+276Q7 410
+257K3 656
+K33K3 330
+T6TQ6 97
+999K9 82
+63K29 491
+365A6 508
+2JJKK 609
+AA6K9 765
+7K968 808
+25J7T 46
+6J6K5 538
+9J997 173
+QKKQT 583
+32KJQ 897
+K4935 933
+28228 125
+7Q3J2 326
+KTT36 148
+38344 999
+77757 502
+86JQT 556
+8578J 706
+JJ333 134
+4QQQQ 746
+8QK3K 774
+Q56K9 995
+KT3JK 604
+QJKJ2 348
+6767T 81
+JKKKQ 572
+222K8 607
+55222 972
+6769A 889
+79379 89
+KAJKK 73
+KJJ43 997
+79768 569
+J7A4A 946
+Q6Q39 911
+J2Q49 202
+77229 96
+3T333 63
+49T25 912
+AA96A 676
+TT6JT 201
+999Q9 954
+T7A64 899
+JK6KK 338
+6Q77K 60
+J7TTT 260
+K2QQQ 791
+26766 703
+24QQA 843
+34333 638
+99696 769
+Q7977 952
+733JA 883
+T7AAA 128
+QQQQT 624
+523QT 347
+Q8888 337
+23Q25 602
+548KT 886
+2K9A5 100
+QAQQQ 420
+28494 486
+96A9K 868
+A66AA 623
+Q9Q9Q 658
+6QJ6K 412
+A7A6T 311
+TT8J8 984
+954A3 59
+37A8K 273
+J3QJQ 753
+97999 78
+T2279 118
+37377 281
+555J4 687
+A46K6 657
+8KAK8 429
+63643 344
+96857 797
+76644 394
+QQAAA 135
+7265T 58
+T67T3 421
+689J6 681
+J3424 720
+8KJJA 356
+5J599 416
+Q37J9 377
+4J9QQ 409
+45555 939
+A727J 646
+A65JT 981
+TT9JJ 618
+626T5 647
+74TA7 211
+6389K 824
+9QA9A 759
+J36JJ 932
+AQA7A 877
+9AAJ9 444
+AQ7AQ 4
+4JJ6J 428
+6K3K6 689
+875KJ 866
+T77TT 323
+8QJ32 612
+QQKQQ 700
+Q9444 782
+68K9J 979
+A4AAK 367
+8JA8K 288
+69QJA 540
+JQJ85 80
+82Q39 498
+74772 962
+99922 76
+KAK84 197
+66866 152
+54445 189
+57J7J 328
+3ATTT 745
+6K646 92
+T63A5 785
+3T9KA 974
+Q85QQ 770
+3KK2K 527
+8772J 473
+JAJ55 854
+7529K 844
+33493 819
+279J8 106
+4KK8J 563
+5K5K5 751
+7QK62 945
+794A7 704
+46QT2 548
+J77T7 364
+A5A5J 639
+T66TJ 382
+AA8KT 784
+K5K4A 296
+J55J5 598
+Q7Q77 985
+78774 965
+398T7 141
+9848T 771
+47584 124
+7JT47 924
+T6999 392
+977JQ 709
+T4K62 860
+7K722 362
+A7JAA 787
+4T4JJ 549
+5J92J 616
+QJT27 901
+58558 53
+555K5 851
+57457 84
+JJ842 450
+A3KAK 381
+AAQJJ 67
+985T9 378
+Q899J 737
+KA549 363
+75K2J 102
+9K9Q9 497
+33533 991
+9QK6T 743
+94652 115
+642T3 27
+4J299 730
+5KK3K 535
+9J588 748
+63472 867
+98K6A 215
+K9J4K 744
+58255 825
+99969 831
+22Q68 324
+A6665 926
+KJJAT 679
+392J7 739
+J65T6 775
+2AA8A 881
+69666 166
+Q969J 896
+22893 698
+JKK33 509
+4JJ46 779
+33222 374
+AJA22 515
+7669J 603
+73787 504
+33858 959
+34T2J 857
+TKQQ9 485
+A9T34 723
+4KQQQ 389
+JQ2Q5 112
+93T33 529
+QQ5QQ 233
+42949 507
+5K553 466
+44KKJ 1000
+6J783 42
+822A8 592
+48847 116
+AJA7T 505
+44J24 214
+55454 274
+2KA84 914
+4TT24 788
+3J553 221
+A5687 307
+73388 169
+67667 798
+992JQ 335
+Q6665 846
+K9KAK 354
+TAQ72 518
+72727 210
+99929 875
+7J777 75
+22J22 650
+6AJ5A 258
+85J4J 834
+KT2J3 462
+J59KT 461
+QQTTQ 841
+J4488 413
+JJ5K5 941
+5KQT3 733
+64Q4K 254
+4JJ77 327
+JA22K 270
+47444 850
+73956 577
+KKK33 977
+KKK3K 978
+AAAAJ 614
+Q3KQ3 371
+23J22 878
+KQ5A3 532
+K3KKA 235
+2Q48Q 481
+25A58 626
+AK7AA 810
+Q8T8Q 457
+2TT83 206
+8Q985 176
+JA54Q 436
+88J88 859
+TKTTK 890
+787AA 902
+3882J 393
+JAT77 244
+994J7 207
+Q8898 579
+J8A8A 973
+595KT 121
+7232K 718
+QA3QJ 212
+9A92A 351
+ATAJ4 669
+Q3QA3 494
+54779 159
+37J33 495
+6QQQK 943
+9KKKK 832
+T99TT 714
+K4AJ3 659
+29959 580
+KK55Q 37
+8JJ44 345
+A987J 686
+4T5JJ 544
+44KA4 247
+946Q2 234
+Q299Q 976
+QQ497 70
+6578K 31
+8J85J 469
+TT8A2 690
+JJA99 573
+K3TTT 590
+2JTQK 479
+858Q4 738
+242J2 45
+A942K 292
+4A242 431
+599K4 699
+7J579 665
+55599 482
+75Q5J 26
+99994 523
+6QQJQ 33
+65556 895
+898TA 794
+J4AA9 853
+392J9 578
+7Q333 228
+4JKTJ 558
+4443J 929
+KA5A6 944
+K29J4 433
+88788 17
+JJ737 493
+27T27 692
+97877 526
+K4848 888
+Q954A 958
+A4A44 25
+QAAAJ 419
+KKJ4T 546
+59946 140
+8T2JK 395
+237AK 253
+84Q44 553
+78788 353
+J925T 585
+JAJAA 227
+JTAAT 539
+99777 139
+TT938 213
+J6665 163
+77A55 62
+7QA5J 179
+T3K33 361
+4KJ46 773
+55A88 637
+7TJ28 684
+A77A7 719
+585AT 443
+4J92J 2
+JQQ77 110
+J2KKA 629
+AA5A8 313
+6AJAA 496
+K9KJ9 987
+QQTT8 968
+8J82T 732
+347J3 144
+22277 560
+TJKKT 302
+5Q522 229
+7K778 127
+66J66 126
+98J92 608
+JKK28 863
+96955 249
+2K5Q8 752
+K52A3 601
+93Q86 506
+93264 754
+333T8 411
+92J92 172
+22722 615
+48TQ2 476
+49524 645
+844T3 276
+99JKA 408
+92293 74
+87T92 816
+Q9A75 72
+T3TTT 18
+98888 635
+838J3 117
+222AA 741
+44446 90
+TT2J2 150
+65222 777
+999JJ 534
+2A2T6 937
+JJJJJ 10
+27A27 230
+24444 606
+87778 778
+TA8QJ 839
+5TTTT 336
+K78JT 519
+A5KA5 865
+42255 503
+99J99 908
+373J8 492
+63863 947
+5JK32 390
+33399 711
+6444K 722
+99J94 143
+82Q2Q 792
+6JQ64 555
+9Q85K 188
+K378T 960
+39268 119
+AJA2Q 1
+32333 547
+5A55Q 584
+89896 904
+22226 318
+Q292Q 511
+KKKKJ 86
+2KJK2 677
+86K35 663
+A8Q9J 403
+Q6T6Q 499
+A4JJ4 807
+8QT57 405
+7A744 385
+5K5KK 399
+64966 827
+J992J 133
+24466 154
+AAQJQ 316
+TT8TK 586
+9K7AK 587
+667JJ 910
+JQQQQ 400
+8444J 528
+4QQ4A 858
+KK598 246
+AATAT 445
+J756A 837
+TJ632 916
+T4697 913
+2J225 474
+6JKKJ 146
+57498 372
+2222A 7
+Q444A 750
+A4AAJ 660
+TQ548 876
+JJQQQ 697
+7A777 375
+QQQQ7 98
+65656 65
+57757 763
+A53K6 957
+2K8KK 191
+666K7 370
+J77TT 872
+JTT75 786
+57494 749
+648A6 887
+3982A 48
+9A2JJ 820
+KJ5T5 724
+A773A 918
+K6754 488
+8A58A 442
+88AA8 845
+K3K5J 909
+8JJ8T 123
+555AA 756
+K33J3 514
+57975 861
+386K2 167
+J9783 927
+27744 383
+2J6Q8 707
+2KQT8 823
+766J6 196
+4A499 717
+6J524 708
+744K7 683
+2Q22A 396
+3Q9T8 138
+884TJ 192
+K6898 321
+6K446 29
+85634 427
+5J588 559
+96J96 678
+KQQ3T 833
+AJ755 369
+444T4 550
+68277 267
+AJ7J4 373
+Q4Q4Q 652
+22822 582
+36K79 195
+9797T 286
+89999 460
+66J33 636
+55888 640
+53693 716
+39KJ8 762
+55K59 796
+96JKK 183
+55855 268
+J4K83 285
+KK7KK 299
+KKKKT 940
+J77J7 906
+88TTT 388
+5T54J 111
+T8QA9 806
+22K22 256
+JT228 970
+79624 322
+KKK77 69
+88JJ8 91
+A222T 132
+67JA7 312
+77767 971
+869J2 471
+9T998 595
+JA266 64
+2272T 755
+9K7J6 22
+254T5 849
+82T9J 289
+Q76TJ 331
+TQQT6 5
+77737 536
+7T783 567
+8T888 705
+6T53K 186
+Q6K57 301
+78Q78 130
+5K656 293
+33J32 339
+66J96 894
+57J53 581
+6K554 217
+KKJKJ 696
+5AAA5 789
+29429 44
+5K552 969
+8442T 928
+84444 137
+T9J48 557
+56KA8 386
+7QQ27 764
+A828A 165
+AA699 641
+79922 570
+JA5T8 407
+449QJ 651
+5555T 43
+5TK97 907
+78487 478
+QQQ55 448
+88848 938
+3J55T 99
+6J94A 16
+99K97 358
+34643 818
+226K6 88
+62226 415
+T3633 758
+K2KA9 350
+4K968 903
+9TKA4 284
+7T274 220
+TTJTT 108
+8J625 589
+JQKQQ 28
+5AJ59 209
+J779K 239
+QQQ2Q 795
+836KT 477
+A4432 8
+8998J 855
+7JJJA 882
+44646 303
+J9A2A 781
+QKKQ2 721
+Q8Q2Q 898
+6464Q 297
+T99QA 993
+82K9A 953
+36667 453
+383QQ 120
+37J49 193
+7T758 805
+J5TTT 170
+8AAJQ 36
+AT7TJ 632
+T777A 6
+833A9 917
+A254K 992
+A4QTQ 259
+88522 480
+7J3JJ 836
+5453T 366
+7J2JT 613
+AATT4 47
+K99J3 757
+567Q8 114
+A9AAA 242
+JJ343 218
+3Q66Q 87
+35A62 231
+2J924 250
+4TTQ4 430
+2QKJ8 279
+Q7555 257
+TTT7T 520
+4TT45 922
+T2375 610
+2J5QA 465
+99498 145
+TTKTQ 205
+26358 674
+66622 727
+66446 821
+6K686 975
+653Q2 963
+J2A26 772
+88288 761
+5T57T 986
+2QA9A 269
+JTT79 666
+A2KKK 571
+346JK 261
+9K9A9 3
+T3A6T 341
+22422 701
+T7KJA 838
+K4KA3 541
+A94TJ 435
+7JQ59 982
+54444 633
+4J5Q6 280
+7TAA2 365
+J52J6 447
+TT777 513
+J8789 740
+256JT 524
+AK44K 317
+K6T6K 171
+9JJ22 648
+33JAK 525
+T988T 262
+2JQQ2 685
+5T8TJ 736
+6K2J8 542
+75AT8 554
+59J5J 185
+88886 153
+J2727 734
+3K95T 562
+7J677 376
+JT4QJ 856
+923Q7 190
+T43TJ 713
+A975T 160
+4KT95 921
+63QT2 804
+ATTTT 77
+39Q99 142
+AKAAK 801
+99444 790
+59953 915
+78522 545
+63J6J 54
+4553Q 40
+A3KJ8 510
+J4449 627
+J8J48 815
+68383 923
+98889 325
+JK9KQ 61
+3653J 434
+Q8QQQ 401
+AAAAK 174
+35J55 642
+4T5JK 588
+J7QK7 439
+55A9A 966
+K2K26 800
+AKT32 304
+Q6Q6J 599
+37JJ3 418
+5227J 23
+JJ62A 440
+2K888 437
+QTQ7J 380
+3J25J 104
+46342 157
+336K7 180
+4444A 168
+AQ686 391
+TQTJQ 591
+J4456 441
+5T5T5 949
+693A4 266
+92JTJ 654
+T4QA8 768
+ATAAA 814
+KK46Q 329
+36366 951
+88348 670
+AATQQ 24
+TTQ8T 980
+56TTT 625
+99J86 668
+55552 438
+25934 675
+AJQQQ 996
+J2323 263
+9QQQA 712
+4Q7K4 360
+Q958T 308
+55542 35
+68459 164
+K5427 475
+858KK 357
+85Q75 251
+85587 596
+99K22 483
+A4555 182
+Q2337 919
+96784 900
+7J53Q 333
+6J82A 869
+4QQJ4 151
+586K5 464
+KT36J 551
+KKK84 566
+92AQ8 149
+K369Q 340
+2QQTQ 178
+J3T35 564
+K2TQ9 644
+T7TKA 655
+Q4Q44 840
+Q83TA 282
+6456T 417
+A6AAA 39
+Q74JA 237
+2222T 702
+5A444 271
+82448 222
+6TJ55 694
+56699 131
+AT936 671
+522JT 842
+45T55 200
+8AQ44 691
+6TAAT 728
+JQ245 501
+389T3 225
+33933 300
+A696A 561
+37367 343
+9KJKK 812
+388A8 611
+3TTJT 565
+T5KKT 874
+T3J9J 950
+33Q33 780
+Q2876 799
+K76T6 319
+3QT23 594
+7AA7A 621
+T7757 355
+TT44T 94
+KKK2K 397
+KKKK6 989
+AAA42 219
\ No newline at end of file
diff --git a/inputs/07a.txt b/inputs/07a.txt
new file mode 100644
index 0000000..bf2815e
--- /dev/null
+++ b/inputs/07a.txt
@@ -0,0 +1,5 @@
+32T3K 765
+T55J5 684
+KK677 28
+KTJJT 220
+QQQJA 483
\ No newline at end of file
diff --git a/src/07.cs b/src/07.cs
new file mode 100644
index 0000000..3411b2b
--- /dev/null
+++ b/src/07.cs
@@ -0,0 +1,244 @@
+using System.Diagnostics;
+using aoc2023.Util;
+using Math = System.Math;
+
+namespace aoc2023;
+
+internal class Day07 : Day
+{
+ private static readonly char[] order = new[]
+ {
+ '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A'
+ };
+
+ private Dictionary, int> hands = new();
+
+ internal override void Parse()
+ {
+ var lines = Util.Parsing.ReadAllLines($"{GetDay()}");
+ foreach (var line in lines)
+ {
+ var split = line.Split(' ');
+ List hand = new();
+ foreach (var card in split[0])
+ {
+ hand.Add(order.IndexOf(card));
+ }
+
+ hands.Add(hand, int.Parse(split[1]));
+ }
+ }
+
+ private int GetHandValue(List hand)
+ {
+ Dictionary cardCounts = new();
+ foreach (var card in hand)
+ {
+ if (!cardCounts.TryAdd(card, 1))
+ {
+ cardCounts[card]++;
+ }
+ }
+
+ // five of a kind
+ if (cardCounts.Count == 1)
+ {
+ return 7;
+ }
+
+ // four of a kind
+ if (cardCounts.Any(c => c.Value == 4))
+ {
+ return 6;
+ }
+
+ // full house
+ if (cardCounts.Count == 2 && cardCounts.ContainsValue(2) && cardCounts.ContainsValue(3))
+ {
+ return 5;
+ }
+
+ // three of a kind
+ if (cardCounts.Count == 3 && cardCounts.ContainsValue(3) && cardCounts.Count(c => c.Value == 1) == 2)
+ {
+ return 4;
+ }
+
+ // two pair
+ if (cardCounts.Count(c => c.Value == 2) == 2 && cardCounts.ContainsValue(1))
+ {
+ return 3;
+ }
+
+ // one pair
+ if (cardCounts.Count(c => c.Value == 2) == 1 && cardCounts.Count(c => c.Value == 1) == 3)
+ {
+ return 2;
+ }
+
+ return 1;
+ }
+
+ private int GetHandValuePart2(List hand)
+ {
+ Dictionary cardCounts = new();
+ int numWilds = 0;
+ foreach (var card in hand)
+ {
+ if (card == -1)
+ {
+ numWilds++;
+ }
+ else if (!cardCounts.TryAdd(card, 1))
+ {
+ cardCounts[card]++;
+ }
+ }
+
+ if (numWilds == 0)
+ {
+ return GetHandValue(hand);
+ }
+
+ // five of a kind
+ if (cardCounts.Any(c => c.Value + numWilds == 5) || numWilds == 5)
+ {
+ return 7;
+ }
+
+ // four of a kind
+ if (cardCounts.Any(c => c.Value + numWilds == 4))
+ {
+ return 6;
+ }
+
+ // full house
+ {
+ int wilds = numWilds;
+ bool hasTwo = false;
+ bool hasThree = false;
+ foreach (var cc in cardCounts)
+ {
+ if (cc.Value + wilds >= 3 && !hasThree)
+ {
+ wilds -= Math.Max(0, 3 - cc.Value);
+ hasThree = true;
+ }
+ else if (cc.Value + wilds >= 2 && !hasTwo)
+ {
+ wilds -= Math.Max(0, 2 - cc.Value);
+ hasTwo = true;
+ }
+ }
+
+ if (hasTwo && hasThree)
+ {
+ return 5;
+ }
+ }
+
+ // three of a kind
+ if (cardCounts.Any(c => c.Value + numWilds == 3))
+ {
+ return 4;
+ }
+
+ // one pair
+ if (cardCounts.Count(c => c.Value == 2) == 1 || numWilds >= 1)
+ {
+ return 2;
+ }
+
+ return 1;
+ }
+
+ private bool HandWinsTie(List hand, List other)
+ {
+ for (int j = 0; j < hand.Count; j++)
+ {
+ if (hand[j] > other[j])
+ {
+ return true;
+ }
+ if (other[j] > hand[j])
+ {
+ break;
+ }
+ }
+
+ return false;
+ }
+
+ List<(List hand, int bet, int value)> SortHands(Dictionary, int> h, Func, int> valueFunc)
+ {
+ List<(List hand, int bet, int value)> ordered = new();
+ foreach (var hand in h)
+ {
+ bool inserted = false;
+ var value = valueFunc(hand.Key);
+ for (int i = 0; i < ordered.Count && !inserted; i++)
+ {
+ if (value > ordered[i].value)
+ {
+ ordered.Insert(i, (hand.Key, hand.Value, value));
+ inserted = true;
+ break;
+ }
+
+ if (value == ordered[i].value)
+ {
+ if (HandWinsTie(hand.Key, ordered[i].hand))
+ {
+ ordered.Insert(i, (hand.Key, hand.Value, value));
+ inserted = true;
+ break;
+ }
+ }
+ }
+
+ if (!inserted)
+ {
+ ordered.Add((hand.Key, hand.Value, value));
+ }
+ }
+
+ return ordered;
+ }
+
+ internal override string Part1()
+ {
+ var ordered = SortHands(hands, GetHandValue);
+ long total = 0;
+ for (int i = 0; i < ordered.Count; i++)
+ {
+ total += (ordered.Count - i) * ordered[i].bet;
+ }
+ return $"Total winnings: <+white>{total}";
+ }
+
+ internal override string Part2()
+ {
+ Dictionary, int> handsp2 = [];
+ foreach (var hand in hands)
+ {
+ var l = new List(hand.Key);
+ for (int i = 0; i < l.Count; i++)
+ {
+ if (l[i] == order.IndexOf('J'))
+ {
+ l[i] = -1;
+ }
+ }
+ handsp2.Add(l, hand.Value);
+ }
+
+ var ordered = SortHands(handsp2, GetHandValuePart2);
+ long total = 0;
+ for (int i = 0; i < ordered.Count; i++)
+ {
+ total += (ordered.Count - i) * ordered[i].bet;
+ }
+
+ return $"Total winnings: <+white>{total}";
+ }
+}
\ No newline at end of file
diff --git a/src/Util/Extensions.cs b/src/Util/Extensions.cs
index 270796c..cec054b 100644
--- a/src/Util/Extensions.cs
+++ b/src/Util/Extensions.cs
@@ -11,4 +11,17 @@ public static class Extensions
list.Add(elem);
}
}
+
+ public static int IndexOf(this ICollection list, T elem) where T : IEquatable
+ {
+ for (int idx = 0; idx < list.Count; idx++)
+ {
+ if (list.ElementAt(idx).Equals(elem))
+ {
+ return idx;
+ }
+ }
+
+ return -1;
+ }
}