4 use List::Util qw(sum);
11 my ($name, $rest) = /(\w+)\{(\S+)\}/;
13 for my $r (split /,/, $rest) {
14 my ($id, $op, $val, $rule) = $r =~ /(\w+)(?:(\W)(\d+):(\w+))?/;
15 push @rules, [ $id, $op, $val, $rule ];
17 $wfl{$name} = \@rules;
20 my @q = [ 'in', { } ];
27 my ($name, $sn, @path) = @$s;
30 next if $seen{$name}++;
39 my ($id, $op, $val, $nxt) = @$rule;
44 push @q, [ $id, \%s1, @p1 ];
49 my @p1 = (@path, [ $id, $op, $val ]);
50 push @q, [ $nxt, \%s1, @p1 ];
52 push @path, [ $id, '>', $val-1 ];
53 } elsif ($op eq '>') {
55 my @p1 = (@path, [ $id, $op, $val ]);
56 push @q, [ $nxt, \%s1, @p1 ];
57 push @path, [ $id, '<', $val+1 ];
66 for my $id (qw(a m s x)) {
67 my ($min, $max) = (1, 4000);
68 for my $cond (@$path) {
69 my ($id1, $op, $val) = @$cond;
71 if ($op eq '<' && $max > $val-1) {
74 if ($op eq '>' && $min < $val+1) {