]> www.fi.muni.cz Git - aoc.git/blob - 2023/14.pl
Day 7: not bad
[aoc.git] / 2023 / 14.pl
1 #!/usr/bin/perl -w
2
3 use v5.38;
4
5 my %cards;
6 while (<>) {
7         chomp;
8         my ($card, $bid) = split /\s+/;
9         $cards{$card} = $bid;
10         say " $card => $bid $_ " . val($card);
11 }
12
13 sub rank {
14         my $card = shift;
15         my @cards = split //, $card;
16         my %hist;
17         $hist{$_}++ for @cards;
18         return 1 if grep { $hist{$_} == 5 } @cards;
19         return 2 if grep { $hist{$_} == 4 } @cards;
20         return 3 if grep { $hist{$_} == 3 } @cards
21                 and grep { $hist{$_} == 2 } @cards;
22         return 4 if grep { $hist{$_} == 3 } @cards;
23         return 5 if (grep { $hist{$_} == 2 } @cards) == 4;
24         return 6 if grep { $hist{$_} == 2 } @cards;
25         return 7;
26 }
27
28 sub rank2 {
29         my $card = shift;
30         my @cards = split //, $card;
31         my $max_rank = rank($card);
32         for my $c (@cards) {
33                 my $c1 = $card;
34                 $c1 =~ s/J/$c/g;
35                 my $r = rank($c1);
36                 $max_rank = $r if $r < $max_rank;
37         }
38         return $max_rank;
39 }
40
41 sub val {
42         my $val = shift;
43         my $r = rank2($val);
44         $val =~ y/AKQT98765432J/ABCDEFGHIJKLM/;
45         return "$r$val";
46 }
47
48 my $i = 1;
49 my $sum;
50 for my $card (sort { val($b) cmp val($a) } keys %cards) {
51         say "$card $i ", val($card);
52         $sum += $cards{$card} * $i++;
53 }
54
55 say $sum;
56