]> www.fi.muni.cz Git - aoc2020.git/blob - 37.pl
Task 9 Perl Golf-style
[aoc2020.git] / 37.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4
5 my %rules;
6 my %subrules;
7 my %final;
8
9 while (<>) {
10         chomp;
11         last if /^$/;
12         my ($id, $rest) = /\A(\d+): (.*)\z/;
13         if ($rest =~ /"(.)"/) {
14                 $final{$id} = $1;
15                 next;
16         }
17         my @alts;
18         my @subalts;
19         for my $seq (split /\|/, $rest) {
20                 push @alts, [ $seq =~ /(\d+)/g ];
21                 push @subalts, ($seq =~ /(\d+)/g);
22         }
23         $rules{$id} = \@alts;
24         $subrules{$id} = \@subalts;
25 }
26
27 while (keys %rules) {
28         RULE:
29         for my $id (keys %rules) {
30                 for my $subr (@{ $subrules{$id} }) {
31                         next RULE if !defined $final{$subr};
32                 }
33                 $final{$id} = '(?:(?:' . join(')|(?:', map {
34                         join('', map { $final{$_} } @$_)
35                         } @{ $rules{$id} }) .'))';
36                 print "\$final{$id} = $final{$id}\n";
37                 delete $rules{$id};
38         }
39 }
40
41 my $re = '\A'.$final{0}.'\z';
42
43 my $count = 0;
44 while (<>) {
45         chomp;
46         $count++ if ($_ =~ /$re/);
47 }
48
49 print "$count matched\n";