]> www.fi.muni.cz Git - aoc.git/blob - 2023/41.pl
Day 25: examining the input
[aoc.git] / 2023 / 41.pl
1 #!/usr/bin/perl -w
2
3 use v5.38;
4 use experimental 'multidimensional';
5 $; = ';';
6
7 my @map;
8 my ($sx, $sy);
9
10 while (<>) {
11         chomp;
12         if (/S/g) {
13                 $sx = pos;
14                 $sy = $.;
15                 s/S/./;
16         }
17         push @map, [ split //, "#$_#" ];
18 }
19 my $xmax = $#{ $map[0] };
20 my $ymax = $. + 1;
21
22 push    @map, [ ('#') x ($xmax+1) ];
23 unshift @map, [ ('#') x ($xmax+1) ];
24
25 my %seen;
26
27 my @dx = (1, 0, -1, 0);
28 my @dy = (0, 1, 0, -1);
29
30 my $steps = 64;
31 my @q = ([ $sx, $sy, 0 ]);
32 while (@q) {
33         my ($x, $y, $st) = @{ shift @q };
34         # say "$x $y";
35         next if $st >= $steps;
36         for my $d (0 .. 3) {
37                 my $nx = $x + $dx[$d];
38                 my $ny = $y + $dy[$d];
39                 if ($map[$ny][$nx] eq '.') {
40                         next if $seen{$nx,$ny,$st+1}++;
41                         push @q, [ $nx, $ny, $st+1 ];
42                 }
43         }
44 }
45
46 my $sum;
47 for my $y (0 .. $ymax) {
48         for my $x (0 .. $xmax) {
49                 print $seen{$x,$y,$steps} ? 'O' : $map[$y][$x];
50                 $sum++ if $seen{$x,$y,$steps};
51         }
52         print "\n";
53 }
54 say $sum;