QPKXJMLTEE4YLKJELSVSAMSQYEQDILNIOJVZUD43VOJSFN6LBS2QC K8KK6 75TAK97 1488345K 129QT45K 17077J7J 5737JJK7 796JQA74 7693T733 204KK66K 16647222 65756JTQ 5272375J 42436A63 352JJKK3 513373Q3 547TT344 9938A788 302A7AAJ 625646J4 270J448Q 635A7K7K 9829QA96 87677772 6966K77Q 516KJ33J 816A292J 3397Q77 488KKK4K 856AAQA7 511365A4 784252K2 144J88JJ 38925KKT 7544T44T 951975J9 357K7637 7993333K 9422A4JT 9295J595 75077388 656K398 830Q3K6J 605333T3 53744447 48T958Q 62448424 328A9TQ7 793T8558 83847884 38777AAA 890J569Q 61089T95 2323A633 99222JJA 651J4639 3674376K 957593Q2 165J2277 502A3AAJ 45168T9K 548AAAQT 231KK77Q 350556J5 791Q462K 421T4J44 61154T48 5188K8AT 960Q2Q82 258AA7Q7 724TTJAT 969TT889 269QA24Q 90KK727 6019Q745 418AA88 783J4852 49142454 425327A4 14598K87 604A26T7 1298Q8T 348443QK 46727478 10K75KK 566KKAQA 986T5J35 37178452 5752398Q 42683J63 42883J65 4716229T 8669K333 1089A2A9 5647767J 3063A849 8222A7K7 979QQQ7Q 2302J2QJ 8132JT3 833KJK8K 12773764 126AA4JA 7283363 36599K9K 1308KK8K 97677JK8 981JTAAA 164JAQ36 1135K5K5 183J3222 508444T4 654TKKKK 965A4A54 391TT8T2 75358J77 66984356 340TK7K4 868KJ53T 941A28J2 372Q9995 961AA55K 1757779J 3273JA6A 5465JTAA 85767768 558KJ386 539K632A 50T2TTJ 119A8TAQ 520T3K58 795K44J4 901887T7 1204J362 314TKJ3K 42344544 1533Q23Q 369A85AA 60229993 44QT4TQ 68999A99 182989J8 19045454 96246846 65974877 915A5636 60365T5J 5683J76T 2032JQQQ 704TJ856 2546665K 2206J38T 408KKKKQ 2226A55A 15543337 88833AA9 341Q7QQK 719979A7 2759QTAQ 361KTA73 448A43QQ 8782Q6J7 3059T745 13735Q58 596QK4T3 8578Q32 798T29J6 606QKQ6A 22T2T5J 1073JJK6 8499JTTT 89555855 67649A65 40727T72 8994TTT9 20177798 24927222 7735642J 83495589 8196JJ4K 4854TJ56 43796296 3594444J 58883777 663J8555 757KJKKK 52443437 216TJ6JT 1547J787 89436KKJ 288J44J9 5654KT2 921QQ9J9 92848AT6 854AT7Q6 726TTJJT 483TKAKT 36692938 6157777J 210TJ66T 7527TA77 6485693 478KK232 24288484 435JA573 529T9A65 88635Q7T 258KK86 5433343 841QA346 1856JQ66 809AJQ78 217557K7 290QQQ29 450K558K 4096J722 83244494 93122729 78932K97 67122992 697T9Q37 7448J8J8 5503367T 125AJ725 255QQA94 262A446A 49677678 650J39Q5 11089A8T 21866Q6Q 701J72KK 162T2333 5364382 17954K27 777A5T23 630Q48QQ 64422J2A 11592735 62099QQ7 68633335 181J42JJ 392T6427 1929T93 7886Q72Q 474A2AAA 404A2A6 595QJ44Q 1694453J 336777Q5 6192TTTT 977TQ95 68722Q22 7056QQ9A 5512997Q 945TTJ9J 46649J52 78526557 83988497 691TQ263 7005JA5A 4405A9KQ 202JJT8T 6852AA6A 599JKK5T 2923333A 2002T6K7 9209K4T7 46074547 9588538 29777J73 3653999 97797988 37694352 54098888 598KQAQQ 887AKAA8 806J556 629TA26A 19555595 3436T7K7 1237JT84 268K9828 879J8K6K 54323823 640KK7QJ 380AAAK4 9267JTK4 388AAKAA 24677578 913534AT 8554K5K8 582TA65T 172AAQAK 51486666 337TQTJT 7397477J 4256TA8 5852QK2Q 587K938A 86749449 31955255 6479AAAA 623K4KK5 974KQJ7Q 7816T985 487553A3 439AA5AJ 987QJ333 874TJJJT 211AJ9J7 4649TK48 433JJ6J6 192TT44T 664799AA 196A8A94 7827Q777 732Q3Q99 88T3A65 66122442 88172277 2343KJ36 225J3336 5978JTJK 903QQ43Q 277Q5TKJ 583AQTAQ 95568888 892TAT5A 55744772 82738338 44296669 312766J7 412TK89T 71333233 591A99K9 15044Q33 289Q5585 525T3KK 161J8J4T 517KK8K 4752QAJ5 943TTQ6Q 7034Q56T 375834K9 173TTT5Q 354272JA 975J54Q5 4906QK26 949947KK 6424AAA4 463K796Q 678QQA93 1687JJ39 31157779 504K6JKJ 92555775 1584JA45 535Q8323 560A5J74 940QQQ6J 1606A3J4 953A5256 4696TTTA 677Q3366 8655T55T 4273QQ3Q 414AAQ9K 265T6535 745892A 845KK775 980A738Q 4466K5AQ 924K5359 214TQ968 61487A97 5074A4T3 988QQAQ2 28044934 385QTJAJ 422AA2A2 186QKA94 4448TK42 565J2JA6 751K2TAK 2272Q5T7 62623722 1784Q2QQ 968Q2Q42 43277774 6959KKJ9 330ATJ49 935T3682 82857757 21366949 572495JA 294K5KJ5 68233K3A 198462Q2 766KQJKK 55AQA98 20788887 43KK84K 1048K8KA 958QJ9QQ 734K444 6415JK5A 1497J99K 756AT799 737QJ2Q3 413392J2 87122JJ9 984TTTAA 167AJ2AA 64382QK6 53878877 77493JQ8 10392522 57854446 42936A87 3812Q573 9162323A 5104AK85 228266J2 7649KT2 49Q324J 346J3843 708T9399 7853QQ5 59299922 32993669 3543344 66796J22 63833633 3946666Q 717J2242 825T879K 91A8A22 25326QQ2 4783732 6222K5J 553T6628 379J333J 3226KK8T 7092Q6J2 94422J2T 417QQK4Q 679T993T 7623666T 634J43T2 850A96KQ 988KK8 377T67JK 967AKQQJ 660K222T 767AAAQQ 27247474 237JJ999 403J6666 247TT7TJ 3732A932 28488837 9545Q555 880Q888Q 456528A2 57044642 273262Q6 28375595 80658443 3684464A 2083833T 462AAAAQ 20K6873 3703879A 82473J26 71872JJ5 776AA9A9 652K6646 18436J66 6828T88 7905QJ55 2382A2A2 221J22J2 7423JK89 6689TT29 6568K256 522J8666 8058869J 9666K333 3456A99A 728TTA32 25966776 244K64 187AAAJJ 143TT22T 684955K5 71TT2J2 72978J94 28788568 665372JT 59433J88 454K3257 910J5K3K 45T6TT6 10524972 58685J84 4614TJ45 6183957Q 846K2572 995K4J8K 864KKKK3 362488Q4 75864JKK 476Q2Q7J 182856J 152T994T 552JA45A 4044444A 4367JA2T 477J58JT 62873J28 948Q8T42 86349977 922J444J 205T2769 4207JT38 13A8AAA 599JA92 587A77A 69067686 6558TJJA 731AAAQ9 252QQJ24 794T99T6 52549994 99199669 98KT54K 633QAQQA 88994TQ8 38262266 275J999 248Q3333 3532A2AQ 159TA759 73353544 32537Q6A 188KK4J4 11144Q73 3234K67A 1577K7K7 313JKKJK 73633573 7643333J 4843TTJ3 52QK6J 3045Q37K 637KQ476 6656688 602KTAQ 612K4J99 534A4A73 1000A5A55 5333TQ36 31TJQQT 3179AJQT 67477797 946QJ827 55469K99 4435847A 4107888J 692Q5J58 21977357 8355QJ3 7064347K 2399A9A 3089T73K 828Q456 5175QQQQ 2156T22T 7637A82K 459J5588 7709J9JT 333889A8 2359AK74 131A52J8 4867AJJ7 418J5A2J 90236633 93234543 98555355 92388478 29688666 7616266K 616595Q8 989A52KA 45844467 7482T7T7 627TT25T 76536725 191KQKKT 84088828 1666JJ 493TT58K 481KKTKJ 37J9333 2823677J 3984Q94 393J8JJJ 6583QJQJ 7409378Q 54956KK6 3386J363 542AJKKA 3108J8KK 792QKA5J 69944646 808TA6K7 43076677 2639Q987 498A69J9 96K3J2K 8984A7T8 46877494 693JATA8 23342K64 180QJQ62 128JK2KK 990A7AAA 900QK874 860J4KK5 532Q842Q 84448JA2 97865565 662AJT8Q 114KAJKK 20622J22 4693999 4526677K 50055378 62342J 8913KKKJ 132J9999 80237373 6225J459 482AK648 177Q52K6 226AAJ64 318999T9 56148JK3 72267265 7308KQQK 872QA579 398522KK 1655522 68055765 324835T7 3156359K 38K2QQ8 787TTT86 734777A7 5766T866 136K43Q6 47958588 27123323 29JKAK2 14A6936 4999T92K 905ATT28 851J64K9 5032TAK5 96374875 1383T553 670755J7 3845KK5Q 351TT4TT 842K6K22 5012K222 8078Q62J 52636K2K 2959TTKT 580ATT9J 495882Q9 78622Q25 146Q3TJ9 632453TT 3992A92A 303A2J6A 81355235 34KTTJJ 3262282T 2869Q63T 8118333A 688J4554 241K7K33 82138427 646T9956 55649J94 1003K887 36335T7A 109A722A 5415A525 4412T252 6395QAJ7 117A44Q4 1228297J 47332A4K 633A5JA 5302AJA7 147KAATK 710AAQJQ 49464968 212A4J58 33264944 397ATQ68 343TTJ 30195559 733393 10155Q8Q 9176QQQQ 698AT59A 1999AQ89 4577J744 267888J8 300KJ888 581AA557 257T9TTT 89345458 804JQ529 694J8AA9 636KQJTK 820T8A88 997A25A2 912676QJ 707QQ7AQ 224595A9 959778J8 286562A 4654K99T 908Q5Q56 71567K77 749T2AJQ 3167QQKK 140739AQ 720325J8 209TTKKK 135T8688 8777KKKJ 33442444 291QQQT9 29895999 34722225 1934J9JQ 15J66QT 1069TT2T 716888Q8 5599JJ8T 276Q5Q5Q 479997 245335AJ 7118867J 673476K8 907J4343 431822J6 8JQ5Q5 56289999 492JTK2J 607J46AT 102A6AA8 569J6J7J 76892949 8859Q4J7 972K9499 40669A83 589J8K8J 914K7A5K 8754277 937523JJ 383J7295 139QQQQT 14278JA7 455Q86T7 521Q3393 74744J49 2797682A 897T2322 25044484 44787435 800A863A 306QT8T 489AAKAK 3208Q272 6089676T 240QQQJT 801QQ77Q 189TTTT3 344J339Q 1787878 6217QTJQ 84TA663 14155554 23688696 256K22AT 3319586K 5793A453 2176A85 1765AJTJ 449T4T7Q 34954AA5 8107JQ8T 94799333 3787QQ33 2426622 681T3KT5 4808A8JQ 299KJ9QQ 401JAQ39 858847AA 8188QQJ2 952A333A 4004J489 3074JKKJ 51562222 77194787 94J955J 950QJQ3T 577TA3A3 197Q8T39 121TAAAA 6002KJJJ 81222822 613J6888 26065667 536A75AK 741997Q7 7129QA44 497A27KA 194776JQ 339577T7 40233342 930J4A53 9183A3AA 4532QQ22 772TJTT3 11K2KKK 9386TTQ6 28139923 7354Q44Q 843Q5Q55 321T3T5A 434QQQ7J 852T974Q 574777K8 54546466 8534KA53 584T3Q3J 396QJJQQ 5095Q9J7 26639QQQ 80322242 6925545 416JJ555 64977337 6664T5K7 83152K4J 567555A5 5745335 26144644 124JJJJJ 171J9J64 35566466 229K4268 356Q33Q3 725TKTTT 99986A86 86933JKK 973T69TT 904T64K3 8237T7TT 7807Q478 7606T625 738KKKK9 3098AQ75 983QT39Q 92KK82K 55522J27 72784948 15689T67 927T8AAK 133Q3A72 778Q2822 8835J552 4119K9A6 505999J6 35862A5A 118Q6464 826AJ666 934Q8KKK 223AT3J8 964J7A96 8293AK5K 86168TQ3 360T8Q88 919AA24A 544TJTTT 26482686 41545J9J 9358Q7T 796Q665 25155556 631TTT43 239J9595 746AJAAA 64898899 77974AJA 67589398 419JQA5T 59095K3J 70A4AAA 836A7J7A 6133TQ4 243Q9983 75934K5Q 26TJ77T 723Q3937 174A3259 609KA24J 528K56T3 151459KT 34266566 79723A84 32JJ383 8969J222 4056J764 86244K4K 29387Q94 677A923 8155J58J 8149487A 870QKQQQ 438396JT 51944ATA 374TK77J 395A29AA 445A2ATA 998J9292 390979Q9 9395A2QT 683977J9 653TJA3Q 1127J689 817QQ677 859J3J63 873Q28Q3 994A55JJ 523K7462 36465596 4709Q45J 956ATT2T 506TK4QQ 875AA5AA 74328693 7142J786 74589T77 51294474 8843Q626 86J742K 837636KK 278TA4TT 571JQQQQ 5638283Q 996Q42K3 77TTTT6 911JTJ3J 835555J5 847J779K 24435775 909TQQ99 1348A8Q8 16336325 335A9886 38625T37 97124A86 882A9KAK 936KQ7Q3 53169666 8939369 6724J666 755252Q5 7752TJA8 93356566 6457QA92 5933KKQK 617AQ896 90699992 721JTQ9J 848K5KKK 97043TAA 702KQ97A 47224A44 274TK2J7 116K6666 9948845 285
const std = @import("std");const PATH = "input/day07.txt";pub fn first(allocator: std.mem.Allocator) !usize {const hands = try First.parseInput(allocator, @embedFile(PATH));defer allocator.free(hands);std.mem.sort(First.Hand, hands, {}, First.Hand.lessThan);var ret: usize = 0;for (hands, 1..) |hand, i| {ret += hand.bid * i;}return ret;}pub fn second(allocator: std.mem.Allocator) !usize {const hands = try Second.parseInput(allocator, @embedFile(PATH));defer allocator.free(hands);std.mem.sort(Second.Hand, hands, {}, Second.Hand.lessThan);var ret: usize = 0;for (hands, 1..) |hand, i| {ret += hand.bid * i;}return ret;}const BidType = u16;const HandType = enum {high_card,one_pair,two_pair,three_of_a_kind,full_house,four_of_a_kind,five_of_a_kind,};const First = struct {const Card = enum { @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", T, J, Q, K, A };const Hand = struct {cards: [5]Card,bid: BidType,type: HandType,fn getType(self: @This(), allocator: std.mem.Allocator) !HandType {var map = std.AutoHashMap(Card, u3).init(allocator);defer map.deinit();for (self.cards) |card| {const res = try map.getOrPut(card);if (res.found_existing) res.value_ptr.* += 1 else res.value_ptr.* = 1;}switch (map.count()) {1 => return .five_of_a_kind,2 => {var it = map.valueIterator();while (it.next()) |v| {if (v.* == 4) return .four_of_a_kind;}return .full_house;},3 => {var it = map.valueIterator();while (it.next()) |v| {if (v.* == 3) return .three_of_a_kind;}return .two_pair;},4 => return .one_pair,5 => return .high_card,else => unreachable,}unreachable;}fn lessThan(context: void, a: @This(), b: @This()) bool {_ = context;if (@intFromEnum(a.type) < @intFromEnum(b.type)) {return true;} else if (@intFromEnum(a.type) > @intFromEnum(b.type)) {return false;} else {for (0..5) |i| {if (@intFromEnum(a.cards[i]) < @intFromEnum(b.cards[i])) {return true;} else if (@intFromEnum(a.cards[i]) > @intFromEnum(b.cards[i])) {return false;}}}unreachable;}};fn parseInput(allocator: std.mem.Allocator, input: []const u8) ![]Hand {var hands = std.ArrayList(Hand).init(allocator);var lines = std.mem.splitScalar(u8, input, '\n');while (lines.next()) |line| {if (line.len == 0) break;var hand: Hand = undefined;var cb = std.mem.tokenizeScalar(u8, line, ' ');for (cb.next().?, 0..) |ch, i| {switch (ch) {'2' => hand.cards[i] = .@"2",'3' => hand.cards[i] = .@"3",'4' => hand.cards[i] = .@"4",'5' => hand.cards[i] = .@"5",'6' => hand.cards[i] = .@"6",'7' => hand.cards[i] = .@"7",'8' => hand.cards[i] = .@"8",'9' => hand.cards[i] = .@"9",'T' => hand.cards[i] = .T,'J' => hand.cards[i] = .J,'Q' => hand.cards[i] = .Q,'K' => hand.cards[i] = .K,'A' => hand.cards[i] = .A,else => unreachable,}}hand.bid = try std.fmt.parseUnsigned(BidType, cb.next().?, 10);hand.type = try hand.getType(allocator);try hands.append(hand);}return hands.toOwnedSlice();}};const Second = struct {const Card = enum { J, @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", T, Q, K, A };const Hand = struct {cards: [5]Card,bid: BidType,type: HandType,fn getType(self: @This(), allocator: std.mem.Allocator) !HandType {var map = std.AutoHashMap(Card, u3).init(allocator);defer map.deinit();for (self.cards) |card| {if (card == .J) continue;const res = try map.getOrPut(card);if (res.found_existing) res.value_ptr.* += 1 else res.value_ptr.* = 1;}for (self.cards) |card| {var it = map.valueIterator();if (card == .J) {while (it.next()) |v| {v.* += 1;}}}switch (map.count()) {0, 1 => return .five_of_a_kind,2 => {var it = map.valueIterator();while (it.next()) |v| {if (v.* == 4) return .four_of_a_kind;}return .full_house;},3 => {var it = map.valueIterator();while (it.next()) |v| {if (v.* == 3) return .three_of_a_kind;}return .two_pair;},4 => return .one_pair,5 => return .high_card,else => unreachable,}unreachable;}fn lessThan(context: void, a: @This(), b: @This()) bool {_ = context;if (@intFromEnum(a.type) < @intFromEnum(b.type)) {return true;} else if (@intFromEnum(a.type) > @intFromEnum(b.type)) {return false;} else {for (0..5) |i| {if (@intFromEnum(a.cards[i]) < @intFromEnum(b.cards[i])) {return true;} else if (@intFromEnum(a.cards[i]) > @intFromEnum(b.cards[i])) {return false;}}}unreachable;}};fn parseInput(allocator: std.mem.Allocator, input: []const u8) ![]Hand {var hands = std.ArrayList(Hand).init(allocator);var lines = std.mem.splitScalar(u8, input, '\n');while (lines.next()) |line| {if (line.len == 0) break;var hand: Hand = undefined;var cb = std.mem.tokenizeScalar(u8, line, ' ');for (cb.next().?, 0..) |ch, i| {switch (ch) {'2' => hand.cards[i] = .@"2",'3' => hand.cards[i] = .@"3",'4' => hand.cards[i] = .@"4",'5' => hand.cards[i] = .@"5",'6' => hand.cards[i] = .@"6",'7' => hand.cards[i] = .@"7",'8' => hand.cards[i] = .@"8",'9' => hand.cards[i] = .@"9",'T' => hand.cards[i] = .T,'J' => hand.cards[i] = .J,'Q' => hand.cards[i] = .Q,'K' => hand.cards[i] = .K,'A' => hand.cards[i] = .A,else => unreachable,}}hand.bid = try std.fmt.parseUnsigned(BidType, cb.next().?, 10);hand.type = try hand.getType(allocator);try hands.append(hand);}return hands.toOwnedSlice();}};test "day07a" {try std.testing.expectEqual(@as(usize, 248453531), try first(std.testing.allocator));}test "day07b" {try std.testing.expectEqual(@as(usize, 248781813), try second(std.testing.allocator));}const test_input =\\32T3K 765\\T55J5 684\\KK677 28\\KTJJT 220\\QQQJA 483;