]> www.fi.muni.cz Git - aoc.git/blob - 2023/16.pl
5e7f823048c19a355d98e478850dfbea26230c22
[aoc.git] / 2023 / 16.pl
1 #!/usr/bin/perl -w
2
3 use v5.38;
4
5 $/ = "\n\n";
6 my %dirs;
7 my @steps = split //, scalar <>;
8 pop @steps;
9 pop @steps;
10 my $l = <>;
11 for (split /\n/, $l) {
12         my @x = /[A-Z0-9]{3}/g;
13         $dirs{$x[0].'L'} = $x[1];
14         $dirs{$x[0].'R'} = $x[2];
15 }
16
17 my %seen;
18 my %now = map { substr($_, 0, 3) . $steps[0] => 1 } grep { /^..A/ } keys %dirs;
19 my @now = keys %now;
20 say join(' ', @now);
21
22 sub walk {
23         my $node = shift;
24         my $i = 0;
25         my $n;
26         while ($node !~ /^..Z/) {
27                 $i++;
28                 $i = 0 if $i >= @steps;
29                 $node = $dirs{$node} . $steps[$i];
30         $n++;
31         }
32         return $n;
33 }
34
35 my %f;
36 use List::Util qw(product);
37 for (@now) {
38         my $st = walk($_);
39         my $l = `factor $st`;
40         $l =~ s/.*://;
41         for my $n ($l =~ /\d+/g) {
42                 $f{$n}++;
43         }
44 }
45 say product keys %f;