]> www.fi.muni.cz Git - aoc.git/blob - 2022/24.pl
Day 25: examining the input
[aoc.git] / 2022 / 24.pl
1 #!/usr/bin/perl -w
2
3 use v5.36;
4 use strict;
5 use experimental 'multidimensional';
6
7 my @m = map { chomp; [ split // ] } <>;
8
9 my $xmax = $#{ $m[0] };
10 my $ymax = $#m;
11
12 my ($sx, $sy);
13 for my $y (0 .. $ymax) {
14         for my $x (0 .. $xmax) {
15                 if ($m[$y][$x] eq 'E') {
16                         $m[$y][$x] = 'z';
17                         $sx = $x; $sy = $y;
18                 }
19                 if ($m[$y][$x] eq 'S') {
20                         $m[$y][$x] = 'a';
21                 }
22         }
23 }
24
25 my %seen;
26 my @q = [ $sx, $sy ];
27
28 my $minp;
29
30 while (@q) {
31         my $pt = shift @q;
32         my ($x, $y, @path) = @$pt;
33
34         say "walking ", join(' ', @$pt);
35
36         my $h = $m[$y][$x];
37
38         next if $seen{"$x,$y"}++;
39
40         if ($h eq 'a') {
41                 say "FOUND";
42                 say scalar @path, ': ', @path;
43                 exit 0;
44         }
45
46         for my $pt1 ([-1, 0], [1, 0], [0, -1], [0, 1]) {
47                 my ($dx, $dy) = @$pt1;
48                 my ($nx, $ny) = ($x+$dx, $y+$dy);
49                 next if $nx > $xmax || $nx < 0 || $ny > $ymax || $ny < 0;
50                 my $h1 = $m[$ny][$nx];
51                 say "trying $nx $ny $h $h1";
52                 next if ord($h1)-ord($h) < -1;
53                 push @q, [ $nx, $ny, @path, " $nx,$ny" ];
54         }
55 }
56
57 say "Min: $minp";