]> www.fi.muni.cz Git - aoc.git/blob - 2023/23.pl
Day 25: examining the input
[aoc.git] / 2023 / 23.pl
1 #!/usr/bin/perl -w
2
3 use v5.38;
4
5 sub valid($pat, @l) {
6         my $re = '\A[^#]*' . join('[^#]+', map { "#{$_}" } @l) . '[^#]*\z';
7         # say "$pat =~ /$re/   @l";
8         return $pat =~ /$re/;
9 }
10
11 sub walk($pat, @l) {
12         my $p = $pat;
13         my $sum = 0;
14         if ($p =~ s/\?/./) {
15                 $sum += walk($p, @l);
16                 $p = $pat;
17                 $p =~ s/\?/#/;
18                 $sum += walk($p, @l);
19         } elsif (valid($pat, @l)) {
20                 $sum = 1;
21         }
22         return $sum;
23 }
24
25 my $sum;
26 while (<>) {
27         chomp;
28         my ($pattern, $list) = split / /;
29         my @list = $list =~ /\d+/g;
30
31         my $s = walk($pattern, @list);
32         say "$pattern @list = $s";
33         $sum += $s;
34 }
35 say $sum;