4 use List::Util qw(product);
12 my ($src, @dst) = /\w+/g;
13 ($types{$src}) = /^(\W)/;
14 @{ $dests{$src} } = @dst;
15 $inps{$_}->{$src} = 0 for @dst;
20 my ($mainnode) = keys %{ $inps{rx} };
25 my ($q, $name, $pulse) = @_;
26 $pulse = $pulse ? 1 : 0;
27 for (@{ $dests{$name} }) {
28 push @$q, [ $_ , $pulse, $name ];
29 if ($_ eq $mainnode && $pulse) {
31 $prev{$name} = $iters;
33 $period{$name} = $iters - $p;
34 say "$name -$pulse-> $_ $period{$name}";
36 $recv{$_}->[$pulse]++;
40 while (grep { !$period{$_} } keys %{ $inps{$mainnode} }) {
43 my @q = ([ 'broadcaster', 0, 'button' ]);
46 my ($name, $pulse, $origin) = @$p;
47 my $type = $types{$name} // '';
51 $ffs{$name} = !$ffs{$name};
52 snd(\@q, $name, $ffs{$name});
54 } elsif ($type eq '&') {
55 my $in = $inps{$name};
56 $in->{$origin} = $pulse;
58 $out *= $_ for values %$in;
59 snd(\@q, $name, !$out);
66 say product map { $period{$_} } keys %{ $inps{$mainnode} };