use 5.38.0; package Part1; use List::AllUtils qw/ pairmap sum /; use List::UtilsBy qw/ sort_by /; sub rank_hand(@hand) { @hand = split '', shift @hand if @hand == 1; my %group; $group{$_}++ for @hand; #use DDP; p %group; return 7 if 1 == keys %group; return 6 if grep { $_ == 4 } values %group; return 5 if keys %group == 2 and grep { $_ == 3 } values %group; return 4 if grep { $_ == 3 } values %group; return 3 if keys %group == 3; return 2 if keys %group == 4; return 1; } sub handify($str) { state %map = ( 'T' => 10, 'J' => 11, 'Q' => 12, 'K' => 13, A => 14 ); my @cards = map { chr( ord('a') + $_ - 2 )} map { $map{$_} // $_ } split '', $str; return \@cards; } sub parse_input($input) { my @lines = split "\n", $input; my @hand_score = pairmap { [ handify($a), $b] } map { split " " } @lines; return @hand_score; } sub score(@hand) { join '', rank_hand(@hand), @hand; } sub solution_1 ($input) { my @hand_score = sort_by { score($_->[0]->@*) } parse_input($input); my $rank = 0; # use DDP; p @hand_score; return sum map { ++$rank * $_->[1] } @hand_score; } 1;