X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=aoc2020.git;a=blobdiff_plain;f=37.pl;fp=37.pl;h=97b548719c14c37ba329c23937683ac72323e63b;hp=0000000000000000000000000000000000000000;hb=bafab1d5fe18827b4d193a33372d0b22bb6d0c67;hpb=7a9b53e9740a2be6eac4410c791a6100a116ac3c diff --git a/37.pl b/37.pl new file mode 100755 index 0000000..97b5487 --- /dev/null +++ b/37.pl @@ -0,0 +1,49 @@ +#!/usr/bin/perl -w + +use strict; + +my %rules; +my %subrules; +my %final; + +while (<>) { + chomp; + last if /^$/; + my ($id, $rest) = /\A(\d+): (.*)\z/; + if ($rest =~ /"(.)"/) { + $final{$id} = $1; + next; + } + my @alts; + my @subalts; + for my $seq (split /\|/, $rest) { + push @alts, [ $seq =~ /(\d+)/g ]; + push @subalts, ($seq =~ /(\d+)/g); + } + $rules{$id} = \@alts; + $subrules{$id} = \@subalts; +} + +while (keys %rules) { + RULE: + for my $id (keys %rules) { + for my $subr (@{ $subrules{$id} }) { + next RULE if !defined $final{$subr}; + } + $final{$id} = '(?:(?:' . join(')|(?:', map { + join('', map { $final{$_} } @$_) + } @{ $rules{$id} }) .'))'; + print "\$final{$id} = $final{$id}\n"; + delete $rules{$id}; + } +} + +my $re = '\A'.$final{0}.'\z'; + +my $count = 0; +while (<>) { + chomp; + $count++ if ($_ =~ /$re/); +} + +print "$count matched\n";