use v5.38;
-my %cards;
-while (<>) {
- chomp;
- my ($card, $bid) = split /\s+/;
- $cards{$card} = $bid;
- say " $card => $bid $_ " . val($card);
-}
+my %cards = map { /(\S+)/g } <>;
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;
+ $hist{$_}++ for split //, shift;
+ my %rh;
+ $rh{$_}++ for values %hist;
+ return 1 if $rh{5};
+ return 2 if $rh{4};
+ return 3 if $rh{3} && $rh{2};
+ return 4 if $rh{3};
+ return 5 if $rh{2} && $rh{2} == 2;
+ return 6 if $rh{2};
return 7;
}
return rank($val).$val;
}
-my $i = 1;
my $sum;
+my $i;
for my $card (sort { val($b) cmp val($a) } keys %cards) {
- say "$card $i ", val($card);
- $sum += $cards{$card} * $i++;
+ # say "$card $i ", val($card);
+ $sum += $cards{$card} * ++$i;
}
say $sum;
use v5.38;
-my %cards;
-while (<>) {
- chomp;
- my ($card, $bid) = split /\s+/;
- $cards{$card} = $bid;
- say " $card => $bid $_ " . val($card);
-}
+my %cards = map { /(\S+)/g } <>;
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;
+ $hist{$_}++ for split //, shift;
+ my %rh;
+ $rh{$_}++ for values %hist;
+ return 1 if $rh{5};
+ return 2 if $rh{4};
+ return 3 if $rh{3} && $rh{2};
+ return 4 if $rh{3};
+ return 5 if $rh{2} && $rh{2} == 2;
+ return 6 if $rh{2};
return 7;
}
+sub val {
+ my $val = shift;
+ my $r = rank2($val);
+ $val =~ y/AKQT98765432J/ABCDEFGHIJKLM/;
+ return $r.$val;
+}
+
sub rank2 {
my $card = shift;
- my @cards = split //, $card;
my $max_rank = rank($card);
- for my $c (@cards) {
+ for my $c (split //, $card) {
my $c1 = $card;
$c1 =~ s/J/$c/g;
my $r = rank($c1);
return $max_rank;
}
-sub val {
- my $val = shift;
- my $r = rank2($val);
- $val =~ y/AKQT98765432J/ABCDEFGHIJKLM/;
- return "$r$val";
-}
-
-my $i = 1;
my $sum;
+my $i;
for my $card (sort { val($b) cmp val($a) } keys %cards) {
- say "$card $i ", val($card);
- $sum += $cards{$card} * $i++;
+ $sum += $cards{$card} * ++$i;
+ # say "$card $i ", val($card);
}
say $sum;