]> www.fi.muni.cz Git - aoc.git/blob - 2023/32.pl
Day 25: examining the input
[aoc.git] / 2023 / 32.pl
1 #!/usr/bin/perl -w
2
3 use v5.38;
4 use experimental 'multidimensional';
5 $; = ';';
6
7 my @map = map { chomp; [ split // ] } <>;
8 my $xmax = $#{ $map[0] };
9 my $ymax = $#map;
10
11 my @dirs = ([1, 0], [0, 1], [-1, 0], [0, -1]);
12
13 my @slash = (3, 2, 1, 0);
14 my @bs    = (1, 0, 3, 2);
15
16 sub energ ($pt) {
17         my %seen;
18         my @q = $pt;
19         while (@q) {
20                 my ($x, $y, $dir) = @{ shift @q };
21                 my ($dx, $dy) = @{ $dirs[$dir] };
22
23                 $x += $dx; $y += $dy;
24                 next if $x < 0 || $y < 0 || $x > $xmax || $y > $ymax;
25
26                 next if $seen{$x,$y} && $seen{$x,$y} & (1 << $dir);
27                 $seen{$x,$y} |= (1 << $dir);
28
29                 my $pt = $map[$y][$x];
30                 if ($pt eq '-' && ($dir == 1 || $dir == 3)) {
31                         push @q, [$x, $y, 0], [$x, $y, 2];
32                 } elsif ($pt eq '|' && ($dir == 0 || $dir == 2)) {
33                         push @q, [$x, $y, 1], [$x, $y, 3];
34                 } elsif ($pt eq '/') {
35                         push @q, [$x, $y, $slash[$dir]];
36                 } elsif ($pt eq '\\') {
37                         push @q, [$x, $y, $bs[$dir]];
38                 } else {
39                         push @q, [$x, $y, $dir];
40                 }
41         }
42         return scalar keys %seen;
43 }
44
45 my $max = 0;
46
47 for (0 .. $xmax) {
48         my $cnt = energ([$_, -1, 1]);
49         $max = $cnt if $cnt > $max;
50         $cnt = energ([$_, $ymax+1, 3]);
51         $max = $cnt if $cnt > $max;
52 }
53
54 for (0 .. $ymax) {
55         my $cnt = energ([-1, $_, 0]);
56         $max = $cnt if $cnt > $max;
57         $cnt = energ([$xmax+1, $_, 2]);
58         $max = $cnt if $cnt > $max;
59 }
60
61 say $max;