--- /dev/null
+#!/usr/bin/perl -w
+
+use v5.38;
+
+my %cards;
+while (<>) {
+ chomp;
+ my ($card, $bid) = split /\s+/;
+ $cards{$card} = $bid;
+ say " $card => $bid $_ " . val($card);
+}
+
+sub rank {
+ my $card = shift;
+ my @cards = split //, $card;
+ my %hist;
+ $hist{$_}++ for @cards;
+ return 1 if grep { $hist{$_} == 5 } @cards;
+ return 2 if grep { $hist{$_} == 4 } @cards;
+ return 3 if grep { $hist{$_} == 3 } @cards
+ and grep { $hist{$_} == 2 } @cards;
+ return 4 if grep { $hist{$_} == 3 } @cards;
+ return 5 if (grep { $hist{$_} == 2 } @cards) == 4;
+ return 6 if grep { $hist{$_} == 2 } @cards;
+ return 7;
+}
+
+sub val {
+ my $val = shift;
+ $val =~ y/AKQJT98765432/ABCDEFGHIJKLM/;
+ return rank($val).$val;
+}
+
+my $i = 1;
+my $sum;
+for my $card (sort { val($b) cmp val($a) } keys %cards) {
+ say "$card $i ", val($card);
+ $sum += $cards{$card} * $i++;
+}
+
+say $sum;
+
--- /dev/null
+#!/usr/bin/perl -w
+
+use v5.38;
+
+my %cards;
+while (<>) {
+ chomp;
+ my ($card, $bid) = split /\s+/;
+ $cards{$card} = $bid;
+ say " $card => $bid $_ " . val($card);
+}
+
+sub rank {
+ my $card = shift;
+ my @cards = split //, $card;
+ my %hist;
+ $hist{$_}++ for @cards;
+ return 1 if grep { $hist{$_} == 5 } @cards;
+ return 2 if grep { $hist{$_} == 4 } @cards;
+ return 3 if grep { $hist{$_} == 3 } @cards
+ and grep { $hist{$_} == 2 } @cards;
+ return 4 if grep { $hist{$_} == 3 } @cards;
+ return 5 if (grep { $hist{$_} == 2 } @cards) == 4;
+ return 6 if grep { $hist{$_} == 2 } @cards;
+ return 7;
+}
+
+sub rank2 {
+ my $card = shift;
+ my @cards = split //, $card;
+ my $max_rank = rank($card);
+ for my $c (@cards) {
+ my $c1 = $card;
+ $c1 =~ s/J/$c/g;
+ my $r = rank($c1);
+ $max_rank = $r if $r < $max_rank;
+ }
+ return $max_rank;
+}
+
+sub val {
+ my $val = shift;
+ my $r = rank2($val);
+ $val =~ y/AKQT98765432J/ABCDEFGHIJKLM/;
+ return "$r$val";
+}
+
+my $i = 1;
+my $sum;
+for my $card (sort { val($b) cmp val($a) } keys %cards) {
+ say "$card $i ", val($card);
+ $sum += $cards{$card} * $i++;
+}
+
+say $sum;
+