]> www.fi.muni.cz Git - aoc.git/blobdiff - 2023/23.pl
Day 12: first working solution
[aoc.git] / 2023 / 23.pl
diff --git a/2023/23.pl b/2023/23.pl
new file mode 100755 (executable)
index 0000000..29c6228
--- /dev/null
@@ -0,0 +1,35 @@
+#!/usr/bin/perl -w
+
+use v5.38;
+
+sub valid($pat, @l) {
+       my $re = '\A[^#]*' . join('[^#]+', map { "#{$_}" } @l) . '[^#]*\z';
+       # say "$pat =~ /$re/   @l";
+       return $pat =~ /$re/;
+}
+
+sub walk($pat, @l) {
+       my $p = $pat;
+       my $sum = 0;
+       if ($p =~ s/\?/./) {
+               $sum += walk($p, @l);
+               $p = $pat;
+               $p =~ s/\?/#/;
+               $sum += walk($p, @l);
+       } elsif (valid($pat, @l)) {
+               $sum = 1;
+       }
+       return $sum;
+}
+
+my $sum;
+while (<>) {
+       chomp;
+       my ($pattern, $list) = split / /;
+       my @list = $list =~ /\d+/g;
+
+       my $s = walk($pattern, @list);
+       say "$pattern @list = $s";
+       $sum += $s;
+}
+say $sum;