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