]> www.fi.muni.cz Git - aoc.git/blob - 2023/39.pl
Day 20: examining the input
[aoc.git] / 2023 / 39.pl
1 #!/usr/bin/perl -w
2
3 use v5.38;
4 use List::Util qw(product);
5
6 my %types;
7 my %dests;
8 my %ffs;
9 my %inps;
10
11 while (<>) {
12         my ($src, @dst) = /\w+/g;
13         ($types{$src}) = /^(\W)/;
14         @{ $dests{$src} } = @dst;
15         $inps{$_}->{$src} = 0 for @dst;
16 }
17
18 my @sums = (0, 0);
19
20 sub snd {
21         my ($q, $name, $pulse) = @_;
22         for (@{ $dests{$name} }) {
23                 push @$q, [ $_ , $pulse, $name ];
24                 $sums[$pulse]++;
25         }
26 }
27
28 for (1 .. 1000) {
29         my @q = ([ 'broadcaster', 0, 'button' ]);
30         $sums[0]++;
31         while (@q) {
32                 my $p = shift @q;
33                 my ($name, $pulse, $origin) = @$p;
34                 my $type = $types{$name} // '';
35
36                 if ($type eq '%') {
37                         if (!$pulse) {
38                                 $ffs{$name} = !$ffs{$name};
39                                 snd(\@q, $name, $ffs{$name});
40                         }
41                 } elsif ($type eq '&') {
42                         my $in = $inps{$name};
43                         $in->{$origin} = $pulse;
44                         my $out = 1;
45                         $out *= $_ for values %$in;
46                         snd(\@q, $name, !$out);
47                 } else {
48                         snd(\@q, $name, 0);
49                 }
50         }
51 }
52
53 say "@sums -> ", product @sums;
54